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

对于不希望后退按钮再次显示的页面,您应该禁用浏览器缓存。为此,您可以创建一个 servlet 过滤器,在这些页面的响应标头中设置所需参数:

@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 回答