shiro无状态学习---(1)
第一个项目:实现禁用session
项目搭建:这里使用springboot作为基础搭建一个基础的springmvc框架
1、创建项目
这样,一个基本的spring boot就党建好了,访问
http://localhost:8080/hello?params1=你好¶ms2=世界,就会打印出 hello,xxx,params1=你好,params2=世界
2、引入Jar包依赖
除了spring-boot-parent和spring-boot-starter-web,显然,我们还需要引入shiro的Jar包
<dependency> <groupId>org.apache.shirogroupId> <artifactId>shiro-springartifactId> <version>1.4.0version> dependency>
<dependency> <groupId>commons-codecgroupId> <artifactId>commons-codecartifactId> dependency>
3、初步加入shiro,这就是本节重点了
第一步:创建StatelessDefaultSubjectFactory,关闭session的创建
public class StatelessDefaultSubjectFactory extends DefaultWebSubjectFactory{ /** * 第一:SubjectContext在创建的时候,需要关闭session的创建, * 这个主要是由DefaultWebSubjectFactory的createSubject进行管理 * @param context * @return */ @Override public Subject createSubject(SubjectContext context) { //不创建session了 context.setSessionCreationEnabled(false); return super.createSubject(context); } }第二步:创建shiro的配置文件,通过sessionManager禁用session,通过sessionManager禁用掉会话调度器
而shiro配置本身最少就需要创建两个东西,
1、ShiroFilterFactoryBean,2、DefaultWebSecurityManager
代码如下:
public class ShiroConfiguration { /** * shiro filter * @param securityManager * @return */ @Bean public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager){ ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean(); //注入securityManager factoryBean.setSecurityManager(securityManager); return factoryBean; } /** * 第二: 需要禁用使用Sessions 作为存储策略的实现, * 这个主要由securityManager的subjectDao的sessionStorageEvaluator进行管理的。 * 安全管理器 * @return */ @Bean public DefaultWebSecurityManager securityManager(){ DefaultSecurityManager securityManager = new DefaultSecurityManager(); //获取securityManager的SubjectDao的实现类 DefaultSubjectDAO subjectDAO = (DefaultSubjectDAO)securityManager.getSubjectDAO(); //获取subjectDao的SessionStorageEvaluator的实现类 DefaultSessionStorageEvaluator sessionStorageEvaluator = (DefaultSessionStorageEvaluator)subjectDAO.getSessionStorageEvaluator(); //禁用session的存储策略 sessionStorageEvaluator.setSessionStorageEnabled(false); return securityManager; } /** * session管理器 * 第三:需要禁用掉会话调度器,这个主要是由sessionManager进行管理 * @return */ @Bean public DefaultSessionManager sessionManager(){ DefaultSessionManager sessionManager = new DefaultSessionManager(); sessionManager.setSessionValidationSchedulerEnabled(false); return sessionManager; } }
第三步:测试session是否禁用成功
在我们搭建好的HelloController中的路由为/hello的方法中添加以下代码即可:
@RestController public class HelloController { @RequestMapping("/hello") public String hello(String params1, String params2) { //测试无状态是否配置成功,抛出异常则证明配置成功 Subject currentUser = SecurityUtils.getSubject(); Session session = currentUser.getSession(); System.out.println(session); return "hello,hedonglin,params1=" + params1 + ",params2=" + params2; } }
当再次访问我们的路由时,就会抛出异常
org.apache.shiro.UnavailableSecurityManagerException:
No SecurityManager accessible to the calling code,
either bound to the org.apache.shiro.util.ThreadContext or as a vm static singleton.
This is an invalid application configuration.意思谷歌翻译一粘贴如下:
org.apache.shiro.UnavailableSecurityManagerException: 无法通过调用代码访问SecurityManager, 或者绑定到org.apache.shiro.util.ThreadContext或者作为一个vm静态单例。 这是一个无效的应用程序配置。
就是我们的session关闭创建成功,没有session了,则可以进行下一步了。