对于分布式系统,一般都牵扯到Session共享问题,
而想实现Session共享,就要实现Session的持久化操作,即是将内存中的Session持久化至缓存数据库。

SessionDAO是Shiro提供的一个数据交互层的interface接口,其作用是可以将Session写入到数据库
中,然后可以对Session进行增删改查操作。

通过下面的UML图来看一下,Shiro为我们操作Session提供了哪些API。

其中SessionDao是最顶级的接口,它有一个简单的实现叫AbstractSessionDAO,而在AbstractSessionDAO下
又有两个实现类,分别是CachingSessionDAO和MemorySessionDAO,CachingSessionDAO提供了缓存的操作,
而MemorySessionDAO可以让我们在内存中操作Session。

而CachingSessionDAO是一个抽象类,它有一个简单的实现EnterpriseCacheSessionDAO,一般在开发过程中推荐大家直接继承EnterpriseCacheSessionDAO。

总结:
(1)AbstractSessionDAO
提供了SessionDAO的基础实现,如生成会话ID等。
(2)CachingSessionDAO
提供了对开发者透明的会话缓存的功能,需要设置相应的CacheManager。
(3)EnterpriseCacheSessionDAO
提供了缓存功能的会话维护,默认情况下使用MapCache实现,内部使用
ConcurrentHashMap保存缓存的会话。

一下是结合项目:

xml

    <bean id="cluterShiroSessionDao" class="com.platform.shiro.CluterShiroSessionDao"/><bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"><!-- 设置session过期时间为1小时(单位:毫秒),默认为30分钟 --><property name="globalSessionTimeout" value="3600000"></property><property name="sessionValidationSchedulerEnabled" value="true"></property><property name="sessionIdUrlRewritingEnabled" value="false"></property><property name="sessionDAO" ref="cluterShiroSessionDao"/></bean>

  

 CluterShiroSessionDao.java
public class CluterShiroSessionDao extends EnterpriseCacheSessionDAO {//创建Session(它实现了CachingSessionDAO接口的方法)@Overrideprotected Serializable doCreate(Session session) {Serializable sessionId = super.doCreate(session);final String key = Constant.SESSION_KEY + sessionId.toString();setShiroSession(key, session);return sessionId;}//根据sessionId读取session信息(它实现了CachingSessionDAO接口的方法)@Overrideprotected Session doReadSession(Serializable sessionId) {Session session = super.doReadSession(sessionId);if (null == session) {final String key = Constant.SESSION_KEY + sessionId.toString();session = getShiroSession(key);}return session;}//更新操作(它实现了CachingSessionDAO接口的方法)@Overrideprotected void doUpdate(Session session) {super.doUpdate(session);final String key = Constant.SESSION_KEY + session.getId().toString();setShiroSession(key, session);}//删除操作(它实现了CachingSessionDAO接口的方法)@Overrideprotected void doDelete(Session session) {super.doDelete(session);final String key = Constant.SESSION_KEY + session.getId().toString();J2CacheUtils.remove(key);}private Session getShiroSession(String key) {return (Session) J2CacheUtils.get(key);}private void setShiroSession(String key, Session session) {J2CacheUtils.put(key, session);}
}

  


转载于:https://www.cnblogs.com/zqyanywn/p/10845365.html

shiro 的session持久化相关推荐

  1. 基于shiro实现session持久化和分布式共享

    前言 本文写下session持久化和分布式共享 基于shiro框架对session的管理机制来实现 必要性 一直处于登陆状态:你登陆微信 不可能三天两头就让你重新登陆吧?而是一直处于登陆状态 除非主动 ...

  2. 【Session】Tomcat中Session持久化到文件系统或数据库

    参考的优秀文章 Tomcat Session 持久化 Package org.apache.catalina.session 最近同事在做Session外置的功能,我对Session持久化.共享也不太 ...

  3. servlet session持久化

    1. session持久化是什么?  web服务器把 session中存储的属性存储到本地磁盘或数据库中: 2.为什么需要持久化? 因为 session是服务器维护会话状态的对象,即便客户端关闭连接或 ...

  4. java 重写session_使用Shiro重写Session 自定义SESSION

    引入shiro的jar包 1.2.3 org.apache.shiro shiro-core ${shiroVersion} org.apache.shiro shiro-web ${shiroVer ...

  5. java session 持久化_自定义实现session持久化

    自定义实现session持久化 使用场景 对于有登录校验的网站,tomcat 重启之后,刷新页面又得重新登录,影响用户体验. 原因: tomcat 的session 在内存中,tomcat重启之后,内 ...

  6. 【Shiro】shiro的Session管理

    [Shiro]shiro的Session管理 1. Session管理介绍 2. JavaSE环境下 3. JavaEE环境下 4. Session监听 5. Session检测 1. Session ...

  7. Shiro实现session限制登录数量踢人下线

    Shiro实现session限制登录数量踢人下线 前言 实现 ■ 架构准备 ShiroConfig ■ redis内的存储分布 ■ 代码修改 修改 JedisSessionDAO 修改 SystemA ...

  8. Tomcat7 session 持久化关闭

    Tomcat7 session 持久化关闭 tomcat 7默认开启session持久化功能,这样当你的tomcat重启之后,会自动重新加载session,这样当tomcat重启了保存在session ...

  9. Shiro中Session过期页面跳转回登录页面处理问题

    Session超时的两种情况: shiro在管理session后,在session超时会进行跳转,这里有两种情况需要考虑,一种是ajax方式的请求超时,一种页面跳转请求的超时: 解决问题的思路:通过定 ...

最新文章

  1. 2007年下半年软考:网络工程师考试试题分析
  2. 文件复制函数的效率比较
  3. @async 默认线程池_Springboot线程池的使用和扩展
  4. PostgreSQL 12系统表(11)pg_user
  5. 我的世界服务器皮肤显示插件怎么用,我的世界皮肤和插件安装方法
  6. 边工作边刷题:70天一遍leetcode: day 56-1
  7. MyBatis 缓存原来是这么一回事儿!| 原力计划
  8. matlab 矢量化编程(四)—— 标量函数转化为能够处理矢量的函数
  9. python没基础能自学吗-50K大牛告诉你,没有任何编程基础,到底应该怎么自学Python...
  10. java数组实现队列
  11. 安卓使用Root权限实现后台模拟全局按键、触屏事件方法(类似按键精灵)
  12. 用BT3和spoonwep2研究学习WEP密码…
  13. android 4.4 root精灵,ROOT精灵: 支持安卓4.3/4.4机型一键ROOT
  14. opencv GPU加速 多GPU卡指定GPU索引方法
  15. 【云原生-白皮书】简章2:深入理解DevOps+微服务
  16. kubelet报错:Orphaned pod “$Pod“ found, but volume paths are still present on disk
  17. 如何给电脑硬盘分区?
  18. 游戏开发之路-hxx
  19. IntelliJ IDEA 小技巧之Bookmark(书签)的使用
  20. for循环和嵌套循环

热门文章

  1. 计算机二级在学校报还是外面报好,谁知道考计算机二级在哪个学校比较好啊?...
  2. oracle eco 开放接口,问题:关于ECO,ECN的API或者INTERFACE
  3. php in循环与for循环,详谈js中标准for循环与foreach(for in)的区别
  4. java线程 yield_Java线程中yield与join方法的区别
  5. linux怎样标识空设备,Linux系统命令------Ubuntu下解决adb设备列表为空
  6. 每天一个linux命令(20):find命令之exec
  7. 全卷积神经网路【U-net项目实战】LUNA 2016 数据集详解
  8. ftp服务器文件备份,数据备份是十分重要的,下面是通过ftp将本机数据备份到远程服务器的一个例子...
  9. 华三交换机升级的ipe文件_弱电工程工业以太网交换机电源故障总结
  10. svn上crlf怎么设置_svn如何设置svn:ignore