三种思路实现自定义404页面:Tomcat、SpringMVC精准匹配、重写DispatchServlet
来源:互联网 发布:centos7 bugzilla端口 编辑:程序博客网 时间:2024/06/04 21:46
第1种方式:Tomcat直接处理
web.xml
<error-page> <error-code>404</error-code> <location>/error/404.htm</location> </error-page>
这种只能展示纯静态的页面,非常不灵活。
第2种方式:利用Spring MVC的最精确匹配
@Controllerpublic class UrlNotFoundController {@RequestMapping("*")public String test404(){//TODOreturn "404Page";}}
在网上找到这样的方法,利用SpringMVC的精确匹配,从而在其它Controller找不到对应请求的时候,来处理404。
但是,这种方式也有问题,只能拦截一部分。
比如,如果有这个一个Controller
@Controller("/home")public class HomeController{@RequestMapping("a")public String a(){ //}}
直接访问: http://localhost:8080/b.html,会被UrlNotFoundController处理。
但是http://localhost:8080/home/b.html,就不会被UrlNotFoundController处理。
这说明,通过精准匹配也是有局限性的。
第3种方式:自定义org.springframework.web.servlet.DispatcherServlet,重载noHandlerFound方法。
<servlet><servlet-name>theDispatcher</servlet-name><servlet-class>base.web.MyDispatchServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring/spring-mvc-servlet.xml</param-value></init-param><init-param><param-name>fileNotFondUrl</param-name><param-value>/error/404</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>theDispatcher</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
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处理。
配置
<servlet-mapping><servlet-name>default</servlet-name><url-pattern>/static/*</url-pattern></servlet-mapping>
第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方法。
参考资料:http://blog.csdn.net/u012345283/article/details/39718245
2 0
- 三种思路实现自定义404页面:Tomcat、SpringMVC精准匹配、重写DispatchServlet
- 三种思路实现自定义404页面
- SpringMVC的DispatchServlet源码解析
- SpringMVC原理 以及dispatchServlet详解
- 自定义Tomcat 404错误页面
- tomcat 虚拟目录自定义404页面
- Spring mvc DispatchServlet 实现机制
- 使用SpringMVC时添加了web.xml中的DispatchServlet配置后出现Tomcat服务器无法启动的问题
- springmvc 自定义异常页面
- SpringMVC自定义错误页面
- SpringMVC源码之DispatchServlet请求处理
- SpringMVC容器的DispatchServlet初始化(未完。。)
- tomcat之定义404页面,自定义tomcat默认访问页面
- 如何自定义Tomcat 404错误页面
- 如何自定义Tomcat 404错误页面
- Tomcat 设置自定义的 404 错误页面
- tomcat虚拟目录自定义404错误页面
- Tomcat自定义错误页面
- scanf的各种用法小结
- 机器学习Python实现 SVD 分解
- QML - 动态柱状图
- 素数筛选
- nginx 变量 获取 ngx_http_script_run 详解
- 三种思路实现自定义404页面:Tomcat、SpringMVC精准匹配、重写DispatchServlet
- dom4j
- Android app结构
- MongoDB Sharding集群部署
- C#配置文件加密
- UML建模——使用EA工具开发时序图实践及经验
- 20150317 实习之——余世维视频(上)
- 可变参数列表函数实现
- 多线程运行同步锁synchronize的一些实战心得