重定向后Tomcat没有应用过滤器(转发?)

时间:2017-06-23 09:31:19

标签: java tomcat

使用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呢?

2 个答案:

答案 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状态,因此无需再次设置它。