Фильтр сервлетов работает в бесконечном цикле, когда FORWARD используется в отображении в JSF
У меня есть фильтр, определенный в 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 ответа
Теория:
Topics.jsp требует проверки, поэтому производится перенаправление в LogIn.jsf.
LogIn.jsf обслуживается FacesServlet. Но страница, которая касается лиц, на самом деле является страницей jsp. Таким образом, сервлет пересылает файл LogIn.jsp (страницу, которая создает дерево компонентов).
В вашем фильтре путь - LogIn.jsp, и вы не проверяете запрос на LogIn.jsp, поэтому вы запрашиваете аутентификацию и снова производится перенаправление на LogIn.jsf. Переходите к шагу 2.
Таким образом, если вы удалите, пересылка FacesServlet из LogIn.jsf в LogIn.jsp не входит в цикл.
Быстрое решение: добавьте LogIn.jsp в список информации о пути в вашем операторе if.
Прежде всего, почему вы хотите зацепить forward
/include
/error
отправления также рядом с (по умолчанию) глобальной и всеобъемлющей request
?
Избавиться от всех тех <dispatcher>
линии в вашем отображении фильтра. Вам не нужно ни одного из них для фильтра аутентификации. HTTP-запросы являются единственными, которые учитываются. Внутренние рассылки forward/include/error могут выполняться только тогда, когда HTTP-запрос уже получен (и отфильтрован).
Кроме того, вместо этой проверки URI запроса вы также можете сопоставить фильтр с более <url-pattern>
лайк /secured/*
или так и поместите все страницы, которые требуют входа в систему, и разместите страницу регистрации и входа снаружи.