Servlet Filter работает в бесконечном цикле, когда FORWARD используется в отображении в JSF - PullRequest
1 голос
/ 05 февраля 2011

У меня есть фильтр, определенный в 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 & .jsf :)

Ответы [ 2 ]

1 голос
/ 07 февраля 2011

Прежде всего, почему вы хотите подключить forward / include / error диспетчеризацию также рядом с (по умолчанию) глобальной и всеобъемлющей request?

Избавьтесь от всех этих <dispatcher> строк в вашем отображении фильтра. Вам не нужно ни одного из них для фильтра аутентификации. HTTP-запросы являются единственными, которые учитываются. Внутренние рассылки forward / include / error могут выполняться только тогда, когда HTTP-запрос уже получен (и отфильтрован).

Кроме того, вместо этой проверки URI запроса можно также сопоставить фильтр с более конкретным <url-pattern>, например /secured/* или около того, и поместить все страницы, для которых требуется вход в систему, и разместить страницу регистрации и входа в систему. снаружи.

1 голос
/ 05 февраля 2011

Теория:

  1. Topics.jsp требует проверки, поэтому выполняется перенаправление в LogIn.jsf.

  2. LogIn.jsf обслуживаетсяпо FacesServlet.Но страница, которая связывается с лицами, на самом деле является страницей jsp.Таким образом, сервлет пересылает файл LogIn.jsp (страницу, на которой строится дерево компонентов).

  3. В вашем фильтре путь - LogIn.jsp, и вы не проверяетезапросите LogIn.jsp, чтобы вы запросили аутентификацию, и перенаправление в LogIn.jsf производится снова.Перейдите к шагу 2.

Поэтому, если вы удалите, пересылка FacesServlet из LogIn.jsf в LogIn.jsp не будет включена в цикл.

Быстрыйрешение: добавьте LogIn.jsp в список информации о пути в вашем операторе if.

...