You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Pac4j/Shiro设置会话超时?配置10小时却60分钟过期

会话超时配置问题排查与解决

问题描述

已配置Shiro会话超时为10小时(36000000毫秒),Keycloak也做了对应设置,但会话仍会在60分钟后过期,同时询问是否需要在web.xml中添加session-config配置。

现有配置

Shiro.ini配置

sessionManager =org.apache.shiro.web.session.mgt.DefaultWebSessionManager
sessionManager.sessionIdCookie =$sessionIdCookie
sessionManager.sessionIdCookieEnabled =true
securityManager.sessionManager= $sessionManager

# 3,600,000 milliseconds = 1 hour -> set to 10 hours
sessionManager.globalSessionTimeout= 36000000

Keycloak配置

(对应SSO会话相关设置)

待确认的web.xml配置

<!-- sets the default session timeout to 480 minutes. -->
<session-config>
    <session-timeout>480</session-timeout>
</session-config>

问题排查与解决步骤

1. 补全Shiro的SessionIdCookie超时配置

你仅设置了服务器端的globalSessionTimeout,但浏览器端的Session ID Cookie未配置超时时间。默认情况下Cookie的maxAge为-1(关闭浏览器即失效),或继承容器默认的60分钟超时,会导致浏览器端Cookie提前过期,用户无法继续使用原有会话。

需在Shiro.ini中添加Cookie超时配置,确保与服务器端会话超时一致:

# 新增SessionIdCookie的具体配置
sessionIdCookie = org.apache.shiro.web.servlet.SimpleCookie
sessionIdCookie.name = JSESSIONID
# 设置为10小时对应的毫秒数,与globalSessionTimeout保持一致
sessionIdCookie.maxAge = 36000000
sessionIdCookie.httpOnly = true
sessionIdCookie.path = /

# 保留原有sessionManager配置
sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
sessionManager.sessionIdCookie = $sessionIdCookie
sessionManager.sessionIdCookieEnabled = true
sessionManager.globalSessionTimeout = 36000000
securityManager.sessionManager = $sessionManager

2. 检查Keycloak的完整会话配置

需确保Keycloak中的两个核心会话参数都设置为10小时(600分钟):

  • SSO Session Max:会话的最大生命周期,无论用户是否活跃,到时间都会过期
  • SSO Session Idle:会话的空闲超时,用户超过该时间无操作则过期

如果SSO Session Idle设置为60分钟,即使Max设置为10小时,用户60分钟不操作也会触发会话过期,这很可能是当前问题的根源。

3. web.xml的session-config配置说明

如果你使用的是Shiro的DefaultWebSessionManager(如当前配置),Shiro会独立管理会话,不依赖Servlet容器的会话机制,因此不需要在web.xml中添加session-config配置,反而可能因容器会话超时(480分钟)与Shiro会话超时不一致导致冲突。

但如果应用中存在直接调用request.getSession()的代码(即使用Servlet容器会话),则需确保容器会话超时与Shiro会话超时一致,此时可保留web.xml配置并设置为600分钟(10小时)。

额外注意事项

  • 集群部署环境下,需配置Shiro会话持久化(如Redis、数据库),避免会话仅存储在单个节点导致的异常过期。
  • 修改配置后需重启应用和Keycloak,清除浏览器缓存和Cookie后再测试。

内容的提问来源于stack exchange,提问作者vished2000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 16:33:36