前言

  • spring-session 2.0.2.RELEASE
  • 通过 spring-session 可以实现在多项目之间共享 session 。
  • 此处不涉及跨域。

场景

  • 场景1:同一个项目(项目A),部署多个,在访问任何一个时,均能够共享session(即项目A的集群部署)。
  • 场景2:有2个项目(项目A、项目B),部署在同1个域名下,通过目录区分访问。在项目A登录后,再进入项目B时,不需要再重新登录。
  • 场景3:有2个项目(项目A、项目B),部署在同不同域名下。在项目A登录后,再进入项目B时,不需要再重新登录。

使用 spring-session 可以轻松处理以上场景。

如何实现session共享?

以上所列的场景,均为同域的情况。跨域问题,需要搭配其它方法。

场景1,只需要保证两个实例均往同一个位置写session,且从同一个位置读session。比如讲session保存到数据库中,或者将session保存到redis中。 spring-session 可以实现通过数据库或redis存取session。

场景2或场景3中,需要保证项目A和项目B在保存session时,使用了相同的域名和路径。

场景2,假如项目A部署地址为:http://www.mydomain.com/projectA,项目B部署地址为:http://www.mydomain.com/projectB。项目A和项目B向cookie中保存session id时,均使用同一个域名(www.mydomain.com)和同一个路径(/,即根路径,即两个项目的父级路径)。spring-session 可以让项目A和项目B获取到相同的session id,再通过相同的session id从数据库或redis中存取相同的session内容。

场景3,假如项目A部署地址为:http://projectA.mydomain.com/,项目B部署地址为:http://projectB.mydomain.com/。项目A和项目B向cookie中保存session id时,均使用同一个域名(mydomain.com,即两个域名的父级域名)和同一个路径(/,即根路径)。spring-session 可以让项目A和项目B获取到相同的session id,再通过相同的session id从数据库或redis中存取相同的session内容。

spring-session 如何控制 cookie

以 spring-session 2.0.2.RELEASE 为例。在SessionRepositoryFilter 中定义了httpSessionIdResolver(CookieHttpSessionIdResolver)属性。在 CookieHttpSessionIdResolver 中定义了cookieSerializer(DefaultCookieSerializer)。spring-session 通过 DefaultCookieSerializer 控制cookie。

如果要改变写入cookie中的域名或路径,则需要配置DefaultCookieSerializer。

spring-boot中配置方法如下:

@Beanpublic DefaultCookieSerializer getDefaultCookieSerializer() {DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();cookieSerializer.setDomainName("mydomain.com");cookieSerializer.setCookieName("SESSION");cookieSerializer.setCookiePath("/");cookieSerializer.setUseBase64Encoding(false);return cookieSerializer;}

spring mvc中配置方法如下:

    <bean id="defaultCookieSerializer" class="org.springframework.session.web.http.DefaultCookieSerializer"><property name="domainName" value="mydomain.com" /><property name="cookieName" value="SESSION" /><property name="cookiePath" value="/" /></bean>

DefaultCookieSerializer 配置

@Beanpublic DefaultCookieSerializer getDefaultCookieSerializer() {DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();//cookieSerializer.setDomainName("mydomain.com");cookieSerializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$");cookieSerializer.setCookieName("SESSION");cookieSerializer.setCookiePath("/");cookieSerializer.setUseBase64Encoding(false);return cookieSerializer;}

spring mvc中配置方法如下:

    <bean id="defaultCookieSerializer" class="org.springframework.session.web.http.DefaultCookieSerializer"><!--<property name="domainName" value="mydomain.com" /> --><property name="domainNamePattern" value="^.+?\\.(\\w+\\.[a-z]+)$" /><property name="cookieName" value="SESSION" /><property name="cookiePath" value="/" /><property name="useBase64Encoding" value="false" /></bean>
  • domainNamePattern : 域名的正则表达式。^.?\\.(\\w\\.[a-z]+)$ 是个通用写法。如果正则表达式不匹配,则不会设置任何域。如果正则表达式匹配,则第一个分组将用作域。例如:https://child.mydomain.com的请求会将域设置为mydomain.com。http:// localhost:8080 /或https://192.168.1.100:8080/的请求将不对域名进行处理。因此,在切换域名时,不需要再做任何修改。
  • domainName : 域名。设置成你想使用的域名。应设置成项目所在域名的某个父级域名。
  • cookieName : session id的cookie名称。
  • cookiePath : cookie path。
  • useBase64Encoding : 是否使用base64将session id进行编码。

参考

如果遇到 spring-session 1.x与2.x 不兼容参考这里 : https://blog.csdn.net/sayyy/article/details/104198555

【spring-session】多项目实现session共享相关推荐

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

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

  2. Spring Session + Redis实现分布式Session共享

    2019独角兽企业重金招聘Python工程师标准>>> 通常情况下,Tomcat.Jetty等Servlet容器,会默认将Session保存在内存中.如果是单个服务器实例的应用,将S ...

  3. Spring boot - 使用redis实现session共享

    在分布式系统架构的系统中,我们如何保证session的一致性,其中之一的解决方式就是session共享形式,在SpringBoot框架中如何使用session达成共享呢,我们可以借助指定Redis实现 ...

  4. Spring Session - Cookie VS Session VS Token 以及 Session不一致问题的N种解决方案

    文章目录 Cookie VS Session VS Token History Cookie Session Token Session不一致问题 Session不一致解决方案 nginx sessi ...

  5. spring+redis自主实现分布式session(非spring-session方式)

    为什么80%的码农都做不了架构师?>>>    背景:最近对一个老项目进行改造,使其支持多机部署,其中最关键的一点就是实现多机session共享.项目有多老呢,jdk版本是1.6,s ...

  6. 基于Spring Session实现JIM分布式Session

    基于Spring Session实现JIM分布式Session 前引 在实际项目中,应用程序经常会以集群方式部署线上,一般来说无状态的应用程序是理想的部署方式,一旦应用程序拥有状态(比如Session ...

  7. [Java][web]利用Spring随时随地获得Request和Session

    利用Spring随时随地获得Request和Session 一.准备工作: 在web.xml中加入 <listener> <listener-class> org.spring ...

  8. 将tomcat的session信息通过memcached实现共享

    为什么80%的码农都做不了架构师?>>>    1.先学大拿来点介绍 MSM(memcached-session-manager)支持tomcat6和tomcat7 ,利用Value ...

  9. spring session 退出登录 清理session

    2019独角兽企业重金招聘Python工程师标准>>> spring session 退出登录 清理session 博客分类: spring /*** Allows creating ...

最新文章

  1. html5标签 H5标签
  2. 如果给一个单位做相关的软件,你认为最重要的是需要得到谁的支持,为什么...
  3. mysql定时器每月执行一次_MySQL定时器可以设置执行次数吗
  4. 忘却的旋律java2_mc忘却的旋律启动器下载
  5. linux 输入是否为数字,【shell】Linux shell 之 判断用户输入的变量是否为数字
  6. 【问题汇总】Ubuntu使用常见问题
  7. ae 地理坐标与投影坐标转换 [转]
  8. 【路径规划】基于matlab GUI蚁群算法求解机器人栅格地图最短路径规划问题【含Matlab源码 927期】
  9. cmake 指定平台编译arm64_Arm V7 V8处理器编译Target小提示
  10. CCNA 折扣号申请流程(新版)
  11. ali p3c规则扩展-集成sonar
  12. GroupBox与Panel控件
  13. Android12及所有版本解决没有system读写权限(只需要magisk面具)
  14. 截图并使用libjpeg库压缩BMP为JPG与将JPG转换为BMP
  15. hadoop 3.3.1 安装笔记
  16. 开机提示:one of your disks needs to be checked解决方法
  17. 盘古开源丨数据大爆炸时代,云存储成为企业存储必然发展方向
  18. el-table设置表头样式
  19. 质数(素数)的概念和应用
  20. Git git config 配置使用

热门文章

  1. [转]html中offsetTop、clientTop、scrollTop、offsetTop各属性介绍
  2. 013实现使用两个堆栈队列(keep it up)
  3. 【超清视频】CCNA系列课程之二:IP地址介绍及VLSM子网划分
  4. generator自动生成mybatis的xml配置
  5. 站长工具|百度搜索框提示功能
  6. SqlBulkCopy批量复制数据
  7. C#的static,interface,virtual,abstract,override的区别用法
  8. java kettle log_kettle使用log4j管理输出日志
  9. Python3有哪几种数据类型?
  10. ELK学习5_ELK文档资料:《ELK stack 权威指南/饶琛琳》推荐