4

ユーザーがすでにログインしている場合に、ユーザーをホームページにリダイレクトする方法。ログインページに Filter クラスを使用していますが、正しく動作しません。私のコードは次のとおりです。

@WebFilter(filterName = "loginFilter",
urlPatterns ={"/login.xhtml"})
public class LoginFilter implements Filter{

    private FilterConfig filterconfig;
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterconfig = filterconfig;
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest httprequest =(HttpServletRequest) request;
        HttpServletResponse httpresponse =(HttpServletResponse) response;
        try{
        if(httprequest.getUserPrincipal() != null){

            System.out.printf("User authenticated with " + httprequest.getRemoteUser() + " username conected.");
            httprequest.getRequestDispatcher("/home.xhtml").forward(request, response);
        } else{
            chain.doFilter(request, response);
        }
        }catch(Exception){
            //do something
        }

    }

    @Override
    public void destroy() {
        System.out.print("Existing from loginFilter");
    }

}

ここに私の問題があります:ユーザーがWebにログインし、ナビゲーションなどを行い、ログアウトせずにブラウザーの戻るボタンを使用してログインページに戻り、ユーザー名パスワードを再度入力してからログインボタンを押します。次に、例外 IndexOutofBoundsException をスローします。ユーザーがリンクまたはブラウザーの戻るボタンを使用してログインページに移動し、ホームページにリダイレクトするタイミングを確認するだけです。なにか提案を?

4

2 に答える 2

3

ログインページをキャッシュしないようにブラウザに指示するだけです。に応答をキャストした直後に、次の行をフィルターに追加しますhttpresponse

httpresponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
httpresponse.setHeader("Pragma", "no-cache"); // HTTP 1.0.
httpresponse.setDateHeader("Expires", 0); // Proxies.

そうしないと、ブラウザは、フィルターをトリガーする必要があるサーバーの完全な要求を送信する代わりに、[戻る] ボタンでキャッシュからページを提供します。

于 2013-01-11T13:08:58.207 に答える