三思考,实现自己定义404页:Tomcat、SpringMVC精确匹配、重写DispatchServlet

第1种方式:Tomcat直接处理

web.xml

<error-page>
    <error-code>404</error-code>
    <location>/error/404.htm</location>
</error-page>  

这样的仅仅能展示纯静态的页面,很不灵活。

第2种方式:利用Spring MVC的最精确匹配

@Controller
public class UrlNotFoundController {
	@RequestMapping("*")
	public String test404(){
		//TODO
		return "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

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

时间: 2024-10-21 14:32:13

三思考,实现自己定义404页:Tomcat、SpringMVC精确匹配、重写DispatchServlet的相关文章

三种思路实现自定义404页面:Tomcat、SpringMVC精准匹配、重写DispatchServlet

第1种方式:Tomcat直接处理 web.xml <error-page> <error-code>404</error-code> <location>/error/404.htm</location> </error-page> 这种只能展示纯静态的页面,非常不灵活. 第2种方式:利用Spring MVC的最精确匹配 @Controller public class UrlNotFoundController { @Request

三种思路实现自定义404页面

如何定义404 404,说白了就是找不到页面,那么如何定义"找不到"呢? 我们可以通过源代码来看看Spring MVC如何定义"404"的: // Determine handler for the current request. mappedHandler = getHandler(processedRequest, false); if (mappedHandler == null || mappedHandler.getHandler() == null)

Apacheserver自己定义404页面的两种方法以及.htaccess的重要命令总结

Apacheserver自己定义404错误页面有两种方法: 第一种方法最简单,直接在Apache的httpd.conf下进行配置改动命令,改动的内容请參看.htaccess命令写法中的自己定义错误页面 另外一种方法能够在.htaccess文件里配置命令,详细操作请參看.htaccess命令写法中的自己定义错误页面 .htaccess用法总结 1 . 首先让的本地APACHEserver器同意.htaccess改动 打开httpd.conf (1) Options FollowSymLinks A

Phalcon处理404页面的 Ruter 方法

/** * Initializes the router * * @param array $options */ protected function initRouter($options = array()) { $config = $this->di['config']; $this->di['router'] = function () use ($config) { $router = new PhRouter(false); $router->notFound( array

JBPM学习(三):管理流程定义

概念: ProcessDefinition,流程定义:一个流程的步骤说明,如一个请假流程.报销流程.是一个规则. ProcessDefinition,流程定义对象,是解析.jpdl.xml文件得到流程步骤的信息.没有更新操作,启动流程实例时是使用指定key的最新的版本. 1.部署流程定义 a)一次添加一个资源,相关文件在Classpath中 // 1,部署流程定义(添加) // jbpm4_deployment // jbpm4_deployprop // jbpm4_lob @Test pub

ajax json 表格排序,分页,自己定义每页数量

ajax json 表格排序.分页,自己定义每页数量 ?点击表头能够排序.依照升序或者降序,另外支持多列排序 设置每页数量 演示 ? XML/HTML Code <table?id='example3'>?? ?? <thead>?? <tr>?? ?<th>ID</th>?? ?<th>First?name</th>?? ?<th>Last?name</th>?? ?<th>Grade

Nginx反向代理+Tomcat+Springmvc获取用户访问ip

Nginx+Tomcat+Springmvc获取用户访问ip 1.Nginx反向代理 修改Nginx配置文件 location / { ***********之前代码*******; proxy_set_header host $host; proxy_set_header X-forwarded-for $proxy_add_x_forwarded_for;//设置代理服务器ip头,代码获取时的参数 proxy_set_header X-Real-IP $remote_addr; //允许将发

tomcat配置管理(三):基于多实例的tomcat配置管理

tomcat简介 有时候,我们希望周期性的更新Tomcat:有时候,我们又想统一管理安装在一台机器上的tomcat(比如让tomcat版本统一,让多个实例的tomcat的依赖统一.配置统一等).在这些场景下,我们都不希望把Web应用程序的文件放入Tomcat发行版的目录结构中,而是让一个tomcat运行多个实例,并把Web应用放在tomcat的安装目录之外. 一般在使用Tomcat时,服务器会从conf及webapps目录中读取配置文件,并将文件写入logs.temp和work目录,当然一些ja

Lvs + Ngnix + Haproxy + Keepalived + Tomcat 实现三种HA软负载均衡和Tomcat Session共享

环境准备: 一.11台测试机器 hostname:v1 ~ v10   (10台测试机) ip:192.168.33.81(v1) ~ 192.168.33.90(v101) 由于在内网测试,需要搭建个内网yum源,方便安装软件.yum所在机器为192.168.33.101 二.待实现功能 下面分别使用haproxy/nginx/lvs实现HA + 负载均衡,软件环境如下: v1:33.81 nginx v2:33.82 nginx v3:33.83 tomcat v4:33.84 tomcat