Shiro  我们通过重写AbstractSessionDAO ,来实现 Session  共享。再重写 Session  的时候(其实也不算重写),因为和HttpSession 没有任何实现或者继承关系。

首先 Shiro   Session  配置讲解。

Session  的每个回话的ID 生成器,我们用JavaUuidSessionIdGeneratorUUID 规则)。

  1. <!-- 会话Session ID生成器 -->
  2. <bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator"/>

Session  的创建、获取、删除

  1. <!-- session 创建、删除、查询 -->
  2. <bean id="jedisShiroSessionRepository" class="com.sojson.core.shiro.cache.JedisShiroSessionRepository" >
  3. <property name="jedisManager" ref="jedisManager"/>
  4. </bean>

Session  的监听生命周期

  1. <!-- custom shiro session listener -->
  2. <bean id="customShiroSessionDAO" class="com.sojson.core.shiro.CustomShiroSessionDAO">
  3. <property name="shiroSessionRepository" ref="jedisShiroSessionRepository"/>
  4. <property name="sessionIdGenerator" ref="sessionIdGenerator"/>
  5. </bean>

Session  定时管理器(有效期)

  1. <!-- 会话验证调度器 -->
  2. <bean id="sessionValidationScheduler" class="org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler">
  3. <property name="interval" value="${session.validate.timespan}"/><!--检测时间间距,默认是60分钟-->
  4. <property name="sessionManager" ref="sessionManager"/>
  5. </bean>

Session   cookie  模版配置

  1. <!-- 会话Cookie模板 -->
  2. <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
  3. <!--cookie的name,我故意取名叫xxxxbaidu -->
  4. <constructor-arg value="v_v-s-baidu"/>
  5. <property name="httpOnly" value="true"/>
  6. <!--cookie的有效时间 -->
  7. <property name="maxAge" value="-1"/>
  8. <!-- 配置存储Session Cookie的domain为 一级域名 -->
  9. <property name="domain" value=".itboy.net"/>
  10. </bean>

Session  Manager 配置

  1. <!-- Session Manager -->
  2. <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
  3. <!-- 相隔多久检查一次session的有效性 -->
  4. <property name="sessionValidationInterval" value="1800000"/>
  5. <!-- session 有效时间为半小时 (毫秒单位)-->
  6. <property name="globalSessionTimeout" value="1800000"/>
  7. <property name="sessionDAO" ref="customShiroSessionDAO"/>
  8. <!-- session 监听,可以多个。 -->
  9. <property name="sessionListeners">
  10. <list>
  11. <ref bean="customSessionListener"/>
  12. </list>
  13. </property>
  14. <!-- 间隔多少时间检查,不配置是60分钟 -->
  15. <property name="sessionValidationScheduler" ref="sessionValidationScheduler"/>
  16. <!-- 是否开启 检测,默认开启 -->
  17. <property name="sessionValidationSchedulerEnabled" value="true"/>
  18. <!-- 是否删除无效的,默认也是开启 -->
  19. <property name="deleteInvalidSessions" value="true"/>
  20. <!-- 会话Cookie模板 -->
  21. <property name="sessionIdCookie" ref="sessionIdCookie"/>
  22. </bean>

Session  的创建、删除、查询 ,ShiroSessionRepository 接口定义。

  1. package com.sojson.core.shiro.session;
  2. import org.apache.shiro.session.Session;
  3. import java.io.Serializable;
  4. import java.util.Collection;
  5. /**
  6. * custom shiro session manager interface
  7. *
  8. * @author zhoubaicheng
  9. */
  10. public interface ShiroSessionRepository {
  11. /**
  12. * 存储Session
  13. * @param session
  14. */
  15. void saveSession(Session session);
  16. /**
  17. * 删除session
  18. * @param sessionId
  19. */
  20. void deleteSession(Serializable sessionId);
  21. /**
  22. * 获取session
  23. * @param sessionId
  24. * @return
  25. */
  26. Session getSession(Serializable sessionId);
  27. /**
  28. * 获取所有sessoin
  29. * @return
  30. */
  31. Collection<Session> getAllSessions();
  32. }

Session  的创建、删除、查询实现。com.sojson.core.shiro.cache.JedisShiroSessionRepository

  1. package com.sojson.core.shiro.cache;
  2. import java.io.Serializable;
  3. import java.util.Collection;
  4. import org.apache.log4j.Logger;
  5. import org.apache.shiro.session.Session;
  6. import com.sojson.common.utils.SerializeUtil;
  7. import com.sojson.core.shiro.session.ShiroSessionRepository;
  8. /**
  9. * Session 管理
  10. * @author sojson.com
  11. *
  12. */
  13. @SuppressWarnings("unchecked")
  14. public class JedisShiroSessionRepository implements ShiroSessionRepository {
  15. private static Logger logger = Logger.getLogger(JedisShiroSessionRepository.class);
  16. public static final String REDIS_SHIRO_SESSION = "sojson-shiro-session:";
  17. //这里有个小BUG,因为Redis使用序列化后,Key反序列化回来发现前面有一段乱码,解决的办法是存储缓存不序列化
  18. public static final String REDIS_SHIRO_ALL = "*sojson-shiro-session:*";
  19. private static final int SESSION_VAL_TIME_SPAN = 18000;
  20. private static final int DB_INDEX = 1;
  21. private JedisManager jedisManager;
  22. @Override
  23. public void saveSession(Session session) {
  24. if (session == null || session.getId() == null)
  25. throw new NullPointerException("session is empty");
  26. try {
  27. byte[] key = SerializeUtil.serialize(buildRedisSessionKey(session.getId()));
  28. byte[] value = SerializeUtil.serialize(session);
  29. long sessionTimeOut = session.getTimeout() / 1000;
  30. Long expireTime = sessionTimeOut + SESSION_VAL_TIME_SPAN + (5 * 60);
  31. getJedisManager().saveValueByKey(DB_INDEX, key, value, expireTime.intValue());
  32. } catch (Exception e) {
  33. e.printStackTrace();
  34. System.out.println("save session error");
  35. }
  36. }
  37. @Override
  38. public void deleteSession(Serializable id) {
  39. if (id == null) {
  40. throw new NullPointerException("session id is empty");
  41. }
  42. try {
  43. getJedisManager().deleteByKey(DB_INDEX,
  44. SerializeUtil.serialize(buildRedisSessionKey(id)));
  45. } catch (Exception e) {
  46. e.printStackTrace();
  47. System.out.println("delete session error");
  48. }
  49. }
  50. @Override
  51. public Session getSession(Serializable id) {
  52. if (id == null)
  53. throw new NullPointerException("session id is empty");
  54. Session session = null;
  55. try {
  56. byte[] value = getJedisManager().getValueByKey(DB_INDEX, SerializeUtil
  57. .serialize(buildRedisSessionKey(id)));
  58. session = SerializeUtil.deserialize(value, Session.class);
  59. } catch (Exception e) {
  60. e.printStackTrace();
  61. System.out.println("get session error");
  62. }
  63. return session;
  64. }
  65. @Override
  66. public Collection<Session> getAllSessions() {
  67. Collection<Session> sessions = null;
  68. try {
  69. sessions = getJedisManager().AllSession(DB_INDEX,REDIS_SHIRO_SESSION);
  70. } catch (Exception e) {
  71. logger.error("获取全部session异常");
  72. e.printStackTrace();
  73. }
  74. return sessions;
  75. }
  76. private String buildRedisSessionKey(Serializable sessionId) {
  77. return REDIS_SHIRO_SESSION + sessionId;
  78. }
  79. public JedisManager getJedisManager() {
  80. return jedisManager;
  81. }
  82. public void setJedisManager(JedisManager jedisManager) {
  83. this.jedisManager = jedisManager;
  84. }
  85. }

CustomShiroSessionDAO的继承实现

  1. package com.sojson.core.shiro;
  2. import java.io.Serializable;
  3. import java.util.Collection;
  4. import org.apache.log4j.Logger;
  5. import org.apache.shiro.session.Session;
  6. import org.apache.shiro.session.UnknownSessionException;
  7. import org.apache.shiro.session.mgt.eis.AbstractSessionDAO;
  8. import com.sojson.core.shiro.session.ShiroSessionRepository;
  9. public class CustomShiroSessionDAO extends AbstractSessionDAO{
  10. private static Logger logger = Logger.getLogger(CustomShiroSessionDAO.class);
  11. private ShiroSessionRepository shiroSessionRepository;
  12. public ShiroSessionRepository getShiroSessionRepository() {
  13. return shiroSessionRepository;
  14. }
  15. public void setShiroSessionRepository(
  16. ShiroSessionRepository shiroSessionRepository) {
  17. this.shiroSessionRepository = shiroSessionRepository;
  18. }
  19. @Override
  20. public void update(Session session) throws UnknownSessionException {
  21. getShiroSessionRepository().saveSession(session);
  22. }
  23. @Override
  24. public void delete(Session session) {
  25. if (session == null) {
  26. logger.error(
  27. "session can not be null,delete failed");
  28. return;
  29. }
  30. Serializable id = session.getId();
  31. if (id != null)
  32. getShiroSessionRepository().deleteSession(id);
  33. }
  34. @Override
  35. public Collection<Session> getActiveSessions() {
  36. return getShiroSessionRepository().getAllSessions();
  37. }
  38. @Override
  39. protected Serializable doCreate(Session session) {
  40. Serializable sessionId = this.generateSessionId(session);
  41. this.assignSessionId(session, sessionId);
  42. getShiroSessionRepository().saveSession(session);
  43. return sessionId;
  44. }
  45. @Override
  46. protected Session doReadSession(Serializable sessionId) {
  47. return getShiroSessionRepository().getSession(sessionId);
  48. } }

Shiro教程(七)Shiro Session共享配置以及实现相关推荐

  1. springboot配置shiro多项目实现session共享的详细步骤

    springboot配置shiro多项目实现session共享的详细步骤 公司需要这样的需求: 有两个项目master 主项目.suiteone 项目,两个项目各自由shiro 安全框架管理,当不能登 ...

  2. Nginx+Tomcat+Memecached实现session共享配置

    这段时间一直在搞项目部署,以前从来没做过,感觉很吃力,下面这个是自己配的Ubuntu下Nginx+Tomcat+Memecached实现session共享配置参考文档,欢迎大家拍砖,不知为啥sessi ...

  3. Shiro 教程,Shiro教程0.2 下载,Shiro功能修复与升级说明。

    2019独角兽企业重金招聘Python工程师标准>>> Shiro + SSM(框架) + Freemarker(jsp)讲解的权限控制Demo,还不赶快去下载? 原文链接:http ...

  4. 基于nginx tomcat redis分布式web应用的session共享配置

    一.前言 nginx 作为目前最流行的开源反向代理HTTP Server,用于实现资源缓存.web server负载均衡等功能,由于其轻量级.高性能.高可靠等特点在互联网项目中有着非常普遍的应用,相关 ...

  5. Shiro教程_2 Shiro+SpringBoot+Mysql+Redis(缓存)

    源代码 https://gitee.com/fakerlove/Shiro Shiro+SpringBoot+Mysql+Redis(缓存) 1. 添加依赖 <?xml version=&quo ...

  6. C#session共享+redis_Shiro权限管理框架(二):Shiro结合Redis实现分布式环境下的Session共享...

    精品推荐 国内稀缺优秀Java全栈课程-Vue+SpringBoot通讯录系统全新发布! Docker快速手上视频教程(无废话版)[免费] 作者:夜月归途 转载自: https://www.cnblo ...

  7. 使用Shiro+Redis实现Session共享

    章节目录 1. 为什么要实现Session共享? 1.1 负载均衡 1.2 负载均衡中的Session问题 1.3 案例演示 2. Shiro架构 3. Shiro集成Redis 1. 为什么要实现S ...

  8. [Shiro教程] Shiro 教程基于SSM(SpringMVC + Spring + Mybatis)EHCache版本

    一.Shiro简介 Apache Shiro 是 Java  的一个安全框架.我们经常看到它被拿来和 Spring  的 Security  来对比.大部分人认为 Shiro  比 Security  ...

  9. [Shiro教程] Shiro 教程基于SSM(SpringMVC + Spring + Mybatis)

    一.Shiro简介 Apache Shiro 是 Java  的一个安全框架.我们经常看到它被拿来和 Spring  的 Security  来对比.大部分人认为 Shiro  比 Security  ...

最新文章

  1. 在虚幻引擎5中重塑火箭联盟——口袋联盟
  2. android tab 悬停效果代码,Android 仿腾讯应用宝 之 Toolbar +Scroolview +tab滑动悬停效果...
  3. android 是否允许打印debug级别日志的开关_Android学习——日志使用
  4. 【深度学习】面向医学图像的病灶分割调研(一)
  5. setTimeout
  6. jQuery的this $this $(this)
  7. linux配置erp访问端口_让远程Windows系统访问本地Linux打印机
  8. 5G商用将满一年,6G研发开始了...
  9. 来自1976,Hinton写的第一篇论文火了:胶囊网络,是40年前的胶囊?
  10. C# 注册dll的两种方式
  11. NVIDIA GPU简史、命名规则及基础知识
  12. 如何用wps画三线图(最方便最快的方法)
  13. html5s做表单,5S推行手册表单.doc
  14. Linux下3种常用的网络测速工具简介
  15. 将网络地图资源加载进Arcgis中
  16. Android常用固件修改
  17. 高中数学联赛二试怎么准备
  18. 百度js 检测输入法_不明恶意攻击致lt;搜狗搜索gt;lt;搜索结果gt;跳转lt;百度搜索gt;技术原理分析...
  19. 手机连锁店经营可视化
  20. c语言编码2018新年快乐,c语言代码,输入年月日计算离2018年春节(2019年2月5日)还有多少天?...

热门文章

  1. 【Arcgis】绘制甘肃省行政区划地图
  2. (四) l立创EDA之封装库的创建
  3. 修改ST公司提供的HID鼠标例程为自己所用
  4. 130个免费 微信小程序源码分享
  5. Visual C++必备运行库-vc++2015运行库提供下载
  6. hash % n 为什么等于 (n - 1) hash
  7. 图片怎么转化为pdf格式?
  8. 动力电池管理系统(BMS)策略与开发方法
  9. 根据经纬度,随机生成经纬度
  10. OpenCV Sobel 边缘检测