shiro无状态学习---(1)
2017-12-12 20:41
113 查看
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包
commons-codec:用到org.apache.commo ns.codec.binary.Hex;
3、初步加入shiro,这就是本节重点了
第一步:创建StatelessDefaultSubjectFactory,关闭session的创建
第二步:创建shiro的配置文件,通过sessionManager禁用session,通过sessionManager禁用掉会话调度器
而shiro配置本身最少就需要创建两个东西,
1、ShiroFilterFactoryBean,2、DefaultWebSecurityManager
代码如下:
第一个项目:实现禁用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包
<!-- shiro spring. --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.0</version> </dependency>
commons-codec:用到org.apache.commo ns.codec.binary.Hex;
<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> </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的SessionStor a18d ageEvaluator的实现类 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了,则可以进行下一步了。
相关文章推荐
- 这个知识点不错,,学习一下先。。。无状态服务(stateless service)(转)
- 第一章 Shiro简介——跟我学习springmvc shiro mybatis
- Shiro源码学习(三)常用Filter源码和继承关系
- 《UNP》学习之TCP状态转换
- 第二章 身份验证——跟我学习springmvc shiro mybatis
- UML学习之--状态图
- AE开发学习记录之状态栏添加
- Shiro 学习笔记(3)—— 授权初步
- Asp.net控件开发学习笔记(五)---Asp.net客户端状态管理
- oracle学习笔记 undo段及区的状态和使用
- 状态模式学习
- [java 编程思想学习笔记] java 线程状态
- 【shiro】shiro学习笔记2-自定义realm
- Shiro学习(17)OAuth2集成
- 【Hibernate学习】——持久化对象的三种状态
- java学习个人笔记---Java内存管理之java对象内存中的状态
- 大话设计模式学习(十二)——状态模式
- shiro学习一 (开涛的跟我学系列 ) 身份验证
- Hibernate学习(三):Session的缓存及对象的状态