shiro无状态学习---(1)

shiro无状态学习---(1)

第一个项目:实现禁用session

项目搭建:这里使用springboot作为基础搭建一个基础的springmvc框架

1、创建项目


这样,一个基本的spring boot就党建好了,访问

http://localhost:8080/hello?params1=你好&params2=世界,就会打印出 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的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了,则可以进行下一步了。





猜你喜欢

转载自blog.csdn.net/qq_35267557/article/details/78785877
今日推荐