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

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

第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方法。
  
  參考资料:

版权声明:本文博主原创文章。博客,未经同意不得转载。

你可能感兴趣的文章
洛谷 1373 小a和uim之大逃离
查看>>
一不小心把win10的秘钥卸载了解决方法
查看>>
SilverLight之向后台请求数据-WebClient
查看>>
HDU Problem 1260 Tickets 【dp】
查看>>
STL map容器常用API
查看>>
队列的顺序存储---顺序队列
查看>>
Delphi 读取 c# webservice XML的base64编码图片字符串转化图片并显示
查看>>
第三天
查看>>
connector for python
查看>>
等价类划分的应用
查看>>
Web Service(下)
查看>>
trigger()
查看>>
nvm 怎么安装 ?
查看>>
Java VM里的magic
查看>>
[Node.js]Domain模块
查看>>
Linux操作系统文档
查看>>
利用Tensorflow训练自定义数据
查看>>
c++官方文档-枚举-联合体-结构体-typedef-using
查看>>
[题解]UVA11029 Leading and Trailing
查看>>
利用vue-gird-layout 制作可定制桌面 (一)
查看>>