【Shiro】shiro的Session管理

  • 1. Session管理介绍
  • 2. JavaSE环境下
  • 3. JavaEE环境下
  • 4. Session监听
  • 5. Session检测

1. Session管理介绍

shiro作为⼀款安全管理框架,对状态保持有很强的需要。
⽐如最常⽤的⽤户认证,就必需状态的保持,以及其他的⼀些功能实现的需要。
【shiro需要:认证中的 记住我中的⽤户名 正式登陆的⽤户名 】

【 开发者需要:其他功能中需要存⼊session的值 】

shiro提供了⼀整套session管理⽅案.

1. shiro的session⽅案和任何容器⽆关(如servlet容器);
2. javaSE也可以使⽤;相关组件都是pojo对ioc极其友好(⽅便的管理对象和满⾜依赖关系,定制参数)
3. 可以⽅便的扩展定制存储位置(内存,缓存,数据库等)
4. 对web透明⽀持:⽤了shiro的session后,项⽬中关于session的代码完全不⽤任何改动
5. 提供了全⾯的session监听机制,和session检测机制,对session可以细粒度操作

即,使⽤了shiro后,采⽤shiro的session⽅案是最优的⽅案。

2. JavaSE环境下

shiro 的session管理⽅案,可以在javaSE中使⽤,但是实⽤价值不⼤。毕竟session对应的是会话管理

Subject subject = SecurityUtils.getSubject();
//获取session
Session session = subject.getSession();
//session超时时间,单位:毫秒;0,⻢上过期;正数,则空闲对应毫秒后过期;负数,则不会过期
session.setTimeout(10000);
//session存、取值
session.setAttribute("name","siyi"); session.getAttribute("name");
//获取sessionID
getSession().getId();
// 销 毁 session session.stop();
原理,核⼼对象:
1.SimpleSession
Session的实现类,完成session基本功能。2.SimpleSessionFactory
⽣产SimpleSession3.SessionDAO
默认的实现类:MemorySessionDAO,由SessionManager创建,
负责存储所有session对象,存储位置:内存4.DefaultSessionManager
由SecurityManager创建,负责创建、管理SessionFactory和SessionDAO。
//核⼼类演示: ( ops:实际开发不⽤⼿动创建,shiro会初始化 )
//通过SecurityManager 获得 SessionManager
DefaultSessionManager sessionManager = (DefaultSessionManager)securityManager.getSessionManager();
//通过SessionManager获得SessionFactory
SimpleSessionFactory sessionFactory = (SimpleSessionFactory) sessionManager.getSessionFactory();
//通过SessionManager获得SessionDAO
MemorySessionDAO sessionDAO = (MemorySessionDAO)sessionManager.getSessionDAO();
//通过SessionFactory获得Session
SimpleSession session1 = (SimpleSession) sessionFactory.createSession(null);
//通过Session做具体操作session1.setAttribute("name","zhangsan"); System.out.println(session1.getAttribute("name"));

3. JavaEE环境下

在spring配置文件中增加session管理相关配置。

<!-- 增加session管理相关配置 -->
<!-- 会话Cookie模板 默认可省-->
<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie"><!-- cookie的 key="sid" --><property name="name" value="JSESSIONID"/><!-- 只允许http请求访问cookie --><property name="httpOnly" value="true"/><!-- cookie过期时间,-1:存活⼀个会话 ,单位:秒 ,默认为-1--><property name="maxAge" value="-1"/>
</bean><bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"><!-- 默认值和配置中给出的⼀致,所bean:sessionIdCookie 可以省略 --><property name="sessionIdCookie" ref="sessionIdCookie"/><!-- session全局超时时间, 单位:毫秒 ,30分钟 默认值为1800000--><property name="globalSessionTimeout" value="1800000"/>
</bean><!-- 将sessionManager关联到SecurityManager -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">...<!-- 增加配置sessionManager --><property name="sessionManager" ref="sessionManager"/>
</bean>

4. Session监听

session有三个核⼼过程:创建、过期、停⽌

过期: session的默认过期时间为30分钟。通过⽐对最近⼀次使⽤时间和当前使⽤时间判断 session不会⾃动报告过期,需检测器检测时,或再次访问时,才可以识别是否过期并移除。

停⽌: ⽤户主动logout;主动调⽤session.stop(); 两种情况会将session标志为停⽌状态。

// 定义监听类 exentends SessionListenerAdapter
public class MySessionListener extends SessionListenerAdapter{//当有session创建时 触发@Overridepublic void onStart(Session session) { System.out.println("session:"+session.getId()+" start");}//当有session停⽌时 触发@Overridepublic void onStop(Session session) { System.out.println("session:"+session.getId()+" stop");}//当有session过期时 触发// 但不会主动触发,需要再次访问时,即⼜要使⽤session时才会发现session过期,并触发。@Overridepublic void onExpiration(Session session) { System.out.println("session:"+session.getId()+" expired");}
}

配置监听类,关联给SessionManager

<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">...<property name="sessionListeners"><list><bean class="com.siyi.listener.MySessionListener"></bean></list></property>...
</bean>

5. Session检测

⽤户如果没有主动退出登录,只是关闭浏览器,则session是否过期⽆法获知,也就不能停⽌session。 为此,shiro提供了session的检测机制,可以定时发起检测,识别session过期 并停⽌session。

<!-- sessionManager默认开启session检测机制 -->
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">...<!-- 开启检测器,默认开启 --><property name="sessionValidationSchedulerEnabled" value="true"/><!--- 检测器运⾏间隔,单位:毫秒    默认1⼩时//检测到过期后,会直接将session删除protected void afterExpired(Session session) { if (isDeleteInvalidSessions()) {delete(session);}}--><property name="sessionValidationInterval" value="3600000"/>...
</bean>

如上,通过检测器,定时的检测session,并及时移除⽆效session,释放资源。

【Shiro】shiro的Session管理相关推荐

  1. shiro教程:session管理

    当我们项目需要进行session管理的时候,我们就需要进行相关的配置了,下面讲一下步骤 1.配置文件配置 首先我们需要对sessionManager进行相关的配置. <!-- 会话管理器 sta ...

  2. shiro集成 spring-加密md5配置--权限管理-shiro中的session 等等!!

    目录 1.shiro集成 spring 1.1 导入依赖的包 1.2 web.xml配置 2. 开发自定义Realm 2.1 创建测试数据表 2.3 编写后台支持服务 2.4 编写自定义的Realm ...

  3. 【Shiro】六、Apache Shiro Session管理

    1.Session的介绍 关于Session 会话:从启动一个Session到关闭这个Session作为一个会话,是对客户端和服务器端交互的一种封装,带有时效性 会话的产生: 一般从容器中产生 Web ...

  4. SpringMvc 集成 shiro 实现权限角色管理-maven

    2019独角兽企业重金招聘Python工程师标准>>> SpringMvc 集成 shiro 实现权限角色管理 1.项目清单展示 2.项目源码解析  1)spring-context ...

  5. springmvc集成shiro后,session、request姓汪还是姓蒋 ?

    1. 疑问 我们在项目中使用了spring mvc作为MVC框架,shiro作为权限控制框架,在使用过程中慢慢地产生了下面几个疑惑,本篇文章将会带着疑问慢慢地解析shiro源码,从而解开心里面的那点小 ...

  6. Spring Boot 2.X + Shiro 优雅解决 session 跨域问题

    一.跨域问题 web 开发中跨域问题是一个老生常谈的问题,根本原因是浏览器基于安全原因考虑对非同源的脚本操作和 ajax 访问进行了限制,介绍的文章网上有很多,这里不做赘述. 二.解决方案 跨域问题有 ...

  7. springmvc集成shiro后,session、request姓汪还是姓蒋?

    1. 疑问 我们在项目中使用了spring mvc作为MVC框架,shiro作为权限控制框架,在使用过程中慢慢地产生了下面几个疑惑,本篇文章将会带着疑问慢慢地解析shiro源码,从而解开心里面的那点小 ...

  8. Shiro角色和权限管理

    Shiro角色和权限管理 在resources下创建shiro.ini文件,用于存储数据,也可以将数据存于数据库,这里我采用shiro.ini文件,内容如下: [users] zhangsan=z3, ...

  9. Shiro Shiro Web Support and EnvironmentLoaderListener

    Shiro Shiro Web Support 主要参考: http://shiro.apache.org/web.html 还有涛哥的 作为资源控制访问的事情,主要使用在网络后台方面,所以了解了本地 ...

最新文章

  1. 别找了 这就是适合入门的第一本算法书
  2. 用户空间增加、缩减内存
  3. zentao这php,ZenTaoPHP后面计划
  4. 阿里云混合云的政企上云新路径
  5. linux(CentOS)下安装mongodb
  6. jaxb报错_JAXB做错了; 尝试Xembly
  7. Jakarta Struts应用的七个经验
  8. 面试者为何从来得不到反馈?
  9. python决策树预测模型_「数据挖掘入门系列」数据挖掘模型之分类与预测 - 决策树...
  10. 怎样才能称得上一个好运维
  11. 网站访问计数器 php,用PHP生成访客计数器
  12. PHP调用powershell权限,浏览器挂起执行运行Powershell的PHP
  13. python微博爬虫程序_基于Python的新浪微博爬虫程序设计与研究
  14. Django模板 render_to_string与render
  15. 微信开放平台Android常见问题
  16. 基于RFM的用户画像分析
  17. 苹果开发者账号网页版续费失败支付报错解决办法
  18. 使用exe4j把jar转换成exe文件时,报错java.lang.NoClassDefFoundError: org/eclipse/swt/widgets/Composite
  19. 亚马逊10000人大裁员已启动!谷歌绩效强制打低分跟风「毕业潮」
  20. Unity3D制作巡逻兵小游戏

热门文章

  1. 什么是 Web 3.0?定义、功能和示例
  2. Stanford CS224n 第一讲:深度自然语言处理
  3. 【PHP】linux搭建PHP运行环境
  4. 小熊饼干、大白兔也遭遇小浩路过
  5. 01. Java8-Lambada 表达式
  6. PostGIS 快速入门
  7. 这是一份华为云私有云解决方案2017年的成绩单
  8. [AHK]为通达信标记文字窗口的按钮增加热键
  9. 怎样用matlab把视频转gif动画,Matlab制作视频并转换成gif动态图的两种方法
  10. 【2020年保研记】浙大软院+中科院信工所+北师大人工智能学院+华中科技网安学院+四川大学网安学院+中山大学系统科学与工程学院