您的位置:首页 > 其它

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包

<!-- 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了,则可以进行下一步了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: