zoukankan      html  css  js  c++  java
  • shiro缓存管理

    shiro缓存现象

    shiro缓存主要就是换成用户的授权信息,就是将我们的自定义realm的doGetAuthorizationInfo方法就是给用户授权的方法进行缓存.
    如果不使用缓存,那么每次进行用户权限判断的时候就会调用一下授权方法:
    我请求一下isPermitted就会调用一下授权方法,
    在这里插入图片描述

    如果我设置了缓存:

    在这里插入图片描述
    这时候不过请求多少次都只会调用一次授权,如果退出就会删除缓存
    在这里插入图片描述

    缓存源码分析

    首先看shiro架构图(这个图重要的要人命,建议作为屏保壁纸):
    在这里插入图片描述
    CacheManager就是在SecurityManager内部,所以,SecurityManager肯定有个setCacheManager方法,前面在讲SecurityManager的时候,不知道你们还记不记得,当时将DefaultSecurityManager的uml图的时候,是不是有个
    在这里插入图片描述
    Realm里面也有个缓存Cachingrealm,别搞混了.毫无疑问,方法肯定在CachingSecurityManager里面了,直接通过defaultWebSecurityManager.setCacheManager里面点进去就到CachingSecurityManager里面了,传入的是个CacheManager,注意,CachingSecurityManager实现的是CacheManagerAware,而这个CacheManagerAware就像spring中的Aware接口,为了能让类能够感知到自身的一些属性.

    shiro提供的基于内存的CacheManager

    使用缓存如上面,直接加在 defaultWebSecurityManager.setCacheManager()即可.
    直接看CacheManager的实现:MemoryConstrainedCacheManager
    这个类是Shiro提供的一个简单的缓存处理器,就是返回一个简单的Cache的实现基于Map的:
    在这里插入图片描述
    在这里插入图片描述
    就不细说了,比较简单.

    基于Ehcache的缓存

    引入对应的pom,注意如果shiro你直接引入的shiro-all的话,应该就不用引入shiro-ehcache包了.

    <!-- ehcache-->
            <dependency>
                <groupId>net.sf.ehcache</groupId>
                <artifactId>ehcache-core</artifactId>
                <version>2.6.11</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-ehcache -->
            <dependency>
                <groupId>org.apache.shiro</groupId>
                <artifactId>shiro-ehcache</artifactId>
                <version>1.4.2</version>
            </dependency>
    

    然后直接 webSecurityManager.setCacheManager(new EhCacheManager());
    测试结果也是一样的,我这里没有使用自定义ehcache的配置文件,因为提供了一个默认的配置文件,小伙伴可以自定义配置文件,直接通过EhCacheManagerFactoryBean来创建ehcacheManager就可以了,然后注入到EhCacheManager:
    在这里插入图片描述

    基于Redis的缓存

    我们可以直接实现,但是感觉有点麻烦,又要自己实现RedisCacheManager又要重写sessionDao实现自定义session管理,所以,简单点,使用开源的shiro-redis包即可,使用跟ehcache一样,也会很简单,直接将cachemanager缓存redisCachemanager即可:
    前面使用的user是map对象,然后整合会报错,说没有getId方法,然后我就创了一个user对象,然后就可以了,大概是因为,存入redis的时候需要set,get方法吧:
    首先引入shiro-redis包,引入了jedis就可以不用引入了,

       <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>2.9.0</version>
            </dependency>
    
            <dependency>
                <groupId>org.crazycake</groupId>
                <artifactId>shiro-redis</artifactId>
                <version>3.2.3</version>
                <exclusions>
                    <exclusion>
                        <artifactId>shiro-core</artifactId>
                        <groupId>org.apache.shiro</groupId>
                    </exclusion>
                </exclusions>
            </dependency>
    

    然后配置redisCacheManager类:

    
        @Bean
        public RedisCacheManager redisCacheManager() {
    
            RedisManager redisManager = new RedisManager();
            redisManager.setHost("localhost:6379");
            redisManager.setDatabase(1);
            redisManager.setTimeout(5000);
    //        redisManager.setPassword();
    
            RedisCacheManager redisCacheManager = new RedisCacheManager();
            redisCacheManager.setRedisManager(redisManager);
            return redisCacheManager;
        }
    

    然后还是直接射进去就好了:
    在这里插入图片描述
    这是存入redis里面的数据:
    在这里插入图片描述
    然后,redis的配置我直接写在代码里面了,具体使用应该写到配置文件里面.
    ok,使用就完成了…

    世界上所有的不公平都是由于当事人能力不足造成的.
  • 相关阅读:
    失败的项目,反思
    没人教的项目管理方法之(明白该干什么) 二、项目章程如何写(下)
    没人教的项目管理方法之(明白该干什么) 二、项目章程如何写(上)
    转载:WireShark 过滤语法
    转载:各个Linux版本的本地root密码破解方法
    w7升级旗舰版
    xmarks hosts
    Server、Workstation、Secondary Logon服务无法自启动
    windows2003,xp,RHEL 5 序列号/SN
    项目管理解决方案
  • 原文地址:https://www.cnblogs.com/javayida/p/13346780.html
Copyright © 2011-2022 走看看