对于分布式系统,一般都牵扯到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接口的方法)
@Override
protected 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接口的方法)
@Override
protected 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接口的方法)
@Override
protected void doUpdate(Session session) {
super.doUpdate(session);
final String key = Constant.SESSION_KEY + session.getId().toString();
setShiroSession(key, session);
} //删除操作(它实现了CachingSessionDAO接口的方法)
@Override
protected 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);
}
}

  

												

shiro 的session持久化的更多相关文章

  1. 使用redis进行基于shiro的session集群共享

    之前写过一篇nginx多tomcat负载均衡,主要记录了使用nginx对多个tomcat 进行负载均衡,其实进行负载均衡之前还有一个问题没有解决,那就是集群间的session共享,不然用户在登录网站之 ...

  2. shiro源码篇 - shiro的session共享,你值得拥有

    前言 开心一刻 老师对小明说:"乳就是小的意思,比如乳猪就是小猪,乳名就是小名,请你用乳字造个句" 小明:"我家很穷,只能住在40平米的乳房" 老师:" ...

  3. Shiro - 关于session

    Shiro Session session管理可以说是Shiro的一大卖点. Shiro可以为任何应用(从简单的命令行程序还是手机应用再到大型企业应用)提供会话解决方案. 在Shiro出现之前,如果我 ...

  4. java 中Session 持久化问题

    首先: 今天发现了个session 持久化的问题 在Tomcat 停止运行后再启动  session  中保存的东西还会存在 ,百度了一下 原理 1.Session Create 时 2.Sessio ...

  5. [转]session 持久化问题(重启服务器session 仍然存在)

    转:http://xiaolongfeixiang.iteye.com/blog/560800 关于在线人数统计,大都使用SessionListener监听器实现. SessionListener 触 ...

  6. YII 登陆时 session持久化

    在YII框架中,session持久化方法只需要调用login()方法就行了 class loginAction extends CAction{ function run(){ $model=new ...

  7. shiro源码篇 - shiro的session创建,你值得拥有

    前言 开心一刻 开学了,表弟和同学因为打架,老师让他回去叫家长.表弟硬气的说:不用,我打得过他.老师板着脸对他说:和你打架的那位同学已经回去叫家长了.表弟犹豫了一会依然硬气的说:可以,两个我也打得过. ...

  8. [转]在nodejs使用Redis缓存和查询数据及Session持久化(Express)

    本文转自:https://blog.csdn.net/wellway/article/details/76176760 在之前的这篇文章 在ExpressJS(NodeJS)中设置二级域名跨域共享Co ...

  9. shiro源码篇 - shiro的session的查询、刷新、过期与删除,你值得拥有

    前言 开心一刻 老公酷爱网络游戏,老婆无奈,只得告诫他:你玩就玩了,但是千万不可以在游戏里找老婆,不然,哼哼... 老公嘴角露出了微笑:放心吧亲爱的,我绝对不会在游戏里找老婆的!因为我有老公! 老婆: ...

随机推荐

  1. nyar4psg: Cannot find a class or type named "MultiMarker"

    Cannot find a class or type named "MultiMarker" 是一种常见错误,产生的原因是Library里面有1个以上的ar库. 以我的电脑为例, ...

  2. VMware安装VMwaretools

    默认点击“安装VMware Tools(T)”选项下载好安装包 下载的安装包放在计算机的media目录下 进入/media/ubuntu14-04/VMware Tools目录: cd /media/ ...

  3. Luogu5349 幂

    题面 题解 首先考虑对于一个单项式怎么做,多项式就是单项式的答案的和. 就求一下\(\mathbf f(n) = n^k\)吧.(下面设\(t = \dfrac 1r\)) 设\(\mathbf S_ ...

  4. win7“您可能没有权限使用网络资源”的解决办法

    删除“拒绝从网络访问这台计算机”里面的Gu   1 在屏幕的左下角点开[开始]----在搜索程序和文件那个文本框里输入[输入gpedit.msc]然后回车. 2 弹出如下图的对话框, 3 依次展开-- ...

  5. 树莓派python 控制GPIO

    sudo pip install rpi.gpio #!/usr/bin/env python # encoding: utf-8 import RPi.GPIO as GPIO import tim ...

  6. 前端 MV*框架的意义

    早期前端都是比较简单,基本以页面为工作单元,内容以浏览型为主,也偶尔有简单的表单操作,基本不太需要框架. 随着 AJAX 的出现,Web2.0的兴起,人们可以在页面上可以做比较复杂的事情了,然后前端框 ...

  7. Windows环境下的安装gcc(c语言环境)

    Windows 具有良好的界面和丰富的工具,所以目前 linux 开发的流程是, windows 下完成编码工作, linux 上实现编译工作. 为了提高工作效率,有必要在 windows 环境下搭建 ...

  8. Tensorflow 2 Cifar10离线数据集手动下载、离线安装、本地加载、快速读取

    Tensorflow 2 Cifar10离线数据集手动下载.离线安装.本地加载.快速读取 商务合作,科技咨询,版权转让:向日葵,135-4855__4328,xiexiaokui#qq.com   查 ...

  9. 021 CSS高级特性

    一:元素的显示与影藏 1.比较常见的单词 dispaly,visibility,overflow 2.display案例 如果影藏了,这个元素就看不见了,然后也不保留位置 <!DOCTYPE h ...

  10. intel 性能分析

    分析memory bound,etc https://software.intel.com/en-us/articles/intel-vtune-amplifier-tutorials