博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
三种思路实现自定义404页面:Tomcat、SpringMVC精准匹配、重写DispatchServlet
阅读量:7218 次
发布时间:2019-06-29

本文共 3060 字,大约阅读时间需要 10 分钟。

hot3.png

第1种方式:Tomcat直接处理
web.xml
404
/error/404.htm
这种只能展示纯静态的页面,非常不灵活。
第2种方式:利用Spring MVC的最精确匹配
@Controllerpublic class UrlNotFoundController {	@RequestMapping("*")	public String test404(){		//TODO		return "404Page";	}}
在网上找到这样的方法,利用SpringMVC的精确匹配,从而在其它Controller找不到对应请求的时候,来处理404。
但是,这种方式也有问题,只能拦截一部分。
比如,如果有这个一个Controller
@Controller("/home")public class HomeController{@RequestMapping("a")	public String a(){      //	}}
直接访问:  ,会被UrlNotFoundController处理。
但是 ,就不会被UrlNotFoundController处理。
这说明,通过精准匹配也是有局限性的。
第3种方式:自定义org.springframework.web.servlet.DispatcherServlet,重载noHandlerFound方法。
theDispatcher
base.web.MyDispatchServlet
contextConfigLocation
classpath:spring/spring-mvc-servlet.xml
fileNotFondUrl
/error/404
1
theDispatcher
/
public class MyDispatchServlet extends DispatcherServlet {	private static final long serialVersionUID = 1L;	private static final UrlPathHelper urlPathHelper = new UrlPathHelper();		private String fileNotFondUrl = "/error/404.html";		public void noHandlerFound(HttpServletRequest request, HttpServletResponse response) throws Exception {		if (pageNotFoundLogger.isWarnEnabled()) {			String requestUri = urlPathHelper.getRequestUri(request);			pageNotFoundLogger.warn("No mapping found for HTTP request with URI [" + requestUri +					"] in DispatcherServlet with name '" + getServletName() + "'");		}			response.sendRedirect(request.getContextPath() + fileNotFondUrl);	}	public String getFileNotFondUrl() {		return fileNotFondUrl;	}	public void setFileNotFondUrl(String fileNotFondUrl) {		this.fileNotFondUrl = fileNotFondUrl;	}		}
默认的DispatchServlet的noHandlerFound方法。
protected void noHandlerFound(HttpServletRequest request, HttpServletResponse response) throws Exception {
if (pageNotFoundLogger.isWarnEnabled()) {
String requestUri = urlPathHelper.getRequestUri(request);
pageNotFoundLogger.warn("No mapping found for HTTP request with URI [" + requestUri +
"] in DispatcherServlet with name '" + getServletName() + "'");
}
response.sendError(HttpServletResponse.SC_NOT_FOUND);
}
直接返回HTTP404。
特别需要说明的是:
  自定义之后,不能再使用
  <!-- <mvc:default-servlet-handler /> -->
  
  通常情况下,使用这个配置,可以让SpringMVC相应js、css等静态页面,在合适的路径,自动去找。
  注释之后,就只能手动响应静态资源等请求了。
  2种方式:
  第1种:Tomcat处理。
  配置
default
/static/*
  
  第2种:SpringMVC处理
  <mvc:resources mapping="/kindeditor/upload/image/**"
location="file:${kindeditorImagePath}/kindeditor/upload/image/**" />
  
  如果使用了“<mvc:default-servlet-handler />”
// Determine handler for the current request.
mappedHandler = getHandler(processedRequest, false);
if (mappedHandler == null || mappedHandler.getHandler() == null) {
noHandlerFound(processedRequest, response);
return;
}
  DispatchServlet上述代码的mappedHandler就不为空了,因此无法进入noHandlerFound方法。
  
  参考资料:

转载于:https://my.oschina.net/jiutianniao/blog/399768

你可能感兴趣的文章
MySQL 用户连接与用户线程
查看>>
RabbitMq、ActiveMq、Kafka和Redis做Mq对比
查看>>
C# 图片处理(压缩、剪裁,转换,优化)
查看>>
Linux bridge-utils tunctl 使用
查看>>
Leetcode Pascal&#39;s Triangle II
查看>>
运行shell脚本报错 &#39;\357\273\277&#39;: command not found 解决的方法
查看>>
android studio 0.8.1使用和遇到问题解决
查看>>
云服务器ECS选购集锦之六区域选择帮助
查看>>
云虚机选购指南之二云虚拟主机试用帮助文档
查看>>
女友眼中的IT男
查看>>
Excel连接
查看>>
java基础-多线程学习
查看>>
WPF打印原理,自定义打印
查看>>
HTML5 5
查看>>
箭头css
查看>>
Python入门,以及简单爬取网页文本内容
查看>>
顺丰科技笔试回忆
查看>>
excel技巧
查看>>
通用防SQL注入漏洞程序(Global.asax方式)
查看>>
服务器进程为何通常fork()两次
查看>>