在 JSF 导航后单击浏览器后退按钮会导致浏览器中出现 "Document expired"

Clicking browser back button after JSF navigation causes "Document expired" in browser

在我的项目中,登录页面后,如果我单击菜单,主页面会在左侧站点包含菜单 link 1 ==> 您将导航到第 1 页,然后单击菜单 link 2 = => 你将导航到第 2 页,如果你使用后退按钮,我会得到 文档过期.

我想在注销后删除浏览器缓存为此我使用阶段侦听器。

相位侦听器代码

    @Override
        public void beforePhase(PhaseEvent event) {
            FacesContext facesContext = event.getFacesContext();
            HttpServletResponse response = (HttpServletResponse) facesContext
             .getExternalContext().getResponse();
        logger.log(Level.INFO,"Cache control phase listener called");
             response.addHeader("Pragma", "no-cache");
             response.addHeader("Cache-Control", "no-cache");
             response.addHeader("Cache-Control", "no-store");
             response.addHeader("Cache-Control", "must-revalidate"); 
             response.addHeader("Expires","Mon, 8 Aug 2006 10:00:00 GMT");
        }

我还使用 UserFilter 来保护 /user/* 文件夹中的页面
这是 UserFilter 的 doFilter 代码

@Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        logger.log(Level.INFO,"User Filter's doFilter called");
        UserManager userManager = (UserManager)((HttpServletRequest)request).getSession().getAttribute("userManager");
            if(userManager==null || !userManager.getIsLoggedIn() || !userManager.getCurrentRole().equals("user")){
                String contextPath = ((HttpServletRequest)request).getContextPath();
                ((HttpServletResponse)response).sendRedirect(contextPath+"/login.xhtml");
            }else{
                chain.doFilter(request, response);
            }
    }

我还希望登录后用户在注销之前无法再次返回登录页面。

if you use back button then i get "document expired"

如果之前的请求是同步 POST 请求(表单提交),就会发生这种情况。您不应该将 POST 用于 page-to-page 导航。为它使用 GET。

换句话说,用<h:link/button>替换代表纯page-to-page导航links/buttons的<h:commandLink/Button>。而且,当您需要在提交表单后导航到新页面时,例如要在提交条目后显示列表,请使用 POST-redirect-GET.

另请参阅:


与具体问题无关PhaseListener 是处理 HTTP 响应 headers 的错误工具。使用正常 Filter.