2017-07-25 9 views
0

私はログインフィルタを簡単に実装しています。ログインフィルタjavaサーブレット

public class LoginFilter implements Filter { 

     @Override 
     public void init(FilterConfig filterConfig) throws ServletException {} 

     @Override 
     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); 
      if (session == null || session.getAttribute("loggedInUser") == null) { 
       response.sendRedirect(request.getContextPath() + "/login.jsp"); 
      } else { 
       chain.doFilter(request, response); 
      } 
     } 

     @Override 
     public void destroy() {} 

    } 

私はセッション属性loggedInUserなしで登録されているすべてのページ(すなわち。/account?id=1)に行くとき、フィルタが正常に動作します。私はログインページにリダイレクトされます。 しかし、存在しないページ(つまり、/blablabla.html)に行くと、フィルタは再びログインページにリダイレクトされます。存在しないページに入ると404エラーが発生し、/loginにリダイレクトする方法はありますか?

答えて

2

ゲストにアクセスを拒否するすべてのリクエストをフィルタリングしますが、依然としてリクエストが処理されるようにするには404というバグがあります。これは概念的に間違っています:404という意味では依然として応えていますユーザーにはシステム内部のビューが表示されるため、ユーザーは何かがあるかどうかを知る前に認証を受ける必要があります。 ...

  • /private/customer/123
  • /private/oder/8932
  • ...

    • /public/style.css
    • /public/app.js
    • 別のオプションは、パブリックとプライベートゾーンに自分のアプリを分割されます

    プライベートゾーンでリクエストをフィルタリングするだけです。

    注:URLの美しさが気になる場合は、/private/接頭辞は必須ではありません。フィルタは、任意の接頭辞を省略することができるように添付することができます。

  • 0

    フィルタは着信要求または応答をフィルタするためのもので、実際にはこのような流れです。

    クライアント----->要求---->フィルタ---->サーブレットdispather ---->リソース

    はだから今、残念ながら要求であるにかかわらず、フィルタによってインターセプトされませんリソースが存在するかどうかは、サーブレットディスパーザがリクエストを取得してリソースが存在しないことを認識する前に発生します。

    この説明はあなたの質問に答えることができます。

    ありがとうございました。

    関連する問題