jsf-2 - 如果用户单击浏览器后退按钮,如何在 session 过期时将用户移至超时页面

标签 jsf-2

我正在使用过滤器处理 JSF 2.0 中的 session 过期。这是代码

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

    HttpServletRequest httpServletRequest = (HttpServletRequest) request;
    HttpServletResponse httpServletResponse = (HttpServletResponse) response;

    HttpSession session = httpServletRequest.getSession(false);

    if (session == null) {

        //session timeout check.
        if (httpServletRequest.getRequestedSessionId() != null && !httpServletRequest.isRequestedSessionIdValid()) {

            System.out.println("Session has expired");
            session = httpServletRequest.getSession(true);
            session.setAttribute("logedin", "0");    // public user               
            httpServletResponse.sendRedirect(timeoutPage);

        } else {

            session = httpServletRequest.getSession(true);
            session.setAttribute("logedin", "0");
            filterChain.doFilter(httpServletRequest, httpServletResponse);
        }
    } 
} //end of doFilter()

但问题是,当 session 过期并且如果用户单击后退按钮时,他将获得所有样式都消失的页面。无论如何,当 session 过期时,如果用户单击浏览器后退按钮,那么他将定向到超时页面。

还有一件事,我还在我的页面上使用 Prime Faces 组件,例如数据表。我正在使用分页。如果 session 超时,并且我单击分页,则不会出现 session 过期消息。好像ajax请求不调用过滤器?我如何连接我的 ajax 事件,或者您可以将数据表分页事件与 session 过期联系起来?

谢谢

最佳答案

when session expires and if user click on the back button, then he gets the page with all styling out

您需要告诉浏览器不要在浏览器缓存中缓存页面。浏览器应该改为向服务器发送完整请求。

filterChain.doFilter() 调用之前添加以下行。

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

If session time out, and i click on pagination then the session expiration message do not appear. It seems that ajax request don't call filter?

JSF ajax 请求期望具有 HTTP 状态 200 的 XML 响应。如果您发送同步重定向,那么将发送 HTTP 状态 302 响应,这将被 JSF ajax 引擎完全忽略。相反,您应该发送带有特定 XML 片段的普通 HTTP 200 响应,告诉 JSF ajax 引擎执行重定向。执行此操作而不是 httpServletResponse.sendRedirect() 然后:

if ("partial/ajax".equals(httpServletRequest.getHeader("Faces-Request"))) {
    httpServletResponse.setContentType("text/xml");
    httpServletResponse.getWriter()
        .append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
        .printf("<partial-response><redirect url=\"%s\"></redirect></partial-response>", timeoutPage);
}
else {
    httpServletResponse.sendRedirect(timeoutPage);
}

请注意,当您已经在 J​​SF 上下文中时(例如通过 PhaseListenerSystemEventListener 或者可能是 @ManagedBean),那么您可以只需使用 ExternalContext#redirect() 方法。它将透明地相应地处理同步/异步请求。

关于jsf-2 - 如果用户单击浏览器后退按钮,如何在 session 过期时将用户移至超时页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9766307/

相关文章:

java - 有没有一种方法可以在 JSF 的 View 范围 bean 中为每个请求调用某些东西?

java - REST和JSF : Library to use? 如何解决?

全局过滤器的 JSF Primefaces 数据表匹配模式(不是单个列)

java - 如何在 JSF 页面上禁用#{session}?

jsf - PrimeFaces 对话框延迟加载(动态 ="true")不起作用?

jsf-2 - 行编辑在数据表primefaces中不起作用

java - JSF 2 validator 无法使用数据表中的 "var"

java - 为什么 getFacesContext() 变为 null

jsf - <p :commandButton global ="false"> attribute do? 是什么

html - 如何获取当前 View HTML 源并将其作为字符串传递 JSF ManagedBean