当前位置: 首页 > article >正文

shiro整合redis

shiro整合redis

前言:shiro默认的session是存储在jvm内存中的,这样会导致java服务内存占用更大以及一旦服务器宕机或者版本迭代需要重启服务时,缓存中的数据不能恢复,导致用户需要重新登录认证,体验很差。因此利用第三方服务作为缓存十分重要。

shiro有相关的shiro-redis整合的依赖包,使用起来也十分方便,下面就介绍下使用方法

本文前提是已搭建好shiro的简单框架,配置好realm以及配置类(设置好SecurityManager等)

1.引入shiro-redis依赖

		<!-- shiro -->
		<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-spring</artifactId>
			<version>1.13.0</version>
		</dependency>		
		<!-- shiro-redis -->
		<dependency>
			<groupId>org.crazycake</groupId>
			<artifactId>shiro-redis</artifactId>
			<version>3.3.1</version>
		</dependency>

2.配置redis数据源

其实不需要配置,因为在下面的RedisManager是直接将参数设置进入的,yaml文件的配置并不生效。

但是因为其他业务也可能用到redis,所以在yaml中配置,下面的RedisManager可以通过@Value(“$spring.redis.xxx”)进行引入,避免撤换redis数据源时,需要修改多处地方。

spring:
  redis:
    host: 127.0.0.1
    port: 6379
    database: 0
    jedis:
      pool:
        max-idle: 8
        min-idle: 0
        max-active: 8
        max-wait: -1
    timeout: 0

3.配置ShiroConfig类

在ShiroConfig类中,将redis设置为session的缓存,在原有基础上添加以下代码

    /**
     * redisManager
     * @return
     */
    public RedisManager redisManager() {
        RedisManager redisManager = new RedisManager();
        // 高版本的shiro-redis,取消setPort方法,需要将Port和Host写在一起
        redisManager.setHost("127.0.0.1:6379");
        // 配置过期时间
        redisManager.setTimeout(1800);
        return redisManager;
    }

    /**
     * cacheManager
     * @return
     */
    public RedisCacheManager cacheManager() {
        RedisCacheManager redisCacheManager = new RedisCacheManager();
        redisCacheManager.setRedisManager(redisManager());
        return redisCacheManager;
    }

    /**
     * redisSessionDAO
     */
    public RedisSessionDAO redisSessionDAO() {
        RedisSessionDAO redisSessionDAO = new RedisSessionDAO();
        redisSessionDAO.setRedisManager(redisManager());
        return redisSessionDAO;
    }

    /**
     * sessionManager
     */
    public DefaultWebSessionManager SessionManager() {
        DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
        sessionManager.setSessionDAO(redisSessionDAO());
        return sessionManager;
    }

然后在之前的配置上,将session管理器和cache管理器注入到SecurityManager中

    /**
     * 配置SecurityManager
     * @param myRealm
     * @return
     */
    @Bean
    public SecurityManager securityManager(Realm myRealm){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        //设置一个Realm,这个Realm是最终用于完成我们的认证号和授权操作的具体对象
        securityManager.setRealm(myRealm);
        securityManager.setSessionManager(sessionManager());
        securityManager.setCacheManager(cacheManager());
        return securityManager;
    }

4.测试

保证redis参数正常,连接正常,启动项目

访问登录连接
在这里插入图片描述

redis被成功写入,见下图

在这里插入图片描述

经过在doGetAuthenticationInfo方法和doGetAuthorizationInfo方法中设置简单输出语句,发现只在第一次登录时进入认证方法,第一次授权时进入授权方法。后续都不再进入该方法。

至此,Shiro+Redis集成完毕


http://www.kler.cn/news/150102.html

相关文章:

  • 匿名内部类(内部类) - Java
  • git-4
  • 前五年—中国十大科技进展新闻(2012年—2017年)
  • leetcode面试经典150题——30 长度最小的子数组
  • Leetcode—15.三数之和【中等】
  • Attacking Fake News Detectors via Manipulating News Social Engagement(2023 WWW)
  • 黑马程序员索引学习笔记
  • PTA:猜帽子游戏 ,C语言
  • open与openat的区别
  • Linux uname命令教程:如何打印linux操作系统名称和硬件的基本信息(附实例教程和注意事项)
  • SCI的写作前提——认识论文的本质
  • Python+requests+Jenkins接口自动化测试实例
  • linux查询某个进程使用的内存量
  • 复位电路的电阻电容的作用
  • 如何设置Linux终端提示信息
  • Qt 信号与槽简介
  • 案例:某电子产品电商平台借助监控易保障网络正常运行
  • unity shaderGraph实例-可交互瀑布
  • C++ day45 爬楼梯 零钱兑换 完全平方数
  • 大数据基础设施搭建 - Sqoop
  • AI搜索相关性在网站和APP上的应用
  • 致远M3 反序列化RCE漏洞复现(XVE-2023-24878)
  • C++算法入门练习——数据流第K大元素
  • JavaWeb | JSP访问数据库、JDBC操作
  • 学习计划计划执行记录
  • 【数据结构】——解决topk问题
  • 存储服务器特征是什么
  • 零基础学Python的第四天||字符串(1)
  • 力扣:184. 部门工资最高的员工(Python3)
  • python getattr() setattr() hasattr() delattr()内置函数详解