为什么Web逻辑和WebSphere中的Filter行为不同

时间:2014-09-16 07:34:43

标签: java filter websphere weblogic

我有一个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
}

1 个答案:

答案 0 :(得分:1)

您正在使用Filter映射到所有网址(/*)。

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

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

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