【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中配置方法如下:

@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="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,spring-boot)