当FORWARD用于JSF中的映射时,Servlet Filter进入无限循环

时间:2011-02-05 07:40:02

标签: jsp jsf servlet-filters servlet-dispatching

我在web.xml中定义了一个过滤器,如下所示: -

<filter-mapping>
    <filter-name>AuthenticationFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>ERROR</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
</filter-mapping>
<filter>
    <display-name>AuthenticationFilter</display-name>
    <filter-name>AuthenticationFilter</filter-name>
    <filter-class>com.filters.AuthenticationFilter</filter-class>
</filter>

并在过滤器中我有以下代码: -

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  // TODO Auto-generated method stub
  // place your code here

  HttpServletRequest httpRequest = (HttpServletRequest) request;
  HttpServletResponse hres = (HttpServletResponse) response;


  String pathInfo = httpRequest.getRequestURI().trim();

  System.out.println(pathInfo);

  // Do not process any non-jsp files or LogIn.jsp  ! pathInfo.endsWith("jsf") || 
  if (pathInfo.endsWith("RegistrationForm.jsf") || pathInfo.endsWith("Login.jsf")) {
   chain.doFilter(request, response);
   return;
  }
  // pass the request along the filter chain
  User user = (User) httpRequest.getSession().getAttribute("USER_IN_SESSION");
  if(user==null)
   hres.sendRedirect("Login.jsf");
  else {
   chain.doFilter(request, response);

  }

 }

问题是,如果我使用Topic.jsp调用应用程序,它会像这样循环: -

Topic.jsp
LogIn.jsf
Login.jsp
Login.jsf
Login.jsp
...

我发现问题是映射中的FORWARD。如果删除此条目,则可以使用

<dispatcher>FORWARD</dispatcher>

请帮助我解决无限循环交替 .jsp&amp;的这个幻想.jsf :)

2 个答案:

答案 0 :(得分:1)

理论值:

  1. Topics.jsp需要验证,所以a 重定向到LogIn.jsf。

  2. LogIn.jsf由。提供 FacesServlet的。但页面是 包含面孔真的是一个jsp 页。所以servlet是一个前锋 到LogIn.jsp(构建它的页面) 组件树)。

  3. 在您的过滤器中,路径为LogIn.jsp,您不验证 请求LogIn.jsp,所以你要求 身份验证和重定向到 LogIn.jsf再次生成。转到第2步。

  4. 因此,如果删除,则将FacesServlet从LogIn.jsf转发到LogIn.jsp不会进入循环。

    快速解决方案:将LogIn.jsp添加到if语句中的路径信息列表中。

答案 1 :(得分:1)

首先,为什么你想要挂钩forward / include / error派遣以及(默认)全局和所有 - 覆盖request

删除过滤器映射中的所有<dispatcher>行。您不需要其中任何一个用于身份验证筛选器。 HTTP请求是唯一重要的。内部转发/包含/错误分派只能在HTTP请求到达(并过滤)时发生。

此外,您还可以将请求URI映射到更具体的<url-pattern> {@ 1}}上,而不是对请求URI进行检查,并将所有需要登录的页面放在那里并放置在外面注册和登录页面。