前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >快速学习Shiro-Shiro中的会话管理

快速学习Shiro-Shiro中的会话管理

作者头像
cwl_java
发布于 2020-01-02 03:49:48
发布于 2020-01-02 03:49:48
1.1K00
代码可运行
举报
文章被收录于专栏:cwl_Javacwl_Java
运行总次数:0
代码可运行

2 Shiro中的会话管理

在shiro里所有的用户的会话信息都会由Shiro来进行控制,shiro提供的会话可以用于JavaSE/JavaEE环境,不依赖于任何底层容器,可以独立使用,是完整的会话模块。通过Shiro的会话管理器(SessionManager)进行统一的会话管理

2.1 什么是shiro的会话管理

SessionManager(会话管理器):管理所有Subject的session包括创建、维护、删除、失效、验证等工作。SessionManager是顶层组件,由SecurityManager管理

shiro提供了三个默认实现:

  1. DefaultSessionManager:用于JavaSE环境
  2. ServletContainerSessionManager:用于Web环境,直接使用servlet容器的会话。
  3. DefaultWebSessionManager:用于web环境,自己维护会话(自己维护着会话,直接废弃了Servlet容器的会话管理)。

在web程序中,通过shiro的Subject.login()方法登录成功后,用户的认证信息实际上是保存在HttpSession中的通过如下代码验证。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 //登录成功后,打印所有session内容
 @RequestMapping(value="/show")
  public String show(HttpSession session) {
        // 获取session中所有的键值
        Enumeration<?> enumeration = session.getAttributeNames();
        // 遍历enumeration中的
        while (enumeration.hasMoreElements()) {
            // 获取session键值
            String name = enumeration.nextElement().toString();
            // 根据键值取session中的值
            Object value = session.getAttribute(name);
            // 打印结果
            System.out.println("<B>" + name + "</B>=" + value + "<br>/n");
       }
        return "查看session成功";
   }

2.2 应用场景分析

在分布式系统或者微服务架构下,都是通过统一的认证中心进行用户认证。如果使用默认会话管理,用户信息只会保存到一台服务器上。那么其他服务就需要进行会话的同步。

会话管理器可以指定sessionId的生成以及获取方式。 通过sessionDao完成模拟session存入,取出等操作

2.3 Shiro结合redis的统一会话管理

2.3.1 步骤分析

2.3.2 构建环境

(1)使用开源组件Shiro-Redis可以方便的构建shiro与redis的整合工程。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
	 <groupId>org.crazycake</groupId>
	 <artifactId>shiro-redis</artifactId>
	 <version>3.0.0</version>
</dependency>

(2) 在springboot配置文件中添加redis配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 redis:
   host: 127.0.0.1
   port: 6379

2.3.3 自定义shiro会话管理器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
* 自定义的sessionManager
*/
public class CustomSessionManager extends DefaultWebSessionManager {
    /**
     * 头信息中具有sessionid
     *     请求头:Authorization: sessionid
     *
     * 指定sessionId的获取方式
     */
      protected Serializable getSessionId(ServletRequest request, ServletResponse
response) {
        //获取请求头Authorization中的数据
        String id = WebUtils.toHttp(request).getHeader("Authorization");
        if(StringUtils.isEmpty(id)) {
            //如果没有携带,生成新的sessionId
            return super.getSessionId(request,response);
       }else{
            //返回sessionId;
            request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE, 
"header");
            request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, id);
           
request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, 
Boolean.TRUE);
            return id;
       }
   }
}

2.3.4 配置Shiro基于redis的会话管理

在Shiro配置类 cn.itcast.shiro.ShiroConfiguration 配置

  1. 配置shiro的RedisManager,通过shiro-redis包提供的RedisManager统一对redis操作
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
//配置shiro redisManager
public RedisManager redisManager() {
    RedisManager redisManager = new RedisManager();
    redisManager.setHost(host);
    redisManager.setPort(port);
    return redisManager; 
 }
  1. Shiro内部有自己的本地缓存机制,为了更加统一方便管理,全部替换redis实现
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//配置Shiro的缓存管理器
//使用redis实现
public RedisCacheManager cacheManager() {
	 RedisCacheManager redisCacheManager = new RedisCacheManager();
	 redisCacheManager.setRedisManager(redisManager());
	 return redisCacheManager; 
 }
  1. 配置SessionDao,使用shiro-redis实现的基于redis的sessionDao
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
* RedisSessionDAO shiro sessionDao层的实现 通过redis
* 使用的是shiro-redis开源插件
*/
public RedisSessionDAO redisSessionDAO() {
    RedisSessionDAO redisSessionDAO = new RedisSessionDAO();
    redisSessionDAO.setRedisManager(redisManager());
    return redisSessionDAO;
 }
  1. 配置会话管理器,指定sessionDao的依赖关系
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    /**
     * 3.会话管理器
     */
    public DefaultWebSessionManager sessionManager() {
        CustomSessionManager sessionManager = new CustomSessionManager();
        sessionManager.setSessionDAO(redisSessionDAO());
        return sessionManager;
   }
  1. 统一交给SecurityManager管理
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//配置安全管理器
    @Bean
    public SecurityManager securityManager(CustomRealm realm) {
        //使用默认的安全管理器
        DefaultWebSecurityManager securityManager = new
DefaultWebSecurityManager(realm);
        // 自定义session管理 使用redis
        securityManager.setSessionManager(sessionManager());
        // 自定义缓存实现 使用redis
        securityManager.setCacheManager(cacheManager());
        //将自定义的realm交给安全管理器统一调度管理
        securityManager.setRealm(realm);
        return securityManager;
   }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
.NET 9中的异常处理性能提升分析:为什么过去慢,未来快
随着现代云原生、高并发、分布式场景的大量普及,异常处理(Exception Handling)早已不再只是一个冷僻的代码路径。在高复杂度的微服务、网络服务、异步编程环境下,服务依赖的外部资源往往不可靠,偶发失效或小概率的“雪崩”场景已经十分常见。实际系统常常在高频率地抛出、传递、捕获异常,异常处理性能直接影响着系统的恢复速度、吞吐量,甚至是稳定性与容错边界。
InCerry
2025/06/09
380
.NET 9中的异常处理性能提升分析:为什么过去慢,未来快
Pythonnet:Python与.NET的无缝集成
Pythonnet是一个包,提供了与 .NET 公共语言运行时 (CLR) 近乎无缝的集成,为 Python 程序员和 .NET 开发人员提供了强大的应用程序脚本工具。它支持 Windows、Linux 和 macOS 上的 .NET Framework 和 .NET Core。Pythonnet允许将 .NET 程序集和命名空间导入为 Python 模块和包,以及从 Python 代码调用 .NET 方法和属性,反之亦然。它还支持 .NET 对象的动态类型和关键字参数,并与流行的 Python 库(如 numpy、pandas、matplotlib 等)良好集成。
jackcode
2023/06/26
7660
Pythonnet:Python与.NET的无缝集成
在C#下运行Python:IronPython和Pythonnet
为实现Python和C#之间的互操作性,有两个库可供选择:IronPython和pythonnet:
jackcode
2023/06/25
7900
在C#下运行Python:IronPython和Pythonnet
浅谈C语言,C++,Python,C#,Java,仓颉语言
C语言、Python、C++、Java和C#是当前主流的编程语言,它们在设计理念、应用场景和特性上有显著差异。以下是它们的核心区别对比:
云萌工作室
2025/03/16
3680
Python使用.NET开发的类库来提高你的程序执行效率
Python由于本身的特性原因,执行程序期间可能效率并不是很理想。在某些需要自己提高一些代码的执行效率的时候,可以考虑使用C#、C++、Rust等语言开发的库来提高python本身的执行效率。接下来,我演示一种使用.NET平台开发的类库,来演示一下Python访问.NET类库的操作实现。类库演示包括.NET Framework、.NET Standard、.NET CORE+环境。
Wesky
2024/08/13
1520
Python使用.NET开发的类库来提高你的程序执行效率
【愚公系列】2023年01月 .NET CORE工具案例-使用pythonnet实现C#和Python的融合调用
Python.NET 是一个包,几乎给Python程序员 与 .NET 公共语言运行时 (CLR) 和 为 .NET 开发人员提供功能强大的应用程序脚本工具。它 允许 Python 代码与 CLR 交互,也可用于 将 Python 嵌入到 .NET 应用程序中。
愚公搬代码
2023/03/16
2.1K0
【愚公系列】2023年01月 .NET CORE工具案例-使用pythonnet实现C#和Python的融合调用
华为自研编程语言“仓颉”来了!鸿蒙应用开发新语言,性能优于 Java、Go、Swift
在今天刚刚召开的华为开发者大会(HDC 2024)上,华为内部研发已久的国产自主编程语言仓颉终于正式对外官宣!
深度学习与Python
2024/06/27
1.6K0
华为自研编程语言“仓颉”来了!鸿蒙应用开发新语言,性能优于 Java、Go、Swift
【翻译】无需安装Python,就可以在.NET里调用Python库
原文地址:https://henon.wordpress.com/2019/06/05/using-python-libraries-in-net-without-a-python-installation/
solenovex
2019/07/02
1.3K0
10个热门.Net开源项目汇总!
项目简介:Fleck 是一个用 C# 编写的轻量级 WebSocket 服务器库。它提供了一个简单而直观的 API,使得开发者可以轻松地在他们的应用程序中集成 WebSocket 功能,比如一些常见的实时通信应用,在线游戏、聊天应用和实时数据更新等场景。
郑子铭
2025/01/09
4670
10个热门.Net开源项目汇总!
.NET周刊【3月第1期 2025-03-02】
https://www.cnblogs.com/shanyou/p/18737657
郑子铭
2025/04/19
1520
.NET周刊【3月第1期 2025-03-02】
微服务下跨语言 RPC 实现
目前主流的 Java 开发框架 Spring Boot,为了更方便集成 gRPC,自己开发了 spring-boot-starter-grpc,仅需简单的几行配置即可使用。相关使用文档如下:
轻量级云原生架构实验室
2018/08/16
2.5K0
微服务下跨语言 RPC 实现
C#也能做机器学习?基于.NET的AI智能应用市场还是一片“处女地”
SciSharp 是怎样的一个社区?它是如何构建一个基于 .NET 的机器学习生态?它在做的事情对开发者来说有何意义?本次,AI 科技大本营与 SciSharp 核心团队成员,包括 SciSharp 社区产品运营负责人,原 “微信”技术专利发明人George Zhao、 TensorFlow.NET 发起人和主要贡献者Eric Chen、NumSharp 主要贡献者 Eli Belash、Torch.NET与Numpy.NET的主要贡献者Meinrad Recheis和 ICSharpCore主要贡献者Kerry Jiang聊了聊,更加深入地了解这个 AI 社区及其产品。
AI科技大本营
2019/10/28
2.9K0
C#也能做机器学习?基于.NET的AI智能应用市场还是一片“处女地”
.NET周刊【11月第1期 2024-11-03】
.NET 9 引入了 AOT 支持,使得应用程序能够在编译时优化,以在老旧 Windows 系统上运行。这项技术通过静态编译,消除运行时的 JIT 编译,加速程序执行。尽管 Windows 7 和 XP 已不再主流,它们在某些领域仍被广泛使用。.NET 9 的 AOT 旨在提升兼容性和性能。AOT 编译程序通常执行更快,部署简单,降低了维护成本。项目配置展示了如何实现 AOT 支持,以及相关依赖的管理。
InCerry
2024/11/23
2500
.NET周刊【11月第1期 2024-11-03】
Linux下跨语言调用C++实践
总第504篇 2022年 第021篇 不同的开发语言适合不同的领域,例如Python适合做数据分析,C++适合做系统的底层开发,假如它们需要用到相同功能的基础组件,组件使用多种语言分别开发的话,不仅增加了开发和维护成本,而且不能确保多种语言间在处理效果上是一致的。本文以美团搜索实际场景下的案例,讲述在Linux系统下跨语言调用的实践,即开发一次C++语言的组件,其他语言通过跨语言调用技术调用C++组件。 1 背景介绍 2 方案概述 3 实现详情 3.1 功能代码 3.2 打包发布 3.3 业务使用 3.4
美团技术团队
2022/04/24
6.4K0
Linux下跨语言调用C++实践
Python解释器种类以及特点
Python是一种高级、通用、直译的编程语言,非常受欢迎,被用于各种领域的开发和科学研究。Python解释器是执行Python代码的核心组件,可以根据不同的需求和场景选择合适的解释器。本文将介绍几种常见的Python解释器及其特点,并提供代码示例来演示其用法。
疯狂的KK
2023/08/05
4400
Python解释器种类以及特点
.NET周刊【8月第1期 2024-08-04】
https://www.cnblogs.com/baibaomen-org/p/18338447
InCerry
2024/11/23
2360
.NET周刊【8月第1期 2024-08-04】
将 WPF 窗口嵌入到 MFC 窗口中
有一个现存的 MFC 项目,需要在里面添加新的 UI 界面,使用 MFC 开发太费劲,完全使用 WPF 再重写一遍,时间上不允许。
jgrass
2024/12/25
3620
将 WPF 窗口嵌入到 MFC 窗口中
.NET周报【11月第3期 2022-11-22】
https://mp.weixin.qq.com/s/4p89hhBPw6qv-0OB_T_TOg
InCerry
2023/03/08
3.3K0
.NET周报【11月第3期 2022-11-22】
.NET周刊【2月第4期 2025-02-23】
https://www.cnblogs.com/liuliu-66/p/-/why-tracebit-is-written-in-c-sharp
郑子铭
2025/04/13
950
.NET周刊【2月第4期 2025-02-23】
跨语言编程:在C#应用程序中调用Python
众所周知,Python在深度学习中占有绝对优势。而C#语言的优势在各种后端应用开发,特别是工业领域。当我们使用 C# 开发应用程序时,可能需要调用 Python 代码来实现某些功能。这时,我们可以使用 Python.NET 或 IronPython 等工具将 C# 与 Python 代码结合起来
double
2024/01/23
1.6K0
跨语言编程:在C#应用程序中调用Python
推荐阅读
相关推荐
.NET 9中的异常处理性能提升分析:为什么过去慢,未来快
更多 >
LV.4
后端开发工程师
目录
  • 2 Shiro中的会话管理
    • 2.1 什么是shiro的会话管理
    • 2.2 应用场景分析
    • 2.3 Shiro结合redis的统一会话管理
      • 2.3.1 步骤分析
      • 2.3.2 构建环境
      • 2.3.3 自定义shiro会话管理器
      • 2.3.4 配置Shiro基于redis的会话管理
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档