我有一个Filter,在我的例子中是SessionFilter,它在doFilter()方法中有一些自定义逻辑来验证请求,在验证这个请求的过程中我正在做db操作。我在Weblogic环境中部署时工作正常。但是当我在WebSphere环境中部署相同的应用程序时面临问题。根据我的要求,doFilter()应该只执行一次,它发生在Web逻辑中但不在Web领域中。过滤器在处理请求之前和在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
}
答案 0 :(得分:1)
您正在使用Filter
映射到所有网址(/*
)。
在您的过滤器中,您可以选择重定向:
response.sendRedirect("/../../login.jsp");
现在,如果您的过滤器应该调用所有URL,那么它内部重定向到相对URL是一个非常糟糕的主意。根据调用/请求的URL,重定向到的相对URL将不同。在这种情况下,您应该使用绝对URL进行重定向,例如"/pages/login.jsp"
。这也可能解释了对过滤器的不同调用次数之间的差异。