【spring-session】多项目实现session共享
前言
- 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共享相关推荐
- springboot配置shiro多项目实现session共享的详细步骤
springboot配置shiro多项目实现session共享的详细步骤 公司需要这样的需求: 有两个项目master 主项目.suiteone 项目,两个项目各自由shiro 安全框架管理,当不能登 ...
- Spring Session + Redis实现分布式Session共享
2019独角兽企业重金招聘Python工程师标准>>> 通常情况下,Tomcat.Jetty等Servlet容器,会默认将Session保存在内存中.如果是单个服务器实例的应用,将S ...
- Spring boot - 使用redis实现session共享
在分布式系统架构的系统中,我们如何保证session的一致性,其中之一的解决方式就是session共享形式,在SpringBoot框架中如何使用session达成共享呢,我们可以借助指定Redis实现 ...
- Spring Session - Cookie VS Session VS Token 以及 Session不一致问题的N种解决方案
文章目录 Cookie VS Session VS Token History Cookie Session Token Session不一致问题 Session不一致解决方案 nginx sessi ...
- spring+redis自主实现分布式session(非spring-session方式)
为什么80%的码农都做不了架构师?>>> 背景:最近对一个老项目进行改造,使其支持多机部署,其中最关键的一点就是实现多机session共享.项目有多老呢,jdk版本是1.6,s ...
- 基于Spring Session实现JIM分布式Session
基于Spring Session实现JIM分布式Session 前引 在实际项目中,应用程序经常会以集群方式部署线上,一般来说无状态的应用程序是理想的部署方式,一旦应用程序拥有状态(比如Session ...
- [Java][web]利用Spring随时随地获得Request和Session
利用Spring随时随地获得Request和Session 一.准备工作: 在web.xml中加入 <listener> <listener-class> org.spring ...
- 将tomcat的session信息通过memcached实现共享
为什么80%的码农都做不了架构师?>>> 1.先学大拿来点介绍 MSM(memcached-session-manager)支持tomcat6和tomcat7 ,利用Value ...
- spring session 退出登录 清理session
2019独角兽企业重金招聘Python工程师标准>>> spring session 退出登录 清理session 博客分类: spring /*** Allows creating ...
最新文章
- html5标签 H5标签
- 如果给一个单位做相关的软件,你认为最重要的是需要得到谁的支持,为什么...
- mysql定时器每月执行一次_MySQL定时器可以设置执行次数吗
- 忘却的旋律java2_mc忘却的旋律启动器下载
- linux 输入是否为数字,【shell】Linux shell 之 判断用户输入的变量是否为数字
- 【问题汇总】Ubuntu使用常见问题
- ae 地理坐标与投影坐标转换 [转]
- 【路径规划】基于matlab GUI蚁群算法求解机器人栅格地图最短路径规划问题【含Matlab源码 927期】
- cmake 指定平台编译arm64_Arm V7 V8处理器编译Target小提示
- CCNA 折扣号申请流程(新版)
- ali p3c规则扩展-集成sonar
- GroupBox与Panel控件
- Android12及所有版本解决没有system读写权限(只需要magisk面具)
- 截图并使用libjpeg库压缩BMP为JPG与将JPG转换为BMP
- hadoop 3.3.1 安装笔记
- 开机提示:one of your disks needs to be checked解决方法
- 盘古开源丨数据大爆炸时代,云存储成为企业存储必然发展方向
- el-table设置表头样式
- 质数(素数)的概念和应用
- Git git config 配置使用
热门文章
- [转]html中offsetTop、clientTop、scrollTop、offsetTop各属性介绍
- 013实现使用两个堆栈队列(keep it up)
- 【超清视频】CCNA系列课程之二:IP地址介绍及VLSM子网划分
- generator自动生成mybatis的xml配置
- 站长工具|百度搜索框提示功能
- SqlBulkCopy批量复制数据
- C#的static,interface,virtual,abstract,override的区别用法
- java kettle log_kettle使用log4j管理输出日志
- Python3有哪几种数据类型?
- ELK学习5_ELK文档资料:《ELK stack 权威指南/饶琛琳》推荐