前言
- 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中配置方法如下:
@Bean
public 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 配置
@Bean
public 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