以编程方式更改会话超时

时间:2011-05-28 19:31:31

标签: jsf servlets web.xml session-timeout programmatic-config

我可以在定义的不活动时间后退出用户。

<session-timeout>240</session-timeout> 

但是,是否有某种方法可以在指定时间内注销,或者更好,例如在指定时间后5分钟不活动。?

3 个答案:

答案 0 :(得分:4)

您可以将会话超时更改为HttpSession#setMaxInactiveInterval(),其中您可以以秒为单位指定所需的超时。

如果您想要涵盖广泛的请求,例如文件夹/admin中的所有页面或其他内容,然后执行此操作的最佳位置是创建Filter,该ExternalContext#setSessionMaxInactiveInterval()映射在FacesServlet上,大致执行以下作业:

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpSession session = request.getSession();

    if (request.getRequestURI().startsWith("/admin/")) {
        session.setMaxInactiveInterval(60 * 5); // 5 minutes.
    } else {
        session.setMaxInactiveInterval(60 * 240); // 240 minutes.
    }

    chain.doFilter(req, res);
}

在JSF托管bean中,会话由ExternalContext#getSession()提供:

HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession();
// ...

或者当您已经使用JSF 2.1时,您也可以使用新的{{3}}代理该方法。

答案 1 :(得分:1)

自动 - 否。

你必须:

  • 将所有会话存储在Set中。在创建它们时在HttpSessionListener中执行此操作。
  • 在给定时间(例如使用石英).invalidate()他们

答案 2 :(得分:1)

Bozho给你的是正确的,你看到的最有可能的是,当你按下你的注销按钮时,会话被破坏,但是servlet容器被引导到“post logout”页面,它自动导致会话被创建(因此“Session Destroyed”后跟“Session Created”)。

如果没有创建自己的会话处理系统,我不知道如何解决这个问题。 (我以前遇到过这个问题,在我们创建自己的会话系统后它就消失了)