Shiro中Session和Cache

Session是一种状态保持机制,参考文章Session是什么可知Session和Web服务也没有必然关系,Shiro本身的Security Manager也可以脱离Servlet自己管理Session

根据Security Manager不同 Shiro本身有3种Session管理机制

Session Manager所需Security ManagerSession周期
DefaultSessionManagerDefaultSecurityManager使用的默认实现,用于 JavaSE 环境;
ServletContainerSessionManagerDefaultWebSecurityManager使用的默认实现,用于 Web 环境,其直接使用 Servlet 容器的会话
DefaultWebSessionManagerDefaultWebSecurityManager用于 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完成加盐登陆后再进行实战

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值