首先我们看Shiro的会话管理器的配置

  1. <!-- shiro会话管理 -->
  2. <!-- 即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通 JavaSE 环境的,也可以是如 Web 环境的 -->
  3. <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
  4. <property name="cacheManager" ref="redisCacheManager"/>
  5. <property name="sessionDAO" ref="redisSessionDAO"/>
  6. <!-- <property name="sessionIdCookie" ref="simpleCookie"/> -->
  7. <!-- 全局的会话信息时间,,单位为毫秒 -->
  8. <property name="globalSessionTimeout" value="1800000"/>
  9. <!-- 检测扫描信息时间间隔,单位为毫秒-->
  10. <property name="sessionValidationInterval" value="60000"/>
  11. <!-- 是否开启扫描 -->
  12. <property name="sessionValidationSchedulerEnabled" value="false"/>
  13. <!-- 去掉URL中的JSESSIONID -->
  14. <property name="sessionIdUrlRewritingEnabled" value="true"/>
  15. </bean>

这里是使用DefaultWebSessionManager默认的Cookie配置

部分源代码

  1. public class DefaultWebSessionManager extends DefaultSessionManager implements WebSessionManager {
  2.  
  3. private static final Logger log = LoggerFactory.getLogger(DefaultWebSessionManager.class);
  4.  
  5. private Cookie sessionIdCookie;
  6. private boolean sessionIdCookieEnabled;
  7. private boolean sessionIdUrlRewritingEnabled;
  8.  
  9. public DefaultWebSessionManager() {
  10. Cookie cookie = new SimpleCookie(ShiroHttpSession.DEFAULT_SESSION_ID_NAME);
  11. cookie.setHttpOnly(true); //more secure, protects against XSS attacks
  12. this.sessionIdCookie = cookie;
  13. this.sessionIdCookieEnabled = true;
  14. this.sessionIdUrlRewritingEnabled = true;
  15. }
  16. }

这里可以看出Cookie cookie = new SimpleCookie(ShiroHttpSession.DEFAULT_SESSION_ID_NAME);内部默认创建了一个Cookie。

继续看

  1. public SimpleCookie(String name) {
  2. this();
  3. this.name = name;
  4. }

而ShiroHttpSession.DEFAULT_SESSION_ID_NAME="JSESSIONID";


问题来了--》Session失效问题这里为什么为导致Session失效呢?

因为与SERVLET容器名冲突, 如JETTY, TOMCAT 等默认JSESSIONID, 当跳出SHIRO SERVLET时如ERROR-PAGE容器会为JSESSIONID重新分配值导致登录会话丢失效。


因此这里需要自己配置Cookie

  1. <!-- shiro会话管理 -->
  2. <!-- 即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通 JavaSE 环境的,也可以是如 Web 环境的 -->
  3. <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
  4. <property name="cacheManager" ref="redisCacheManager"/>
  5. <property name="sessionDAO" ref="redisSessionDAO"/>
  6. <property name="sessionIdCookie" ref="simpleCookie"/>
  7. <!-- 全局的会话信息时间,,单位为毫秒 -->
  8. <property name="globalSessionTimeout" value="1800000"/>
  9. <!-- 检测扫描信息时间间隔,单位为毫秒-->
  10. <property name="sessionValidationInterval" value="60000"/>
  11. <!-- 是否开启扫描 -->
  12. <property name="sessionValidationSchedulerEnabled" value="false"/>
  13. <!-- 去掉URL中的JSESSIONID -->
  14. <property name="sessionIdUrlRewritingEnabled" value="true"/>
  15. </bean>
  16.  
  17. <!-- sessionIdCookie的实现,用于重写覆盖容器默认的JSESSIONID -->
  18. <bean id="simpleCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
  19. <!-- 设置Cookie名字, 默认为: JSESSIONID 问题: 与SERVLET容器名冲突, 如JETTY, TOMCAT 等默认JSESSIONID,
  20. 当跳出SHIRO SERVLET时如ERROR-PAGE容器会为JSESSIONID重新分配值导致登录会话丢失! -->
  21. <property name="name" value="SHIRO-COOKIE"/>
  22. <!-- JSESSIONID的path为/用于多个系统共享JSESSIONID -->
  23. <!-- <property name="path" value="/"/> -->
  24. <!-- 浏览器中通过document.cookie可以获取cookie属性,设置了HttpOnly=true,在脚本中就不能的到cookie,可以避免cookie被盗用 -->
  25. <property name="httpOnly" value="true"/>
  26. </bean>

好了,这里Shiro配置Cookie就完成了。

此外,如果要配置多个系统共享Session,放开Cookie中的注释即可。

  1. <!-- sessionIdCookie的实现,用于重写覆盖容器默认的JSESSIONID -->
  2. <bean id="simpleCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
  3. <!-- 设置Cookie名字, 默认为: JSESSIONID 问题: 与SERVLET容器名冲突, 如JETTY, TOMCAT 等默认JSESSIONID,
  4. 当跳出SHIRO SERVLET时如ERROR-PAGE容器会为JSESSIONID重新分配值导致登录会话丢失! -->
  5. <property name="name" value="SHIRO_COOKIE"/>
  6. <!-- JSESSIONID的path为/用于多个系统共享JSESSIONID -->
  7. <property name="path" value="/"/>
  8. <!-- 浏览器中通过document.cookie可以获取cookie属性,设置了HttpOnly=true,在脚本中就不能的到cookie,可以避免cookie被盗用 -->
  9. <property name="httpOnly" value="true"/>
  10. </bean>

这样多个系统就能共享Session了。

Shiro配置cookie以及共享Session和Session失效问题的更多相关文章

  1. Apache shiro集群实现 (六)分布式集群系统下的高可用session解决方案---Session共享

    Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...

  2. 分布式系统登录功能拦截器的实现以及cookie的共享问题(利用cookie实现session在分布式系统的共享)

    当我们的网站采用分布式部署系统时,每个子系统拥有自己独立的session,如果不实现session共享,当用户切换系统访问的时候,会不停的提示登录,这对于用户体验是非常不好的.因此对于多个子系统的的访 ...

  3. SpringBoot 整合Shiro实现动态权限加载更新+Session共享+单点登录

    作者:Sans_ juejin.im/post/5d087d605188256de9779e64 一.说明 Shiro是一个安全框架,项目中主要用它做认证,授权,加密,以及用户的会话管理,虽然Shir ...

  4. Spring Session实现Session共享下的坑与建议

    相信用过spring-session做session共享的朋友都很喜欢它的精巧易用-不依赖具体web容器.不需要修改已成项目的代码.笔者在使用spring-session的过程中也对spring-se ...

  5. Spring Session解决Session共享

    1. 分布式Session共享   在分布式集群部署环境下,使用Session存储用户信息,往往出现Session不能共享问题.   例如:服务集群部署后,分为服务A和服务B,当用户登录时负载到服务A ...

  6. 【转】Session ID/session token 及和cookie区别

    Session + Cookie  知识收集! cookie机制采用的是在客户端保持状态的方案.它是在用户端的会话状态的存贮机制,他需要用户打开客户端的cookie支持.cookie的作用就是为了解决 ...

  7. Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享

    Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享 ============================= 蕃薯耀 2017年11月27日 http: ...

  8. [转载]利用memcached在多台服务器之间共享PHP的session数据

    原文地址:利用memcached在多台服务器之间共享PHP的session数据作者:a1049709658 最近我的几篇文章都是是最近项目的一点心得^^ 这个项目一开始就设计的"很大&quo ...

  9. 状态管理之cookie使用及其限制、session会话

    # 1.什么是状态管理? 将浏览器与web服务器之间多次交互当作一个整体来处理,并且将多次交互所涉及的数据(即状态)保存下来.(cookie浏览器所涉及到的访问数据保存下来)# 2.如何进行状态管理? ...

随机推荐

  1. JavaScript:逻辑操作符“==”与“===”的区别

    Summary JavaScript中,逻辑操作符“===”会先检查操作数的数据类型,对不同的数据类型会返回false. 而“==”对不同类型的操作数进行比较时,会进行类型转换后再比较. Descri ...

  2. WPF 使用 WindowChrome,在自定义窗口标题栏的同时最大程度保留原生窗口样式(类似 UWP/Chrome)

    WPF 自定义窗口样式有多种方式,不过基本核心实现都是在修改 Win32 窗口样式.然而,Windows 上的应用就应该有 Windows 应用的样子嘛,在保证自定义的同时也能与其他窗口样式保持一致当 ...

  3. IIS并发瓶颈线程数的限制

    .NET线程池最大线程数的限制-记一次IIS并发瓶颈 https://www.cnblogs.com/7rhythm/p/9964543.html .NET ThreadPool 最大线程数的限制 I ...

  4. python mysql基本操作

    1.创建数据库.表添加数据. # -*- coding: utf-8 -*- import MySQLdb.cursors conn =MySQLdb.connect(',charset = 'utf ...

  5. 【angularJS】Route路由

    介绍 AngularJS 路由允许我们通过不同的 URL 访问不同的内容. 通过 AngularJS 可以实现多视图的单页Web应用(single page web application,SPA). ...

  6. 基于C#的UDP协议的异步实现

    一.摘要 总结UDP传输协议的异步实现. 二.实验平台 visual studio 2010 三.实验实例 服务器端代码: using System; using System.Collections ...

  7. eclipse marketplace网络连接失败的解决方法

    2015-12-04 01:12:33 本想在eclipse上安装一个插件,点进help-EclipseMarketplace却连接失败,错误如下: 在help-instal new software ...

  8. Docker生态不会重蹈Hadoop的覆辙

    本文原作者是晏东(精灵云Ghostcould创始人),在读到<Docker生态会重蹈Hadoop的覆辙吗?>文章后的个人思考,里面的不少观点也是很不错的. 1.形态上的差异 2013年的时 ...

  9. ORACLE11g 没有控制文件如何通过rman备份恢复数据的详细实战过程

    1.副总裁需要裸恢复的严峻现实 集团总部的信息部负责人给我打电话说为了找一年前的记录,所以需要对一年前2015年5月1日的数据进行恢复.而2016年初因为进行迁移,所以有些文件可能丢失,手上只有rma ...

  10. MySQL主从报错解决:Failed to initialize the master info structure

    大清早收到一个MySQL的自定义语言告警 :replication interrupt,看来是主从同步报错了. 登陆MySQL,执行 show slave status \G 发现salve已经停止了 ...