一般选用DefaultWebSessionManager
DefaultWebSessionManager : 用 于 Web 环境的实 现 , 可 以 替 代ServletContainerSessionManager,自己维护着会话,直接废弃了 Servlet 容器的会话管理。
<!-- 会话ID生成器 -->
<bean id="sessionIdGenerator"
class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator" />
<!-- 会话Cookie模板 关闭浏览器立即失效 -->
<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<constructor-arg value="sid" />
<property name="httpOnly" value="true" />
<property name="maxAge" value="-1" />
</bean>
<!-- 会话DAO -->
<bean id="sessionDAO"
class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">
<property name="sessionIdGenerator" ref="sessionIdGenerator" />
</bean>
<!-- 会话验证调度器,每30分钟执行一次验证 ,设定会话超时及保存 -->
<bean name="sessionValidationScheduler"
class="org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler">
<property name="interval" value="1800000" />
<property name="sessionManager" ref="sessionManager" />
</bean>
<!-- 会话管理器 -->
<!-- DefaultWebSessionManager维持自己的会话 -->
<bean id="sessionManager"
class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<!-- 全局会话超时时间(单位毫秒),默认30分钟 -->
<property name="globalSessionTimeout" value="1800000" />
<property name="deleteInvalidSessions" value="true" />
<property name="sessionValidationSchedulerEnabled" value="true" />
<property name="sessionValidationScheduler" ref="sessionValidationScheduler" />
<property name="sessionDAO" ref="sessionDAO" />
<property name="sessionIdCookieEnabled" value="true" />
<property name="sessionIdCookie" ref="sessionIdCookie" />
</bean>
- sessionIdCookie 是 sessionManager 创建会话 Cookie 的模板
- sessionIdCookie.name:设置 Cookie 名字,默认为 JSESSIONID;
- sessionIdCookie.domain:设置 Cookie 的域名,默认空,即当前访问的域名;
- sessionIdCookie.path:设置 Cookie 的路径,默认空,即存储在域名根下;
- sessionIdCookie.maxAge:设置 Cookie 的过期时间,秒为单位,默认-1 表示关闭浏览器时过期 Cookie;
- sessionIdCookie.httpOnly:如果设置为 true,则客户端不会暴露给客户端脚本代码,使用HttpOnly cookie有助于减少某些类型的跨站点脚本攻击;此特性需要实现了Servlet 2.5 MR6及以上版本的规范的 Servlet 容器支持;
- sessionManager.sessionIdCookieEnabled:是否启用/禁用 Session Id Cookie,默认是启用的,如果禁用后将不会设置 Session Id Cookie,即默认使用了 Servlet 容器的 JSESSIONID,且通过 URL 重写(URL 中的“;JSESSIONID=id”部分)保存 Session Id。另外我们可以如“sessionManager. sessionIdCookie.name=sid”这种方式操作 Cookie 模板.
会话监听器
package com.cxy.sessionListener;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.SessionListener;
/**
* 会话监听器,监听会话创建、过期及停止事件
* 只监听某一个事件,可以继承SessionListenerAdapte
* @author Administrator
*
*/
public class MySessionListener1 implements SessionListener{
@Override
public void onStart(Session session) {//会话创建时触发
System.out.println("会话创建:" + session.getId());
}
@Override
public void onExpiration(Session session) {
//会话过期时触发
System.out.println("会话过期:" + session.getId());
}
@Override
public void onStop(Session session) {
//停止时触发
System.out.println("会话停止:" + session.getId());
}
}
<!-- 会话监听器 -->
<bean id="listener1" class="com.cxy.sessionListener.MySessionListener1"/>
<!-- 会话管理器 -->
<!-- DefaultWebSessionManager维持自己的会话 -->
<bean id="sessionManager"
class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<!-- 全局会话超时时间(单位毫秒),默认30分钟 -->
<property name="globalSessionTimeout" value="1800000" />
<property name="deleteInvalidSessions" value="true" />
<property name="sessionValidationSchedulerEnabled" value="true" />
<property name="sessionValidationScheduler" ref="sessionValidationScheduler" />
<property name="sessionDAO" ref="sessionDAO" />
<property name="sessionIdCookieEnabled" value="true" />
<property name="sessionIdCookie" ref="sessionIdCookie" />
<property name="sessionListeners" ref="listener1"/>
</bean>
会话存储/持久化
Shiro 提供 SessionDAO 用于会话的 CRUD
<!-- 会话DAO -->
<bean id="sessionDAO"
class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">
<property name="sessionIdGenerator" ref="sessionIdGenerator" />
</bean>
会话验证
Shiro 提供了会话验证调度器,用于定期的验证会话是否已过期,如果过期将停止会话;出于性能考虑,一般情况下都是获取会话时来验证会话是否过期并停止会话的;但是如在 web环境中,如果用户不主动退出是不知道会话是否过期的,因此需要定期的检测会话是否过期,Shiro 提供了会话验证调度器 SessionValidationScheduler 来做这件事情。
<!-- 会话验证调度器,每30分钟执行一次验证 ,设定会话超时及保存 -->
<bean name="sessionValidationScheduler"
class="org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler">
<property name="interval" value="3600000" />
<property name="sessionManager" ref="sessionManager" />
<property name="globalSessionTimeout" value="1800000" />
</bean>
<!-- 会话管理器 -->
<!-- DefaultWebSessionManager维持自己的会话 -->
<bean id="sessionManager"
class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<!-- 全局会话超时时间(单位毫秒),默认30分钟 -->
<property name="globalSessionTimeout" value="1800000" />
<property name="deleteInvalidSessions" value="true" />
<property name="sessionValidationSchedulerEnabled" value="true" />
<property name="sessionValidationScheduler" ref="sessionValidationScheduler" />
<property name="sessionDAO" ref="sessionDAO" />
<property name="sessionIdCookieEnabled" value="true" />
<property name="sessionIdCookie" ref="sessionIdCookie" />
<property name="sessionListeners" ref="listener1"/>
</bean>
sessionManager 默 认 就是使 用ExecutorServiceSessionValidationScheduler,其使用 JDK 的 ScheduledExecutorService 进行定期调度并验证会话是否过期;
interval:设置调度时间间隔,单位毫秒,默认就是 1 小时;
sessionManager:设置会话验证调度器进行会话验证时的会话管理器;
globalSessionTimeout:设置全局会话超时时间,默认 30 分钟,即如果 30分钟内没有访问会话将过期
sessionManager.sessionValidationSchedulerEnabled:是否开启会话验证器,默认是开启的;
sessionManager.sessionValidationScheduler : 设置会话验证调度器,默认就是ExecutorServiceSessionValidationScheduler。
使用 Quartz 会话验证调度器
<!-- quartz会话验证调度器-->
<bean name="quartzValidationScheduler"
class="org.apache.shiro.session.mgt.quartz.QuartzSessionValidationSched
uler ">
<property name="sessionValidationInterval" value="3600000" />
<property name="sessionManager" ref="sessionManager" />
</bean>
使用时需要导入 shiro-quartz 依赖:
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-quartz</artifactId>
<version>1.2.2</version>
</dependency
其他设置
1.如果在会话过期时不想删除过期的会话,会话管理器如下设置,默认是开启的
<property name="deleteInvalidSessions" value="false" />
2.如果是在获取会话时验证了会话已过期,将抛出 InvalidSessionException;因此需要捕获这
个异常并跳转到相应的页面告诉用户会话已过期,让其重新登录,如可以在 web.xml 配置
相应的错误页面
<error-page>
<exception-type>org.apache.shiro.session.InvalidSessionException</exception-type>
<location>/invalidSession.jsp</location>
</error-page>