Session是一种状态保持机制,参考文章Session是什么可知Session和Web服务也没有必然关系,Shiro本身的Security Manager也可以脱离Servlet自己管理Session
根据Security Manager不同 Shiro本身有3种Session管理机制
Session Manager | 所需Security Manager | Session周期 |
---|---|---|
DefaultSessionManager | DefaultSecurityManager | 使用的默认实现,用于 JavaSE 环境; |
ServletContainerSessionManager | DefaultWebSecurityManager | 使用的默认实现,用于 Web 环境,其直接使用 Servlet 容器的会话 |
DefaultWebSessionManager | DefaultWebSecurityManager | 用于 Web 环境的实现,可以替代 ServletContainerSessionManager,自己维护着会话,直接废弃了 Servlet 容器的会话管理 |
可以配置在 securityManager 的 sessionManager 属性中
1
2
3
4
5
6
7
8
9
10
| <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="sampleRealm"/>
<property name="cacheManager" ref="cacheManager"/> <====进行Cache机制的配置
<property name="sessionManager" ref="sessionManager"/> <====进行Session机制的配置
</bean>
// 不同的Session机制需要不同的配置属性
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
.......
</bean>
|
Cache 缓存
Cache的作用是把每次通过Realm查询到的结果存入Session,以便用户访问时加快Authentication和Authorization
如果要使用cache,必须在 securityManager 和 sessionManager 中同时进行配置
sessionManager的配置
在上文的例子中我们使用了最复杂的 org.apache.shiro.web.session.mgt.DefaultWebSessionManager 此处来讲解如何进行具体配置
准备工作
首先我们先对sessionManager里会用到的属性进行控制反转,加入Spring,至于为什么需要这些属性,参考文章Session是什么
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| //shiro自带的EhCache缓存
<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager"/>
//用来产生不重复的sessionId
<bean id="sessionGenerate" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator"/>
//session类本身,最主要的存放有sessionId
<bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">
<property name="sessionIdGenerator" ref="sessionGenerate"/>
</bean>
//因为放弃了容器的Session机制,所以要自己完成和Web的Cookie交换
<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<property name="httpOnly" value="true"/>
<property name="maxAge" value="1800000"/>
<property name="name" value="shiroKey"/>
</bean>
//对Session进行验证的类
<bean id="sessionValidationScheduler" class="org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler">
<property name="interval" value="1800000"/>
<property name="sessionManager" ref="sessionManager"/>
</bean>
|
注入sessionManager
在准备好了属性之后,对sessionManager进行注入
1
2
3
4
5
6
7
8
9
10
| <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<property name="sessionDAO" ref="sessionDAO"/> <====放入具体实例化的Session的Object
<property name="sessionValidationScheduler" ref="sessionValidationScheduler"/> <====采用此类进行Session的验证
<property name="sessionValidationSchedulerEnabled" value="true"/> <====开放Session验证
<property name="sessionIdCookie" ref="sessionIdCookie"/> <====采用该Cookie机制
<property name="sessionIdCookieEnabled" value="true"/> <====开放Cookie机制
<property name="deleteInvalidSessions" value="true"/> <====删除失效的Session
<property name="cacheManager" ref="cacheManager"/> <====采用自定义缓存
<property name="globalSessionTimeout" value="1800000"/> <=====Session多久失效
</bean>
|
Shiro配置完毕
虽然讲解了自定义的DefaultWebSessionManager但是为了不产生额外的负担推荐使用ServletContainerSessionManager服务器容器自身的Session机制
因为在使用DefaultWebSessionManager产生过一些逻辑意外页面刷新就自动登出了Shiro
此时Shiro虽然已经配置完毕,按照道理应该可以正常使用,但是在实际过程中不会存放明文密码,所以请在阅读了Shiro完成加盐登陆后再进行实战