Servlet容器会话管理
在Web环境中,Shiro默认的会话管理器SessionManager 的实现是ServletContainerSessionManager。这个实现只是简单的封装了Servlet容器,包括会话集群功能。它的本质是Shiro Session API与Servlet容器之间的一个桥梁。
使用这个默认实现的好处是,应用程序将使用现有的servlet容器的会话配置,例如超时,基于特定容器的集群机制等。缺点是你的应用程序依赖于特定servlet容器的会话处理将不适合移植。
如果使用缺省的servlet容器配置,在Web.xml文件里可配置Session超时。例如:
<session-config> <!-- web.xml expects the session timeout in minutes: --> <session-timeout>30</session-timeout> </session-config> |
本地会话管理
如果你想要特定的会话管理/集群功能,并且可以在不同的servlet容器移植。你可以Shiro本地的会话管理。“本地”的意思是Shiro自己实现的企业级会话管理支持所有的Subject和HttpServletRequest会话。但请放心,Shiro实现的会话管理符合servlet规范,现有的Web/HTTP相关代码不需要修改。
如想使用Shiro本地的会话管理,需要在shiro.ini进行配置:
[main] ... sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager # configure properties (like session timeout) here if desired # Use the configured native session manager: securityManager.sessionManager = $sessionManager |
一旦声明,你就可以配置DefaultWebSessionManager的实例,配置方法可参考“会话管理”部分中所描述的集群配置与本地会话选项。
比如,session超时设置:
[main] ... # 3,600,000 milliseconds = 1 hour securityManager.sessionManager.globalSessionTimeout = 3600000 |
DefaultWebSessionManager支持两种配置特性的Session Cookie:
l sessionIdCookieEnabled (a boolean)
l sessionIdCookie, a Cookie instance.
DefaultWebSessionManager的sessionIdCookie缺省实例是SimpleCookie。这个实现符合JavaBeans风格的属性配置,可以让所有相关的属性配置成一个Http Cookie。例如,你可以设置Cookie域:
[main] ... securityManager.sessionManager.sessionIdCookie.domain = foo.com |
Cookie的默认名称是JSESSIONID。此外,Shiro的cookie支持HttpOnly flag。
如果你不想使用会话cookie,你可以将sessionIdCookieEnabled的属性设置为false。例如:
[main] ... securityManager.sessionManager.sessionIdCookieEnabled = false |