2017-02-14 10 views
3

JSF 2.2 и Primefaces 6.0слишком много перенаправлений с использованием класса фильтра

Я пытаюсь использовать класс фильтра для контроля сеанса аутентификации. Но класс фильтра работает 21 раз, а сообщение об ошибке браузера ERR_TOO_MANY_REDIRECTS.

web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    version="3.0"> 
    <display-name>maintenancemonitoring</display-name> 
    <context-param> 
     <param-name>javax.faces.DEFAULT_SUFFIX</param-name> 
     <param-value>.xhtml</param-value> 
    </context-param> 
    <context-param> 
     <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description> 
     <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
     <param-value>client</param-value> 
    </context-param> 
    <context-param> 
     <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name> 
     <param-value>resources.application</param-value> 
    </context-param> 
    <listener> 
     <listener-class>com.sun.faces.config.ConfigureListener</listener-class> 
    </listener> 
    <filter> 
     <filter-name>authFilter</filter-name> 
     <filter-class>view.filters.AuthenticationFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>authFilter</filter-name> 
     <url-pattern>*.xhtml</url-pattern> 
     <dispatcher>REQUEST</dispatcher> 
    </filter-mapping> 
    <context-param> 
     <param-name>javax.faces.PROJECT_STAGE</param-name> 
     <param-value>Development</param-value> 
    </context-param> 
    <context-param> 
     <param-name>primefaces.THEME</param-name> 
     <param-value>cupertino</param-value> 
    </context-param> 
    <welcome-file-list> 
     <welcome-file>index.xhtml</welcome-file> 
    </welcome-file-list> 
</web-app> 

Класс фильтра:

public void 
     doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, 
                             ServletException { 
    HttpServletRequest request = (HttpServletRequest) servletRequest; 
    request.setCharacterEncoding("UTF-8"); 
    HttpServletResponse response = (HttpServletResponse) servletResponse; 
    HttpSession session = request.getSession(); 

    System.out.println("aaaaa"); 

    String currentLoginId = null; 
    if(session.getAttribute("currentLoginId")!=null){ 
     currentLoginId = (String) session.getAttribute("currentLoginId"); 
    } 

    if(currentLoginId != null){ 
     setResponseHeaders(response); 
     filterChain.doFilter(request, response); 
    } else { 
     response.sendRedirect(request.getContextPath() + "/faces/login.xhtml"); 
    } 
} 

private void setResponseHeaders(HttpServletResponse httpResponse) { 
    httpResponse.addHeader("Pragma", "no-cache"); 
    httpResponse.addHeader("Cache-Control", "no-cache"); 
    httpResponse.addHeader("Cache-Control", "must-revalidate"); 
    httpResponse.addHeader("Cache-Control", "post-check=0"); 
    httpResponse.addHeader("Cache-Control", "pre-check=0"); 
    httpResponse.addHeader("Cache-Control", "no-store"); 
    httpResponse.addDateHeader("Expires", 0); 
} 

Войти действие в loginBean:

public String actionLogin(ActionEvent actionEvent) throws ServletException, IOException { 
    HttpServletRequest request = (HttpServletRequest) getExternalContext().getRequest(); 
    HttpServletResponse response = (HttpServletResponse) getExternalContext().getResponse(); 

    AuthUser user = getValidUser(); 

    request.setAttribute("user", user); 

    if (user == null) { 
     addMessage("Kullanıcı adı ya da şifre hatalı"); 
     return null; 
    } 

    return handleUserLogin(user, request, response); 
} 

Создать сессию в классе loginHandler:

private String createNewSessionAndRedirect(HttpServletRequest request, HttpServletResponse response, AuthUser user) { 
    HttpSession session = getSessionForRequest(request); 

    session.setAttribute("currentLoginId", user.getUserName()); 

    if (request.isRequestedSessionIdValid() && session != null && session.getAttribute("currentLoginId") != null) { 
     try { 
      response.sendRedirect(request.getContextPath() + "/faces/welcome.xhtml"); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    return "/welcome.xhtml"; 
} 
+1

Вы должны проверить с момента перенаправления 'response.sendRedirect (request.getContextPath() +" /faces/login.xhtml ");' соответствовать фильтру, если это не делает рекурсивный вызов. – AxelH

+0

Я исправил тегирование в вопросе ypur. Пожалуйста, отметьте его лучше в следующий раз – Kukeltje

+0

Примечание: вы должны добавить Stacktrace, когда вы получите исключение – AxelH

ответ

4

Причина, по которой я вижу эту ошибку, - это рекурсивный вызов.

Поскольку вы фильтруя каждую .xthml страницы и в фильтре вы перенаправление

response.sendRedirect(request.getContextPath() + "/faces/login.xhtml"); 

Вы filtrering самого этого переназначения. Вы должны отправить запрос вместо этого, так как вы установили фильтр для работы на REQUEST, но не на FORWARD.

<filter-mapping> 
    <filter-name>authFilter</filter-name> 
    <url-pattern>*.xhtml</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
</filter-mapping> 

Переднее выглядит следующим образом (не точно, не помню точный код в фильтре ...):

ServletContext.getRequestDispatcher("/faces/welcome.xhtml").forward() 

Переднее будет только фильтр, если добавить к <dispatcher>FORWARD</dispatcher> filter-mapping

+0

Также посмотрите этот пост о том, как исключить определенные URL-адреса из перенаправленных (фильтрованных): http://stackoverflow.com/questions/3125296/can-i-exclude-some-concrete-urls-from-url-pattern -inide-filter-mapping – dognose

+0

@ действительно, без достаточной информации, я просто не думал о более общем исключении. Это другой ответ, который я считаю. – AxelH