【问题标题】:Configure JSESSIONID Cookie to expire at specific point in time配置 JSESSIONID Cookie 在特定时间点过期
【发布时间】:2018-11-08 06:11:56
【问题描述】:

我正在使用 WildFly 11 和 JSF/Primefaces。

我希望我的用户的会话 cookie 在特定时间点过期,比如说今天午夜。

我明白我可以配置

<session-config>
    <cookie-config>
        <max-age>3600</max-age>
     </cookie-config>
</session-config>

在我的 web.xml 中设置会话 cookie 的最大年龄。

但是我怎样才能设置像

这样的动态值
<session-config>
    <cookie-config>
        <max-age>calculateMaxAgeForThisSpecificLogin()</max-age>
     </cookie-config>
</session-config>

如果有任何正确方向的提示,我将不胜感激。

编辑: 澄清一下:我知道我可以像这样设置会话超时:

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

或者,会话超时可以在应用程序代码中动态设置。不幸的是,这不会解决我面临的问题:

  1. 当在指定的时间内没有生成请求时,会话超时将破坏服务器端的会话。没有办法预测这将是什么时候。如果浏览器继续生成请求(即错误),会话将永远不会被破坏。据我了解,设置超时并不能确保会话在特定时间点被销毁。
  2. 如果没有另外指定,会话 cookie 将一直存在,直到浏览器关闭。在我的内部公司环境中,这很可能意味着永远,因为许多用户只是锁定他们的工作站,但从不关闭他们的浏览器。即使会话在服务器端失效,浏览器仍然会发送一个可能非常旧的会话 cookie。默认情况下,JSESSIONID cookie 在最后一个点之后包含一个服务器部分(即“...app-server-1”),负载均衡器使用它来评估适当的路由。发送旧的会话 cookie 可能会导致负载均衡器上出现意外路由,从而导致版本管理方面的进一步问题。

因此,设置 max-age 会有所帮助,因为浏览器将停止发送非常旧的会话 cookie。

我的问题旨在为 JSESSIONID cookie 设置一个特定的时间点,以便能够使负载平衡和版本管理与会话生命周期和浏览器行为保持一致。

【问题讨论】:

  • 您的标题是具体的,您实际上需要的是能够动态(以编程方式)设置它。为此,搜索引擎会给你一个答案。总是尝试“概括”一个问题。
  • 请注意,我故意询问浏览器中会话 cookie 的 max-age,而不是服务器端会话超时。
  • 啊,好的,我现在明白了,抱歉我看错了(有很多问题需要关注/扫描/帮助)。将撤回关闭重复投票
  • 查看stackoverflow.com/questions/35105410/…答案中的最后一段不知道是否还有其他更新的解决方案

标签: jsf jakarta-ee wildfly undertow


【解决方案1】:

使用过滤器:

public class SampleFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        int cookieAge = 3600 ; //Or load from config file or database
        request.getSession().setMaxInactiveInterval(cookieAge);

        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}

【讨论】:

  • 最好在建议的副本中使用 http sessionListener
  • 您可以将问题“关闭”为重复项...请尝试
  • 感谢您的努力,但这不是我要问的。我没有询问会话超时。我询问了会话 cookie 的(浏览器端)max-age,它与服务器端会话超时不同。
  • 我认为代码示例具有误导性。 setMaxInactiveInterval() 不设置 cookie 年龄。它将设置服务器端会话超时。来自文档:setMaxInactiveInterval(int interval) 指定在 servlet 容器使该会话无效之前客户端请求之间的时间(以秒为单位)。
  • 他是专门询问JSESSIONID Cookie
猜你喜欢
  • 2012-05-19
  • 2016-08-17
  • 2017-07-07
  • 2011-11-30
  • 2011-12-17
  • 1970-01-01
  • 2011-06-23
  • 2017-01-11
  • 1970-01-01
相关资源
最近更新 更多