shiro实现基于redis的sessionDao

2023-11-16

shiro实现基于redis的sessionDao

将session持久化到数据库的一个关键步骤是对session对象的序列化和反序列化操作,另外在使用redis保存session时一定要设置过期时间,或在编码中检查过期并及时删除缓存,否则会导致session堆积。

具体代码如下:

/**
 * 自定义基于redis的session持久化dao
 * @author ah
 */
public class RedisSessionDao extends CachingSessionDAO {

    private RedisUtil redisUtil;

    public RedisSessionDao(RedisUtil redisUtil) {
        this.redisUtil = redisUtil;
    }

    /**
     * 更新会话;如更新会话最后访问时间/停止会话/设置超时时间/设置移除属性等会调用
     * @param session
     */
    @Override
    protected void doUpdate(Session session) {
        if(session instanceof ValidatingSession && !((ValidatingSession)session).isValid()) {
            return; //如果会话过期/停止 没必要再更新了
        }
        redisUtil.set(RC.key(RC.SEN, Arrays.toString(session.getId().toString().getBytes())), sessionToByte(session));
    }

    /**
     * 删除会话;当会话过期/会话停止(如用户退出时)会调用
     * @param session
     */
    @Override
    protected void doDelete(Session session) {
        redisUtil.del(RC.key(RC.SEN, Arrays.toString(session.getId().toString().getBytes())));
    }

    /**
     * DefaultSessionManager在创建完session后会调用该方法;保存到关系数据库/文件系统/NoSQL数据库;
     * 即可以实现会话的持久化;返回会话ID;主要此处返回的ID.equals(session.getId());
     * @param session
     * @return
     */
    @Override
    protected Serializable doCreate(Session session) {
        Serializable sessionId = generateSessionId(session);
        assignSessionId(session, sessionId);
        redisUtil.set(RC.key(RC.SEN, Arrays.toString(sessionId.toString().getBytes())), sessionToByte(session), session.getTimeout());
        return session.getId();
    }

    /**
     * 根据会话ID获取会话
     * @param serializable
     * @return
     */
    @Override
    protected Session doReadSession(Serializable serializable) {
        Object obj = redisUtil.get(RC.key(RC.SEN, Arrays.toString(serializable.toString().getBytes())));
        if (obj != null) {
            byte[] sessionBytes = (byte[]) redisUtil.get(Arrays.toString(serializable.toString().getBytes()));
            Session session = byteToSession(sessionBytes);
            return session;
        }
        return null;
    }

    // 把session对象转化为byte保存到redis中
    public byte[] sessionToByte(Session session){
        ByteArrayOutputStream bo = new ByteArrayOutputStream();
        byte[] bytes = null;
        try {
            ObjectOutputStream oo = new ObjectOutputStream(bo);
            oo.writeObject(session);
            bytes = bo.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bytes;
    }

    // 把byte还原为session
    public Session byteToSession(byte[] bytes){
        ByteArrayInputStream bi = new ByteArrayInputStream(bytes);
        ObjectInputStream in;
        SimpleSession session = null;
        try {
            in = new ObjectInputStream(bi);
            session = (SimpleSession) in.readObject();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return session;
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shiro实现基于redis的sessionDao 的相关文章

  • openFileOutput 在单例类中无法正常工作 - 想法/解决方法?

    作为一名 Android 开发新手 我遇到了一些奇怪的问题 我想创建一个类 它方法其他类 活动 任何可以用于以某种特殊方式处理文件的类 假设为了简单起见 我们将记录一些内容 如果我在活动中执行以下操作 例如在 OnClick 侦听器中 则一
  • Selector.close() 是否关闭所有客户端套接字?

    我是 nio 套接字的新手 我已经使用 nio 套接字编写了一个服务器 现在我正在尝试编写关闭钩子以确保通过清理资源正常退出 我的问题是Selector close 方法关闭所有客户端套接字 如果没有 请告诉我如何访问所有客户端套接字 而无
  • ZeroDateTimeBehavior=convertToNull 在使用 hibernate 的 jdbc url 中不起作用

    通过 extern 属性文件 url 指定如下 jdbc mariadb xxxxx 3306 xxxxx zeroDateTimeBehavior convertToNull 连接工作正常并且能够查询数据库 通过休眠 我创建了一个映射到带
  • JAX-WS 入门 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有人可以推荐一些关于 JAX WS 入门的好教程吗 使用各种工具 如 wsgen 等 您可以从这里开始 通过 Java SE 6 平台介绍
  • java中高效的输入流到字符串方法

    因此 我在 Java 中的 诚然非常简单 应用程序上运行探查器 令我惊讶的是 仅次于需要在时间上发出 HTTP 请求的方法的是我的方法 inputStreamToString方法 目前它的定义如下 public static String
  • 当我们使用赋值而不是比较时,如何评估 if/while 条件?

    我在学习 Java 的 OCA OCP 时发现了这个令人惊讶的事情 下面是第一段代码 其中 if 测试条件 部分 让我惊讶 public class BooleanIf public static void main String args
  • 使用正则表达式验证电子邮件的最大长度

    我找到了用于电子邮件验证的正则表达式 a z0 9 a z0 9 a z0 9 a z0 9 a z 2 4 我希望电子邮件的最大长度为 20 个字符 因此我将其更改为 a z0 9 a z0 9 a z0 9 a z0 9 a z 2 4
  • java:为什么主线程等待子线程完成

    我有一个简单的java程序 主线程 main 创建并启动另一个线程t class T extends Thread Override public void run while true System out println Inside
  • 如何获取 JDBC 中 UPDATE 查询影响的所有行?

    我有一项任务需要使用更新记录PreparedStatement 一旦记录被更新 我们知道更新查询返回计数 即受影响的行数 但是 我想要的不是计数 而是受更新查询影响的行作为响应 或者至少是受影响的行的 id 值列表 这是我的更新查询 UPD
  • 始终将双精度舍入

    我怎么总是能把一个double to an int 并且永远不要将其四舍五入 我知道Math round double 但我希望它始终向上舍入 所以如果是的话3 2 四舍五入为 4 您可以使用Math ceil method 请参阅Java
  • javadoc 子集/java 库组织

    我自己从来没有运行过javadoc 无论是在命令行还是ant 的 javadoc 任务 http ant apache org manual Tasks javadoc html 我将使用 ant 我需要为我编写的库生成 javadoc 问
  • 获取接收者的设备令牌以在 Firebase 中发送通知

    所以我正在学习如何使用 firebase 发送设备到设备的通知 我看到了这个answer https stackoverflow com a 42548586 5237289发送通知 看起来很简单 现在 我知道要获取发件人的令牌 它应该如下
  • 向Java类库添加函数

    我使用的 Java 类库在很多方面都不完整 有很多类我认为应该内置其他成员函数 但是 我不确定添加这些成员函数的最佳实践 让我们调用不足的基类A class A public A long arbitrary arguments publi
  • 如何在一次操作中使用 Thymeleaf 检查 null 和空条件?

    有什么方法可以检查 Thymeleaf 中的 null 和empty 条件吗 方法一 1 variable1 variable2 variable3 2 variable null 3 variable 如果我们结合两个条件 例如 vari
  • log4j.properties 在 Wildfly 上无法正常工作

    我的类路径中有一个 log4j properties 文件 它位于 APP XX jar log4j properties 位置 我注意到在ear文件中我还可以在lib文件夹中找到log4j 1 2 17 jar 但无论我在 log4j p
  • 难以理解 通配符

    我有一个非常基本的问题 下面的代码无法编译 假设 Apple Extends Fruit List
  • 为什么/何时应该使用泛型方法?

    学习Java的时候遇到过通用方法 public
  • 使用 Hibernate Envers 的复合表

    我有一个带有复合表的应用程序 其中包含一个额外的列 一切正常 直到我们添加 Hibernate Envers Audited org hibernate MappingException 无法读取 no pack response Resp
  • junit4 使用特定测试方法创建测试套件

    在 junit4 中 我想执行来自不同类的特定测试方法 即想要使用来自不同类的特定测试方法创建一个测试套件 假设我有两门课 public class Test Login Test public void test Login 001 Sy
  • Graphics2D setfont() 严重减慢了 java 应用程序的启动速度

    我正在用java制作一个游戏 它每秒刷新60次 每次执行循环时 我都会使用 g2d 来绘制图像和字符串 如果我这样做的话一切都会很好g2d setFont new Font Arial Font PLAIN 8 和抽绳 这将是正常的 但如果

随机推荐

  • 【FreeRTOS 事件】任务通知事件

    普通任务通知事件创建创建及运行 参阅安富莱电子demo define BIT 0 1 lt lt 0 define BIT 1 1 lt lt 1 static TaskHandle t xHandleTaskUserIF NULL sta
  • Linux学习(三):删除命令rm的注意事项

    rm fir 文件或者目录 f 就是force的意思 忽略不存在的文件 不会出现警告信息 i 互动模式 在删除前会询问用户是否确定操作 r 递归删除 最常用的目录删除 这是非常危险的参数
  • vue_elementui_formatter的使用方法_elementui提取table表格使用formatter方法

    后台管理系统中用到了非常多的表格 一般为了方便都会讲表格进行提取 形成公共组件 提取表格时会遇到返回的json数据中要对单个字段进行处理 如时间戳转换 状态转换等 封装的表格组件代码
  • 解决Win10无法安装.Net Framework 3.5,错误代码0x800F081F

    重新安装了一遍Win10 但是不知怎的无法安装 net framework 3 5 即便是下载离线安装包也没法用 网上有人说需要使用win10的ISO文件 个人感觉太麻烦 在这里分享一个很方便的操作 首先 你需要下载cab版的 net3 5
  • caffe学习记录(三):多标签分类/回归训练(下)

    接上篇 我们已经为caffe添加了多标签分类训练功能 多标签分类的训练过程和单标签非常相似 同样包含以下几个步骤 一 准备多标签分类 回归训练的数据集 train txt val txt test txt 这里我们以MTCNN人脸检测网络中
  • 如何基于Llama 2搭建自己的大模型?4位技术大牛手把手教你

    Datawhale分享 大模型应用 机器之心 x Datawhale Meta 的 Llama 2 一开源便获得了 将改变大模型格局 的广泛认同 很大原因是因为它支持了商用 月活用户超过 7 亿需单独申请 这让大模型的竞争不再仅限于巨头之间
  • 网络安全:njRAT远控工具

    远控在渗透实战中的维权操作相当重要 今天为大家介绍一款工具 njrat 一 远控木马 远程控制型木马 远程控制可以对目标计算机进行交互性访问 实时或非实时 可以下发相应的指令触发恶意软件的功能 也能获取目标的各种数据 二 工具使用 1 在一
  • Mac的yarn安装教程,解决zsh: command not found: yarn

    curl o L https yarnpkg com install sh bash open zshrc 文件最后一行添加 export PATH HOME yarn bin HOME config yarn global node mo
  • Android Sqlite Failed to open database(无法打开数据库文件)

    在学习和使用Android SQLite操作的时候碰到一个错误 无法打开文件 10 11 15 00 44 374 E SQLiteDatabase 18129 Failed to open database data data com e
  • ZooKeeper 典型应用场景一览

    ZooKeeper 典型应用场景一览 数据发布与订阅 配置中心 发布与订阅模型 即所谓的配置中心 顾名思义就是发布者将数据发布到ZK节点上 供订阅者动态获取数据 实现配置信息的集中式管理和动态更新 例如全局的配置信息 服务式服务框架的服务地
  • rts5129无线驱动linux,ubuntu下adb工具的安装以及usb接口权限问题error: insufficient permissions for device: user in plugd...

    简述 adb Android Debug Bridge安卓调试桥接器 是Android sdk 安卓开发工具包 里的一个工具 使用该工具可以用CLI直接操作管理真机andriod设备或android模拟器 安装 直接使用apt命令安装and
  • jeecg问题解决方案

    1 jeecg数据库脚本问题 注意 jeecg3 5 2之前版本 不需要数据库脚本 程序会自动初始化数据库 从3 5 2 开始 需要手工执行SQL脚本 初始化数据库 2 Eclipse内存溢出 2014 6 27 15 29 21 org
  • python如何输出数组_python如何显示数组

    np set printoptions方法的相关属性 set printoptions precision None threshold None edgeitems None linewidth None suppress None na
  • 以太坊私有链搭建教程

    写在前面 写这个主要是为了记录下自己的学习过程 同时如果能帮助到同样想搭建私有链的朋友们 那是再好不过了 Step 1 环境搭建 私链搭建有三宝 环境 终端和钱包 我这里用到的是Geth客户端 所以环境当然就是指Go语言运行环境 Ether
  • 使用PlotNeuralNet绘制深度学习网络图的基本操作(二)

    使用PlotNeuralNet绘制深度学习网络图的基本操作 二 接下来我们利用pycharm来绘制当中我们的神经网络模型架构 目标是直接将 tex文件生成为pdf和png 我在学习的过程中参考了一些学习视频 觉得这个up主讲的还不错 1 P
  • MySQL 模糊查询和分组查询

    模糊查询 LIKE 常用的通配字符串 通配符 通配多个字符 表示0 n个任意字符 通配符 通配单个字符串 语法规则 SELECT 字段名 FROM 表名 WHERE 字段名 LIKE 匹配内容 注释 这里的like是 像 的意思 若需要表示
  • SpringBoot:分页Pageable最大size配置

    一 在yml中定义 spring data web pageable max page size 100 注 Pageable 默认size 20 最大不超过size 2000 二 自定义每页大小逻辑 参考 SpringBoot分页Page
  • 3D打印模型切片生成路径小软件

    1 界面主窗口 2 生成模型切片设置界面 3 查看切片结果 4 生成路径设置界面 5 查看路径生成结果 6 查看单层切片以及路径结果 并编辑 更多信息请关注微信公众号
  • R语言深度学习:图神经网络GNN应用案例

    目录 引言 数据集 数据预处理 1 构建图结构 2 构建邻接矩阵
  • shiro实现基于redis的sessionDao

    shiro实现基于redis的sessionDao 将session持久化到数据库的一个关键步骤是对session对象的序列化和反序列化操作 另外在使用redis保存session时一定要设置过期时间 或在编码中检查过期并及时删除缓存 否则