2016-08-31 68 views
0

我已經實現了servletFilter並在我的web.xml中聲明瞭它,但問題是我現在無法登錄。用戶提交他們的用戶名和密碼,代碼重定向到j_security_check頁面,然後無休止地重新加載logon.html。在代碼中doFilter(req,res)同時被點擊,用於發送回logon.html的sendRedirect代碼從不使用。使用Servlet過濾器和j_security_check登錄時出現無盡循環

是否還有其他元素遺失?我讀過這個servlet過濾器和j_security_check不總是玩的很好,但我想我可以找到解決辦法。

代碼:

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 

    HttpServletRequest request = (HttpServletRequest) req; 
    HttpServletResponse response = (HttpServletResponse) res; 
    HttpSession session = request.getSession(false); 

    String loginURI = request.getContextPath() + "/logon.html"; 
    String securityURI = request.getContextPath() + "/j_security_check"; 

    boolean loggedIn = session != null && session.getAttribute("user") != null; 
    boolean securityRequest = request.getRequestURI().equals(securityURI); 
    boolean loginRequest = request.getRequestURI().equals(loginURI); 

    if (loggedIn || loginRequest || securityRequest) { 
     chain.doFilter(req, res); 
    } else { 
     response.sendRedirect(loginURI); 
    } 
} 

所以代碼檢查該請求從登錄頁或頁j_security_check未來並處理的doFilter如果它們。這是工作,但我不知道爲什麼它不處理通過應用程序,如果它通過兩次?

的web.xml:

<session-config> 
    <session-timeout>1</session-timeout> 
</session-config> 

<filter> 
    <filter-name>servletFilter</filter-name> 
    <filter-class>org.t.s.w.AuthServletFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>servletFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

回答

1

嘗試在這樣的過濾器逆轉你的病情。

if (!loggedIn || !loginRequest || !securityRequest) { 
    response.sendRedirect(loginURI); 
} else { 
    chain.doFilter(req, res); 
} 
+0

這工作!爲什麼這個工作? –

+0

您只是通過逆轉狀態來打破無限循環。 – lsiva

1

問題很簡單。您的過濾器鏈正在捕獲所有請求,包括對logon.html的請求。當篩選器發現用戶未登錄時,它將重定向到「logon.html」。

「重定向」是一個全新的請求。它向用戶的瀏覽器發送一個響應,告訴它獲取一個新的URL;因此,新的請求會再次觸發您的過濾器,並再次......再次發生。

您可以測試請求的URI是否爲「logon.html」,如果是這樣,只是「doFilter」,或者可能請求轉發。