【问题标题】:Why Servlet filter causing error in working application为什么 Servlet 过滤器在工作应用程序中导致错误
【发布时间】:2015-01-17 01:58:46
【问题描述】:

在一个工作的应用程序中,已经放置了一个 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.");
    }

}

请告诉我任何想法。

谢谢

【问题讨论】:

  • 发布您的过滤代码。
  • 同意@icza。此外,请尝试清除浏览器缓存并重试。告诉我们在这种情况下会发生什么。
  • 好的,谢谢。过滤代码已发布

标签: java servlets servlet-filters


【解决方案1】:

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

引用Filter.doFilter()的javadoc:

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

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

这样做:

chain.doFilter(request, response);

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

如果您不调用chail.doFilter(),则向 Servlet 容器表明您不想让其他过滤器和 servlet 参与处理请求。

【讨论】:

  • 感谢您的帮助!
【解决方案2】:

您需要继续过滤器链。将此添加到“doFilter”方法的末尾。

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

【讨论】:

    猜你喜欢
    • 2021-01-12
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 2021-07-03
    相关资源
    最近更新 更多