[英]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.