0

だから私はインターセプターを書いているので、ユーザーがログに記録されずにページにアクセスしようとすると、ログインに送り返されます。また、リソース (css、画像、js) をインターセプトします。では、フィルタを変更するにはどうすればよいですか?? これが私のコードです:

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
        throws IOException, ServletException {
     try {
        // check whether session variable is set
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        boolean estaLoggeado = false;
        if (req.getSession().getAttribute("estaLoggeado") != null) {
            estaLoggeado = new Boolean("" + req.getSession().getAttribute("estaLoggeado"));
        }
        //  allow user to proccede if url is login.xhtml or user logged in or user is accessing any page in //public folder
        String reqURI = req.getRequestURI();
        System.out.println(reqURI);
        System.out.println("index: " + reqURI.indexOf("/index.xhtml"));
        System.out.println("pages: " + reqURI.indexOf("/pages/"));
        System.out.println("resources: " + reqURI.contains("javax.faces.resource"));
        System.out.println("log: " + estaLoggeado);
        if ((reqURI.indexOf("/index.xhtml") >= 0 || reqURI.indexOf("/pages/") >= 0 || reqURI.contains("javax.faces.resource"))) {
            System.out.println("Si");
            chain.doFilter(request, response);
        } else {   // user didn't log in but asking for a page that is not allowed so take user to login page
            System.out.println("No");
            res.sendRedirect(req.getContextPath() + "/pages/index.xhtml");  // Anonymous user. Redirect to login page
        }
     } catch(Throwable t) {
        System.out.println(t.getMessage());
    }
} //doFilter

前もって感謝します!!

4

1 に答える 1

1

ブロックをチェックestaLoggeadoインするのを忘れました。if()つまり、ユーザーがログインしているかどうかを実際に確認することはありません。ユーザーがログインしているかどうかを標準出力に出力しているだけです。

全体として、このフィルターのロジックはやや不器用です。これらの URI のチェックは非常に貧弱です (実質的に とまったく同じであるcontains()ことに注意してください)。その部分が URL の最初、中間、または最後にある場合はどうなりますか? 正確な/開始/終了の一致を実行する必要があります。indexOf(part) >= 0contains(part)

ここに書き直します:

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {    
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;
    HttpSession session = request.getSession(false);
    String loginURL = request.getContextPath() + "/pages/index.xhtml";

    boolean loggedIn = (session != null) && (session.getAttribute("estaLoggeado") != null);
    boolean loginRequest = request.getRequestURI().equals(loginURL);
    boolean resourceRequest = request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER + "/");

    if (loggedIn || loginRequest || resourceRequest)) {
        chain.doFilter(request, response); // So, just continue request.
    }
    else {
        response.sendRedirect(loginURL); // So, redirect to login page.
    }
}

estaLoggeado(補足として、user(または、英語以外の人がコードを読めないようにする必要がある場合は)を置き換えることをお勧めしusuarioます。これにより、役に立たない「フラグ」ではなく、ユーザー全体を表すようになります)

これは ajax リクエストをカバーしていないことに注意してください。JSF ajax フォームの送信中にセッションが期限切れになると、リダイレクトが失敗し、視覚的なフィードバックがありませんでした。より拡張されたフィルターについては、この回答に進んでください:セッション有効期限の承認リダイレクトは、JSF フォームの送信では機能しません。ページは同じままです。

于 2013-10-31T18:42:34.020 に答える