为什么Servlet过滤器会导致工作应用程序出错

时间:2014-11-19 13:59:09

标签: java servlets servlet-filters

在工作应用程序中,已经放置了Servlet过滤器。但是,此过滤器会导致现有应用程序出错。

目前,为了概念验证,过滤器只记录,没有实现任何代码。

未发现任何例外情况。 在Tomcat访问日志中,唯一的线索是资源返回304

[18/Nov/2014:17:18:34 -0500] 10.93.161.0 (0ms) 52D40EF309A3EB46F1C5DE3FB1D063BD.application.1 GET /secure/application/application/sc/skins/Enterprise/images/Window/window_TL.png HTTP/1.1 : 304

如上所述,没有过滤器,应用程序可以正常工作。

当过滤器到位时,日志显示过滤器正在记录,但应用程序将无法正常工作,过滤器似乎在某种程度上干扰,我们不希望任何干扰,除了doFilter方法中实现的代码。

以下是web.xml中的过滤器声明

    <filter>
    <filter-name>SessionFilter</filter-name>
    <filter-class>com.company.filter.SessionFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>SessionFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

以下是过滤器类

public class SessionFilter implements Filter{

    private  static final Log LOG = LogFactory.getLog(SessionFilter.class);

    @Override
    public void destroy() {
        LOG.info("SessionFilter destroyed.");
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain arg2) throws IOException, ServletException {
        LOG.info("SessionFilter is filtering.");
        LOG.info("Test Session");
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        LOG.info("SessionFilter initialized.");
    }

}

请让我知道任何想法。

谢谢

2 个答案:

答案 0 :(得分:1)

您需要继续过滤器链。将其添加到&#34; doFilter&#34;的末尾。方法

...
// request filtered
arg2.doFilter(req, res);
// response filtered
...

答案 1 :(得分:1)

FilterdoFilter()方法中,您必须转发链上的请求,否则其他过滤器将不会被叫,请求不会转发到Servlet

Qutoing形成Filter.doFilter()的javadoc:

  

此方法的典型实现将遵循以下模式: -

     
      
  1. 检查请求
  2.   
  3. 可选择使用自定义实现包装请求对象,以过滤输入过滤的内容或标题
  4.   
  5. 可选择使用自定义实现包装响应对象以过滤内容或标题以进行输出过滤
  6.   
  7. a)要么使用FilterChain对象(chain.doFilter())调用链中的下一个实体,
  8.   
  9. b)不将请求/响应对传递给过滤器链中的下一个实体以阻止请求处理
  10.   
  11. 在调用过滤器链中的下一个实体后直接在响应上设置标头。
  12.   

这样做:

chain.doFilter(request, response);

Filter系统以这种方式实施的原因是因为Filter可能决定打破链条,例如因为发回错误;或者Filter可以包装请求和/或响应,并且必须将此包装器转发到其他过滤器和servlet。

如果不调用chail.doFilter(),则表明您不希望Servlet容器中有其他过滤器和servlet参与请求。