java – 在HttpSession之后重定向超时

我一直在看这个话题的很多帖子,但是无法得到一个适用于我的例子的解决方案.

我正在使用Java EE 6与JSF 2.0(部署在JBoss AS 7.1上)

在我的web.xml中,我有

<session-config>
        <session-timeout>1</session-timeout>
    </session-config>

我希望用户在会话自动超时时被重定向登录页面.

我试过了

方法1:使用过滤器

我尝试了以下过滤器:

@WebFilter()
public class TimeOutFilter implements Filter {

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

        @Override
        public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,servletexception {
        System.out.println("filter called");
        final HttpServletRequest req = (HttpServletRequest) request;
        final HttpSession session = req.getSession(false);
        if (session != null && !session.isNew()) {
            chain.doFilter(request,response);
        } else {
            System.out.println("Has timed out");
            req.getRequestdispatcher("/logon.xthml").forward(request,response);
        }
    }

    @Override
    public void destroy() {
    }
}

在web.xml我尝试过

<filter-mapping>
    <filter-name>TimeOutFilter</filter-name>
    <url-pattern>*.xhtml</url-pattern>
</filter-mapping>

<filter-mapping>
    <filter-name>TimeOutFilter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>

过滤器的工作原理是每个请求(在控制台中记录“fiter called”).但是当会话超时时,它不会被调用.

方法2:HttpSessionLister

我试图使用一个HttpSessionListerner.该方法称为具有以下签名:

public void sessionDestroyed(HttpSessionEvent se) {
}

我无法重定向到特定页面.当我想重定向用户时,我通常使用FacesContext中的NavigationHandler,但在这种情况下,没有FacesContext(FacesContext.getCurrentInstance()返回null).

根据这个post,HttpListener不能重定向用户,因为它不是请求的一部分.

解决这个问题最好的方法是什么?我可以做些什么来做上述两种上述方法之一?

解决方法

只要客户端没有发送HTTP请求,您就不能发送HTTP响应.就那么简单.这就是HTTP的工作原理.否则,如果任何网站能够在没有客户端请求的情况下无阻碍地推送HTTP响应,互联网将看起来非常不同.

基于JavaScript的心跳基于客户端的键盘/鼠标活动,如回答here,或像刷新页面一样,如答案here将是解决方案,如果您基本上是单页webapp(因此,您实际上没有使用会话范围,但视图范围),但如果您在同一会话中的多个选项卡/窗口中打开该页面,则不会很好地工作.

理论上,Websockets是向客户端推送某些东西的正确解决方案,但这又需要一个活动的会话.鸡蛋问题.而且,目前在使用中相对较广泛的旧版浏览器中也不行,所以现在应该仅用于渐进式增强.

最好的办法是定义一个错误页面,该页面在会话过期时终端用户调用一个操作的情况.参见javax.faces.application.ViewExpiredException: View could not be restored.

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...