簡體   English   中英

使用Servlet過濾器和j_security_check登錄時出現無限循環

[英]Endless loop when logging in with Servlet Filter and j_security_check

我已經實現了ServletFilter並在web.xml中聲明了它,但是問題是我現在無法登錄。 用戶提交其用戶名和密碼,該代碼重定向到j_security_check頁面,然后無休止地重新加載logon.html。 在兩次都擊中代碼doFilter(req,res)的情況下,從未使用過用於發送回logon.html的sendRedirect代碼。

我還缺少其他元素嗎? 我讀過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>

嘗試像這樣逆轉過濾條件。

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

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

“重定向”是一個全新的請求。 它將響應發送到用戶的瀏覽器,告訴它獲取新的URL; 因此,該新請求將一次又一次地點擊您的過濾器。

您可以測試所請求的URI是否為“ logon.html”,是否僅為“ doFilter”,或者轉發請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM