2016-08-31 23 views
0

servletFilterを実装してweb.xmlに宣言しましたが、今問題はできません。ユーザーはユーザー名とパスワードを送信し、コードはj_security_checkページにリダイレクトされ、logon.htmlを無限に再読み込みします。コードdoFilter(req、res)は両方の時間にヒットし、logon.htmlに送り返されたsendRedirectコードは決して使用されません。サーブレットフィルタとj_security_checkでログインするときの無限ループ

もう1つの要素がありますか?私はそのサーブレットのフィルタを読んで、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"を実行するか、またはリクエストを転送することができます。

関連する問題