Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如web容器tomcat),无论JavaSE仍是JavaEE环境均可以使用,提供了会话管理、会话事件监听、会话存储/持久化、容器无关的集群、失效/过时支持、对Web 的透明支持、SSO 单点登陆的支持等特性。java
会话监听器用于监听会话建立、过时及中止事件web
添加Session,这里添加的时候使用的是 HttpSession数据库
@RequestMapping("/shiroMethod") public String shiroServiceMethod(HttpSession session){ session.setAttribute("key", "value12345"); shiroService.shiroServiceMethod(); return "redirect:/list.jsp"; }
在Service层中获取Session,注意这里使用的是Shiro提供的Sessionapache
package com.java.shiro.services; import java.util.Date; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authz.annotation.RequiresRoles; import org.apache.shiro.session.Session; public class ShiroService { @RequiresRoles({ "admin" }) public void shiroServiceMethod() { Session session = SecurityUtils.getSubject().getSession(); System.out.println("session: " + session.getAttribute("key")); System.out.println("Test ShiroServiceMethod, time: " + new Date()); } }
这样的好处是,即使是在Service层也能访问到Session的数据,开发的时候是很方便的,这是Shiro提供的Session一个很重要的应用缓存
SessionDaotomcat
能够把Session存到数据库中,对session进行增删改查操做。session
在开发中推荐 继承 EnterpreiseCacheSessionDAOapp
思路:jsp
配置示例:性能
咱们把配置好的sessionManager 做为SecurityManager的属性进行配置。
数据表:
create table sessions ( id varchar(200), session varchar(2000), constraint pk_sessionsprimary key(id) ) charset=utf8 ENGINE=InnoDB;
Session Dao
在进行Session操做时,咱们须要将这个Session对象进行序列化的操做
SerializableUtils
配置完成。
会话验证调度器
实际上会在底层开一个线程,验证会话是否过时了,使用会话验证会影响性能,开发是用的很少。
CacheManagerAware接口
Shiro内部相应的组件(DefaultSecurityManager) 会自动检测相应的对象(如Realm) 是否实现了CacheManagerAware并自动注入相应的CacheManager。
Realm缓存
Shiro 提供了 CachingRealm,其实实现了CacheManagerAware 接口,提供了缓存的一些基础实现;
AuthenticatingRealm 及 AuthorizingRealm也分别提供了对 AuthenticationInfo 和 AuthorizationInfo信息的缓存。
Session缓存