我的shiro之旅: 八 shiro session 共享的进一步

集群共享session;shiro实现session共享;springboot实现redis共享session; shiro实现共享session;springboot集成redis实现共享session;集群环境下shiro共享session;shiro实现session共享 阅读详情

博客已移至 http://blog.gogl.top

在第七篇文章说了一下如何实现shiro的共享。那个共享并不只是session的共享,也包括了Authorization的共享。如果读者还没看过文章七,建议先看看。

在文章七的ShiroCacheManager类继承了AbstractCacheManager,我们来看看AbstractCacheManager类的源码。

 

public abstract class AbstractCacheManager implements CacheManager, Destroyable {

    /**
     * Retains all Cache objects maintained by this cache manager.
     */
    private final ConcurrentMap<String, Cache> caches;

    /**
     * Default no-arg constructor that instantiates an internal name-to-cache {@code ConcurrentMap}.
     */
    public AbstractCacheManager() {
        this.caches = new ConcurrentHashMap<String, Cache>();
    }

    /**
     * Returns the cache with the specified {@code name}.  If the cache instance does not yet exist, it will be lazily
     * created, retained for further access, and then returned.
     *
     * @param name the name of the cache to acquire.
     * @return the cache with the specified {@code name}.
     * @throws IllegalArgumentException if the {@code name} argument is {@code null} or does not contain text.
     * @throws CacheException           if there is a problem lazily creating a {@code Cache} instance.
     */
    public <K, V> Cache<K, V> getCache(String name) throws IllegalArgumentException, CacheException {
        if (!StringUtils.hasText(name)) {
            throw new IllegalArgumentException("Cache name cannot be null or empty.");
        }

        Cache cache;

        cache = caches.get(name);
        if (cache == null) {
            cache = createCache(name);
            Cache existing = caches.putIfAbsent(name, cache);
            if (existing != null) {
                cache = existing;
            }
        }

        //noinspection unchecked
        return cache;
    }

    /**
     * Creates a new {@code Cache} instance associated with the specified {@code name}.
     *
     * @param name the name of the cache to create
     * @return a new {@code Cache} instance associated with the specified {@code name}.
     * @throws CacheException if the {@code Cache} instance cannot be created.
     */
    protected abstract Cache createCache(String name) throws CacheException;

    /**
     * Cleanup method that first {@link LifecycleUtils#destroy destroys} all of it's managed caches and then
     * {@link java.util.Map#clear clears} out the internally referenced cache map.
     *
     * @throws Exception if any of the managed caches can't destroy properly.
     */
    public void destroy() throws Exception {
        while (!caches.isEmpty()) {
            for (Cache cache : caches.values()) {
                LifecycleUtils.destroy(cache);
            }
            caches.clear();
        }
    }

    public String toString() {
        Collection<Cache> values = caches.values();
        StringBuilder sb = new StringBuilder(getClass().getSimpleName())
                .append(" with ")
                .append(caches.size())
                .append(" cache(s)): [");
        int i = 0;
        for (Cache cache : values) {
            if (i > 0) {
                sb.append(", ");
            }
            sb.append(cache.toString());
            i++;
        }
        sb.append("]");
        return sb.toString();
    }
}


其中有个很重要的方法就是getCache方法,有个很重要的属性就是private final ConcurrentMap<String, Cache> caches;caches是一个线程安全的ConcurrentMap类型,用是存放Cache的,在这里,至少存放两个Cache,一个是用来存放session的,一个是用来存放权限(Authorization)的。从getCache方法我们可以知道,shiro先从caches里拿,如果拿不到相应的Cache,就调用createCache创建一个,createCache是抽象方法,由子类实现。创建完之后,放到Map中。

 

如果我们在getCache方法debug就可以知道,shiro创建两个Cache放到ConcurrentMap中,一个name中ShiroCasRealm.authorizationCache(这个名字的命名规则是自定义的realm的名字加".authorizationCache",realm的定义可以参考我的shiro之旅: 二 让Shiro保护你的应用),这个是shiro启动的时候创建的,用来保存认证信息,一个叫shiro-activeSessionCache,这个是第一次创建session的时候创建的,用来保存session。当用户登录的时候,将会把用户的权限信息保存到name为ShiroCasRealm.authorizationCache的Cache中,以后需要再使用权限信息,直接从Cache中拿而不需要再从数据库中查询。这样也有一个问题,就是当用户权限改变时,就需要用户重新登录把权限信息从新load到Cache中。不过既然我们知道Cache的名字,我们就可以拿到这个Cache,然后把用户的权限信息删除,让shiro在授权时找不到权限而shiro自己从新去load,甚至我们可以删除了,然后再从新load到Cache中。这些将在以后的文章有介绍。

session我们是放到了缓存中(memcached),那自然我们就可以在多个应用去使用它。只要从个应用的ShiroMemcachedCache连的都是一个memcached,就可以把session保存到一个memcached中,就可以从同一个memcached去得到session。

使用Shiro+Redis实现Session共享 章节目录1. 为什么要实现Session共享?1.1 负载均衡1.2 负载均衡中的Session问题1.3 案例演示2. Shiro架构3. Shiro集成Redis 1. 为什么要实现Session共享? 说到这个问题,我们先来了解一下负载均衡的概念吧 1.1 负载均衡 当一个项目的访问量很大时,一个Tomcat吃不消,这时候就准备多个Tomcat,由Nginx按照权重来对请求进行分配,从而缓解单独一个Tomcat受到的压力。 如果想进一步了解的话,可以访问网站:Nginx 负载均衡 1.2 负载均衡中的 阅读详情

相关推荐

spring boot整合redis实现shiro的分布式session共享

我们知道,shiro是通过SessionManager来管理Session的,而对于Session的操作则是通过SessionDao来实现的,默认的情况下,shiro实现了两种SessionDao,分别为CachingSessionDAO和MemorySessionDAO,当我们使用EhCache缓存时,则是使用的CachingSessionDAO,不适用缓存的情况下,就会选择基于内存的Sessi

牛奋lch 1万+

【Shiro】shiro的Session管理

【Shiro】shiro的Session管理1. Session管理介绍2. JavaSE环境下3. JavaEE环境下4. Session监听5. Session检测 1. Session管理介绍 shiro作为⼀款安全管理框架,对状态保持有很强的需要。 ⽐如最常⽤的⽤户认证,就必需状态的保持,以及其他的⼀些功能实现的需要。 【shiro需要:认证中的 记住我中的⽤户名 正式登陆的⽤户名 】 【 开发者需要:其他功能中需要存⼊session的值 】 shiro提供了⼀整套session管理⽅案. 1. s

来日浅谈的博客 2180

Shiro集成redis实现session共享

Shiro集成redis实现session共享

qq_46826837的博客 1232

shiro授权源码分析(session的作用)

文章目录前言一、shiro的认证授权流程?二、使用步骤1.引入库2.读入数据总结 前言 深入源码才能了解框架正真的运行机制,在看到shiro的授权流程过后,我就在思考在权限得到认证过后,shiro是否会将认证信息进行保存,保存在什么地方,下一次用户进行访问的时候shiro是通过什么样的方法判断用户已经得到认证,可以直接进行权限的判定。 提示:以下是本篇文章正文内容,下面案例可供参考 一、shiro的认证授权流程? 二、使用步骤 1.引入库 代码如下(示例): import numpy as np im

qq_43469298的博客 487

nginx+tomcat shiro实现多tomcat下session共享

分布式nginx多tomcat shiro共享session

【PT+Arduino+OneNET基础教程1】PacketTracer中MCU芯片编程教程(零基础入门)

PacketTracer软件内MCU芯片编程入门 零基础

ChloeMax_的博客 9455

Shiro中的session共享问题(如果再也见不到你,祝你早安,午安,晚安。)

当我们通过nginx反向代理到我们的集群后,如果用户再进行登录,用户的session会存储在第一次负载均衡到的服务器上,但是如果我们调用其中的一些功能或者说权限后,用户在另外一台服务器上并没有session信息,就会导致提示未登录问题,需要用户再次进行登录。但是我们不可能让用户登录很多次,这对用户的体验来说是非常不友好的,因此解决shiro安全框架中的session问题是非常有必要的。

生命不止,学习无休 930

自制JS某课脚本

根据实际需求自制网页讯网刷题脚本,绕过人脸,弹窗,答题,实现自动化运行

2301_81243054的博客 3459

shiro的缓存及session.html

shiro的缓存及session.html

weixin_67696142的博客 381

AI全景之第八章第三节:时间序列分析与预测技术

摘要 时间序列分析与预测技术从传统统计模型发展到深度学习方法。传统方法包括ARIMA模型(处理趋势和季节性)、指数平滑(加权平均预测)和状态空间模型(概率框架分解)。机器学习方法通过特征工程和树模型提升非线性建模能力。深度学习方法中,RNN/LSTM处理序列依赖,TCN利用因果卷积,Transformer通过注意力机制捕获长程依赖。当前研究趋势结合神经符号方法和生成模型,以提高预测精度和可解释性。不同方法各具优势,需根据数据特性和预测需求选择。

技术引领业务创新 991

通信原理期末考试试题及答案

五、(总分12分)设某信道具有均匀的的双边噪声功率谱密度在该信道中传输抑制载波的单边带(上边带)信号,并设调制信号m(t)的频带限制在5K HZ,而载波为100 K HZ,已调信号的功率为10KW。:(1)单边带信号的载频为100kHz,带宽B=5kHz,为使信号顺利通过,理想带通滤波器的中心频率为。8、对最高频率为fH的调制信号m(t)分别进行AM、DSB、SSB调制,相应已调信号的带宽分别为。7、设调制信号为f(t)载波为,则抑制载波双边带调幅信号的时域表达式为,频域表达式为。

qq_67692062的博客 2393

springboot+shiro+redis实现session共享和cache共享

在分布式应用中,若是使用了负载均衡,用户第一次访问,连接的A服务器,进行了登录操作进入了系统,当用户再次操作时,请求被转发到了B服务器,用户并没有在B进行登录,此时用户又来到了登录页面,这是难以理解和接受的,这就引出了session共享。对于shiro安全框架如何实现session共享?shiro共享分为两方面,一个是session共享,一个是cache共享。下面聊聊在springboot工程中整合shiro框架,并通过redis实现session共享和cache共享。

ldcaws的专栏 3490

WordPress主题开发实战:从零开始手把手教你创建自定义主题(含常用函数大全)

本文是一份WordPress主题开发实战指南,从零开始手把手教你创建自定义主题。内容涵盖主题核心文件结构、模板层级与循环机制、函数与钩子的运用,并附有详细的常用函数大全,帮助开发者彻底掌握主题开发的核心技能,实现从使用者到创造者的转变。

weixin_27943395的博客 256

SpringBoot整合Redis实现Shiro分布式Session共享

前言: 我们知道shiro有一套自身的session管理机制,默认的session是存储在运行jvm内存中的,在单应用服务器中可共享session,但系统若为分布式架构,则不同应用服务器之间无法共享session,要实现不同应用服务器之间共享session,则需要重写SessionManager中的SessionDao,把session存储在缓存中,这里我们采用redis来存储,引用shiro-...

王绍桦 1万+

从零实战:基于华中8型数控系统的CNC数据采集与二次开发

本文详细介绍了基于华中8型数控系统的CNC数据采集与二次开发实战指南。从开发环境准备到核心数据采集实现,涵盖Windows平台配置、实时数据采集、报警处理等关键技术,帮助开发者快速掌握华中数控系统的数据采集能力,提升智能制造水平。

weixin_42561143的博客 813

lammps案例:聚乙烯和石墨烯界面pull out模拟

大家好,我是小马老师。 本文介绍lammps模拟计算界面结合力的一个案例。 本案例参考论文《The interfacial mechanical properties of functionalized graphene- polymer nanocomposites》,对论文作者表示感谢。 模型共分2层,上层为聚乙烯模型,下次为单层石墨烯,模拟过程共分3部分:建模、弛豫、拉伸。 (1)建模 使用MS建立聚乙烯和石墨烯模型,具体方法可参考之前的推文,使用build layer方法建立聚乙烯和石墨烯组合模型,

lammps_jiayou的博客 3496

集群session共享方案(有shiro共享session的方案)

转载部分:http://www.cnblogs.com/beyang/p/6104802.html 在Web项目开发中,会话管理是一个很重要的部分,用于存储与用户相关的数据。通常是由符合session规范的容器来负责存储管理,也就是一旦容器关闭,重启会导致会话失效。因此打造一个高可用性的系统,必须将session管理从容器中独立出来。而这实现方案有很多种,下面简单介绍下:   第一种是

Sunny的专栏 6648

7.19华为OD机试真题 新系统 - 物流仓储多维度成本利润综合查询系统 (Java/Py/C/C++/Js/Go)

7.19华为OD机试真题 新系统 - 物流仓储多维度成本利润综合查询系统 (Java/Py/C/C++/Js/Go)

算法大师! 618

Shiro配置cookie以及共享Session和Session失效问题

Shiro的会话管理器的配置 <!-- shiro会话管理 --> <!-- 即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通 JavaSE 环境的,也可以是如 Web 环境的 --> <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> <property name=.

我的博客 1810

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

我的shiro之旅: 七 shiro session 共享

博客已移至 http://blog.gogl.top 很久没有写过博文,一来是因为工作比较紧,二来是因为很长一段时间没有写博文的心情。今天,想继续写写shiro的一些文章,这篇文章只要想分享的是shiro 共享session的内容。         在这里先给出我的shiro配置文件。        &lt;bean id="shiroRealm" class="com....

Dylan的博文 1万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

springboot+redis+shiro+spring-session实现session共享

系统中用了shiro做权限控制和身份认证(其实身份认证可以用jwt的,这在我以后的博客中会写到)。本来是单一系统。但是现在要做成分布式的。所以就只能用到session共享。其实不用spring-session也能实现session共享,只需要将session存入redis即可。但是spring-session作为现成的框架,把许多底层的东西都已经封装了,不用白不用啊。spring-ses...

龙ygl龙的博客 7546

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Shiro教程(七)Shiro Session共享配置以及实现

Shiro 我们通过重写AbstractSessionDAO ,来实现 Session 共享。再重写 Session 的时候(其实也不算重写),因为和HttpSession 没有任何实现或者继承关系。 首先 Shiro Session 配置讲解。 Session 的每个回话的ID 生成器,我们用JavaUuidSessionIdGenerator (UUID 规则)。 ...

baidu_37366055的博客 2133

shiro整合redis实现session共享

shiro整合redis实现session共享        通过nginx实现负载均衡后,同一客户端的请求会被分配到不同的服务器,减少了单机模式下服务器的压力,但同时也带来了问题,用户第一次访问服务器后,session保存在了一台服务器,之后再次请求,若nginx将请求分配到其他服务器,其他服务器根据cookie中的sessionId找不到对应的session,用户就需要重新登录。     &nb

qq_36816062的博客 1874

使用Shiro共享Session模拟单点登录

首先我们看Shiro的会话管理器的配置 <!-- shiro会话管理 --> <!-- 即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通 JavaSE 环境的,也可以是如 Web 环境的 --> <bean id="sessionManager" class="org.apache.shiro.web.session...

李昊翔的优快云 885

shiro-会话管理(session管理)

shiro-会话管理(session管理) shiro自己实现了一套session管理体系可以在不借助任何web容器或servlet的情况下使用session。 1.SessionManager(session管理器)、SessionDAO(实现session的增删改查) 2.Redis实现Session共享 3.Redis实现Session共享存在的问题 代码: pom.xml文件中添加依赖 ...

加油吧,少年! 3041

SpringBoot集成Shiro+Redis实现session共享

一、前言 当我们的用户量到达一定程度的时候,单机的服务器已经支撑不了目前的访问量,我们肯定需要对服务器做集群来提高应用的负载能力.比如我们使用Nginx+Tomcat来实现集群,如果使用的是轮询的测试,我肯定需要涉及到Session共享的问题,解决Session共享有很多种方案,我们选择的是Shiro+Redis来实现。因为Shiro中本身就提供了sessionManager和sessionDA...

嗜血幽灵的专栏 1295
上一篇: 我的shiro之旅: 七 shiro session 共享
下一篇: 我的shiro之旅: 九 shiro 清理缓存的权限信息
LHacker
博客等级 码龄17年 162粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值