我有一个过滤器,在我的例子中它是SessionFilter,它在 doFilter() 方法中有一些自定义逻辑来验证请求,在验证此请求的过程中我正在执行数据库操作。当我部署在Weblogic环境中时,它工作正常。但是当我在 WebSphere 环境中部署相同的应用程序时遇到问题。根据我的要求, doFilter() 应该只执行一次,它发生在网络逻辑中,但不在网络领域中。过滤器在处理请求之前和处理 Web 领域的请求之后被调用两次。我知道这是 servlet api 规范的预期行为。但为什么 Weblogic 中没有发生这种情况呢?成功验证请求后,我通过调用 chan.doFilter() 来允许请求。一旦成功,它就不应该调用相同的逻辑来验证请求。但在网络领域,这种情况正在发生。为什么同一应用程序在两台服务器中表现不同?
Hi Following is my filter configuration in web.xml..
<filter>
<filter-name>sessionFilter</filter-name>
<filter-class>com.abc.filter.SessionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sessionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
以下是不完全是 doFilter() 代码。但情况类似。
public void doFilter(final ServletRequest req, final ServletResponse res,
final FilterChain chain) throws ServletException {
//Do some db operation
if (!success){
response.sendRedirect("/../../login.jsp");
return;
}
chain.doFilter(req, res);
}//doFilter
}
最佳答案
您正在使用映射到所有网址 (/*
) 的 Filter
。
并且在您的过滤器中,您可以选择执行重定向:
response.sendRedirect("/../../login.jsp");
现在,如果您的过滤器应该调用所有 URL,那么在其中重定向到相对 URL 是一个非常糟糕的主意。根据调用/请求的 URL,重定向到的相对 URL 将有所不同。在这种情况下,您应该使用绝对 URL 进行重定向,例如“/pages/login.jsp”
。这也可能解释了对过滤器的不同调用次数之间的一些差异。
关于java - 为什么 Web 逻辑和 WebSphere 中的过滤器行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25863059/