Halaman Keluar dan Kedaluwarsa JSF

Saya menggunakan algoritma logout di bawah ini dalam aplikasi JSF saya dan ini berfungsi karena pengguna dapat logout dan sesi dihentikan.

Namun, masalah saya adalah meskipun pengguna diarahkan ke halaman login tetapi ketika dia menekan tombol kembali browser, dia masih dapat melihat data sebelumnya.

@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;
  }
}

Apakah ada cara untuk mengkonfigurasi ini sedemikian rupa sehingga browser akan menampilkan halaman telah kedaluwarsa menggunakan logika di atas.


person Mark Estrada    schedule 07.11.2012    source sumber
comment
kemungkinan duplikat Hindari tombol kembali pada aplikasi JSF+Primefaces   -  person BalusC    schedule 08.11.2012
comment
uppss maaf atas kemungkinan duplikat...   -  person Mark Estrada    schedule 08.11.2012


Jawaban (1)


Anda harus menonaktifkan cache browser untuk halaman yang Anda tidak ingin tombol kembali menampilkannya lagi. Untuk melakukan ini, Anda dapat membuat filter servlet yang menetapkan parameter yang diperlukan di header respons untuk halaman tersebut:

@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() {
    }
}

Dengan cara ini, ketika pengguna menekan tombol kembali browser, halaman tersebut akan diminta lagi dari server.

person Mohammad Dehghan    schedule 07.11.2012