shiro 中的 JSF 更改会话超时
Posted
技术标签:
【中文标题】shiro 中的 JSF 更改会话超时【英文标题】:JSF change session time out in shiro 【发布时间】:2012-09-27 11:42:20 【问题描述】:我需要在使用 shiro 进行安全和会话管理的 jsf 应用程序中更改默认会话超时。默认为 30 分钟。
以下是我的shiro配置
<filter>
<filter-name>ShiroFilter</filter-name>
<filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class>
<init-param>
<param-name>config</param-name>
<param-value>
[main]
authc = com.foo.bar
authcRealm = com.foo.barAuthenticatingRealm
sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
securityManager.sessionManager = $sessionManager
securityManager.sessionManager.globalSessionTimeout = 20000
unAuthc = com.foo.UnauthorisedFilter
/** = authc
</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>ShiroFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
在使用上述配置时,我在登录时立即注销。删除以下行默认超时为 30 分钟
sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
securityManager.sessionManager = $sessionManager
securityManager.sessionManager.globalSessionTimeout = 20000
【问题讨论】:
【参考方案1】:好吧,在尝试在网上搜索并失败之后,在这里也失败了,我终于设法找到了一种方法(有点破解,而不是最好的方法)。就这样吧
Shiro 默认创建DefaultWebSecurityManager
类型的安全管理器,因此继续扩展它。拦截了它的createSubject()
方法并在那里设置超时如下
public class SecurityManager extends DefaultWebSecurityManager
@Override
public Subject createSubject(SubjectContext subjectContext)
Subject subject = super.createSubject(subjectContext);
subject.getSession().setTimeout(10 * 60 * 1000);
return subject;
然后在配置中将这个SecurityManager
分配给sessionManager
(很奇怪为什么他们称安全管理器为会话管理器,我浪费了很多时间才弄清楚这一点)如下
[main]
authc = com.foo.bar
authcRealm = com.foo.barAuthenticatingRealm
sessionManager = com.foo.securityManager
unAuthc = com.foo.UnauthorisedFilter
/** = authc
我认为这不是唯一的方法,我相信还有更好的方法,可能不那么笨拙,性能更好,但这对我有用,没有任何明显的性能影响(尽管我确实观察到了这一点方法被多次调用,可能每个 http 请求一次)。如果您知道更好的方法,请留下另一个答案,我很乐意重新接受更好的解决方案。
【讨论】:
【参考方案2】:试试看:
<session-config>
<!-- web.xml expects the session timeout in minutes: -->
<session-timeout>1</session-timeout>
</session-config>
在您的 web.xml 上
【讨论】:
shiro 也会从这里选择超时吗?【参考方案3】:DefaultWebSessionManager 似乎有问题(至少在 Shiro 1.1.0 中)。 使用依赖HttpSession的管理器,默认也可以 通过将会话模式设置为 http 来显式启用。
Shiro 然后将 globalSessionTimeout 应用于所有新的 http 会话。此代码配置 会话管理器和超时(以毫秒为单位):
securityManager.sessionMode = http
securityManager.sessionManager.globalSessionTimeout = 3600000
Shiro 将始终应用超时,即使您自己没有指定超时。默认为 30 分钟 在 1.1.0 中。
请注意,超时是通过 HttpSession 上的 setMaxInactiveInterval 设置的,所以 您的容器可能决定遵循其他设置并提前使会话无效。 例如,请参阅 Gryzorz 的回答。
其他框架也喜欢调用 setMaxInactiveInterval 来安装自己的设置。
【讨论】:
【参考方案4】:AbstractNativeSessionManager 的 applyGlobalSessionTimeout() 方法有代码 session.setTimeout(getGlobalSessionTimeout()); 如果您覆盖 applyGlobalSessionTimeout() 以不调用 setTimeout,它应该采用自定义超时。
【讨论】:
以上是关于shiro 中的 JSF 更改会话超时的主要内容,如果未能解决你的问题,请参考以下文章
JSF 中的 ViewExpiredException [重复]