使用Tomcat 7.相关的web.xml
部分如下所示:
<filter>
<filter-name>Filter</filter-name>
<filter-class>my.company.Filter</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<error-page>
<error-code>404</error-code>
<location>404.jsp</location>
</error-page>
Filter
的代码如下(简化):
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
System.out.println("Filter start");
chain.doFilter(request, response);
System.out.println("Filter finish");
}
404.jsp看起来像这样(非常简化):
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
System.out.println("404 here");
%>
打开一个不存在的页面(如/foobar
)的stdout输出是这样的:
Filter start
Filter finish
404 here
因此,换句话说,当Tomcat确定不存在不存在的页面时,Filter
正确运行。但是在渲染404页面之后,它立即被包裹在Filter
中。否则,404页面将很好地呈现,Filter
正确应用于所有其他(非转发)JSP。
如果我直接访问404.jsp,则Filter
已正确应用。只有在我访问一些缺少的JSP的情况下才会首先调用Filter
(参见上面的日志),然后才评估404.jsp - 但不包含在Filter
中。
如何让过滤器包裹404.jsp呢?
答案 0 :(得分:1)
您需要阅读servlet规范的第6.2.5节。
您的映射等同于
<filter-mapping>
<filter-name>Filter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
至少你想要:
<filter-mapping>
<filter-name>Filter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
因此,过滤器映射适用于错误页面以及正常请求。
其他调度程序设置可用。
答案 1 :(得分:-1)
404.jsp有response.setStatus(404);
。容器调用此页面来处理404状态,因此无需再次设置它。