gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:39:55 25 4
gpt4 key购买 nike

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

}

请让我知道任何想法。

谢谢

最佳答案

FilterdoFilter() 方法中你必须链接转发链上的请求,否则其他过滤器将不会被调用,请求也不会转发到Servlet .

引用Filter.doFilter()的javadoc :

A typical implementation of this method would follow the following pattern:-

  1. Examine the request
  2. Optionally wrap the request object with a custom implementation to filter content or headers for input filtering
  3. Optionally wrap the response object with a custom implementation to filter content or headers for output filtering
  4. a) Either invoke the next entity in the chain using the FilterChain object (chain.doFilter()),
  5. b) or not pass on the request/response pair to the next entity in the filter chain to block the request processing
  6. Directly set headers on the response after invocation of the next entity in the filter chain.

这样做:

chain.doFilter(request, response);

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

如果您不调用 chail.doFilter(),则表明 Servlet 容器您不希望在处理请求时涉及其他过滤器和 servlet。

关于java - 为什么 Servlet 过滤器会导致工作应用程序出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27018729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com