我有一个过滤器,在我的情况下是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
}

最佳答案

您正在使用一个Filter映射到所有URL(/*)。

在过滤器中,您可以选择进行重定向:

response.sendRedirect("/../../login.jsp");


现在,如果应该对所有URL调用过滤器,那么在其中重定向到相对URL是一个非常糟糕的主意。根据调用/请求的URL,重定向到的相对URL将有所不同。在这种情况下,您应该使用绝对网址进行重定向,例如"/pages/login.jsp"。这也可以解释对过滤器的不同数量的调用之间的差异。

08-18 06:04