2017.2.9 开涛shiro教程-第十章-会话管理(一)
原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398
根据下载的pdf学习。
第十章 会话管理(一)
10.1 会话
shiro提供的会话可以用于JavaSE/JavaEE环境,不依赖于任何底层容器,可以独立使用,是完整的会话模块。即直接使用shiro的会话管理替换如web容器的会话管理。
获取会话及其相关信息的一些代码:
1 login("classpath:shiro.ini", "zhang", "123"); 2 Subject subject = SecurityUtils.getSubject(); 3 4 //获取session对象,如果当前没有session对象,则创建一个 5 Session session = subject.getSession(); 6 //同上 7 Session session = subject.getSession(true); 8 //获取session对象,如果当前没有session对象,返回null 9 Session session = subject.getSession(false); 10 11 //获取当前会话的唯一id 12 session.getId(); 13 14 //获取当前Subject的主机地址 15 session.getHost(); 16 17 //获取/设置当前session的过期时间,默认为会话管理器的全局过期时间 18 session.getTimeout(); 19 session.setTimeout(毫秒); 20 21 //获取会话启动时间 22 session.getStartTimestamp(); 23 //获取会话最后访问时间 24 session.getLastAccessTime(); 25 //更新会话最后访问时间 26 session.touch(); 27 //销毁会话 28 session.stop(); 29 30 //设置/获取/删除会话属性,在整个会话范围都可以对这些属性操作 31 session.setAttribute("key", "123"); 32 Assert.assertEquals("123", session.getAttribute("key")); 33 session.removeAttribute("key");
10.2 会话管理器 sessionManager
shiro提供了三个默认实现:
(1)DefaultSessionManager:用于JavaSE环境
(2)ServletContainerSessionManager:用于Web环境,直接使用servlet容器的会话。
(3)DefaultWebSessionManager:用于web环境,自己维护会话。
我的项目中用的(3)。globalSessionTimeout是会话的全局过期时间,单位ms。可以单独设置每个session的timeout属性,来为每个session设置超时时间。
1 <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> 2 <property name="globalSessionTimeout" value="86400000"/> 3 <property name="deleteInvalidSessions" value="true"/> 4 <property name="sessionValidationSchedulerEnabled" value="true"/> 5 <property name="sessionValidationScheduler" ref="sessionValidationScheduler"/> 6 <property name="sessionDAO" ref="sessionDAO"/> 7 <property name="sessionIdCookieEnabled" value="true"/> 8 <property name="sessionIdCookie" ref="sessionIdCookie"/> 9 </bean>
10.3 会话监听器
10.4 会话存储/持久化
shiro提供SessionDAO用于对话的CRUD。
我的项目中:
1 <!--会话DAO--> 2 <bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO"> 3 <property name="activeSessionsCacheName" value="shiro-activeSessionCache"/> 4 <property name="sessionIdGenerator" ref="sessionIdGenerator"/> 5 </bean>
shiro提供了使用ehcache进行会话存储。ehcache可以配合TerraCotta实现容器无关的分布式集群。
1 <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> 2 <property name="authorizer" ref="aasModularRealmAuthorizer"/> 3 <property name="realm" ref="authServiceRealm"/> 4 <property name="cacheManager" ref="springCacheManager"/> 5 </bean> 6 7 <!-- 缓存管理器 --> 8 <bean id="springCacheManager" class="com.baosight.aas.auth.cache.SpringCacheManagerWrapper"> 9 <property name="cacheManager" ref="cacheManager"/> 10 </bean>
1 <!-- cache manager --> 2 <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"> 3 <property name="cacheManager" ref="ehcacheManager"/> 4 </bean> 5 6 <!-- 采用EhCache--> 7 <bean id="ehcacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> 8 <property name="configLocation" value="classpath:ehcache/ehcache.xml"/> 9 <property name="shared" value="true"/> 10 </bean>
fighting for this