【问题标题】:Programmatically change session timeout以编程方式更改会话超时
【发布时间】:2011-09-04 01:40:10
【问题描述】:

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

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

但是,有什么方法可以在指定的时间内退出,或者更好,例如直到指定时间后 5 分钟不活动。

【问题讨论】:

  • 我不明白你为什么不把&lt;session-timeout&gt;从240分钟修改为5分钟。
  • 因为用户在使用它。有时它会永久使用,有时只是偶尔使用。在第二种情况下,5 分钟不活动后注销会导致定期注销,这对用户不友好
  • 我已经做了一个新的答案(关于听众的奇怪行为)
  • 所以您希望能够更改特定请求的会话超时?如果是这样,是哪一个,什么时候?哪些请求需要 240 分钟的超时,哪些需要 5 分钟的超时?您想什么时候更改?
  • 工作时间分为轮班,在轮班期间应该是例如 30 分钟(当然 240 太多了)和实际轮班结束后的 5 分钟(例如下午 2.05)

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


【解决方案1】:

自动 - 不。

你必须:

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

【讨论】:

  • 我试过了,但有一些问题(我已经编辑了我的帖子)。你能再帮帮我吗?
  • 看起来很奇怪。您必须设置断点并查看发生了什么以及何时发生。
  • 我将删除 getSession 的 (true) 参数。除此之外 - 是的。
  • 不,它没有。有一个不需要任何东西的重载方法。
  • 我已经为听众问题做了一个新的答案
【解决方案2】:

Bozho 给您的信息是正确的,您最有可能看到的是,当您按下注销按钮时,会话被销毁,但 servlet 容器随后被定向到“注销后”页面,该页面会自动导致创建会话(因此“Session Destroyed”后跟“Session Created”)。

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

【讨论】:

  • 谢谢你,Crollster,但即使我禁用重定向也是一样的......
【解决方案3】:

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

当您想要涵盖广泛的要求时,例如/admin 文件夹中的所有页面或其他东西,那么最好的方法是创建一个映射到 FacesServlet 上的 Filter,它大致完成以下工作:

@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 时,您还可以使用新的 ExternalContext#setSessionMaxInactiveInterval(),它完全委托给该方法。

【讨论】:

  • 谢谢,我稍后会尝试理解它(在其他会话之后):)
  • 我已经回到这篇文章,我必须再次感谢你(如果你愿意,请参阅我更新的帖子):-)
  • 不客气。如果上述答案是最有帮助的并且最终是您接受的解决方案,那么为什么不标记为接受呢?
猜你喜欢
  • 2017-09-13
  • 1970-01-01
  • 2021-04-28
  • 2023-04-01
  • 2012-05-18
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多