1

JSFアプリケーションで以下のログアウトアルゴリズムを使用しました。ユーザーがログアウトでき、セッションが終了します。

ただし、私の問題は、ユーザーがログインページにリダイレクトされても、ブラウザーの戻るボタンを押しても、以前のデータを表示できることです。

@ManagedBean
@RequestScoped
public class LogoutBean {
  public String logout() {
    String result="/faces/pages/public/login.xhtml?faces-redirect=true";

    FacesContext context = FacesContext.getCurrentInstance();
    HttpServletRequest request = (HttpServletRequest)context.getExternalContext().getRequest();

    try {
      request.logout();
    } catch (ServletException e) {
        log.info("Error during logout!");
    }
    return result;
  }
}

上記のロジックを使用して、ブラウザがページの有効期限が切れていることを表示するようにこれを構成する方法はありますか?

4

1 に答える 1

5

戻るボタンに再度表示させたくないページのブラウザキャッシュを無効にする必要があります。これを行うには、これらのページの応答ヘッダーに必要なパラメーターを設定するサーブレットフィルターを作成します。

@WebFilter(servletNames={"Faces Servlet"})
public class NoCacheFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        if (!req.getRequestURI().startsWith(req.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc)
            res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
            res.setHeader("Pragma", "no-cache"); // HTTP 1.0.
            res.setDateHeader("Expires", 0); // Proxies.
        }

        chain.doFilter(request, response);
    }

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

    @Override
    public void destroy() {
    }
}

このように、ユーザーがブラウザの戻るボタンを押すと、サーバーからページが再度要求されます。

于 2012-11-07T10:41:31.370 に答える