【spring-session】多项目实现session共享
前言
- spring-session 2.0.2.RELEASE
- 通過 spring-session 可以實現(xiàn)在多項目之間共享 session 。
- 此處不涉及跨域。
場景
- 場景1:同一個項目(項目A),部署多個,在訪問任何一個時,均能夠共享session(即項目A的集群部署)。
- 場景2:有2個項目(項目A、項目B),部署在同1個域名下,通過目錄區(qū)分訪問。在項目A登錄后,再進入項目B時,不需要再重新登錄。
- 場景3:有2個項目(項目A、項目B),部署在同不同域名下。在項目A登錄后,再進入項目B時,不需要再重新登錄。
使用 spring-session 可以輕松處理以上場景。
如何實現(xiàn)session共享?
以上所列的場景,均為同域的情況??缬騿栴},需要搭配其它方法。
場景1,只需要保證兩個實例均往同一個位置寫session,且從同一個位置讀session。比如講session保存到數(shù)據(jù)庫中,或者將session保存到redis中。 spring-session 可以實現(xiàn)通過數(shù)據(jù)庫或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從數(shù)據(jù)庫或redis中存取相同的session內(nèi)容。
場景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從數(shù)據(jù)庫或redis中存取相同的session內(nèi)容。
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]+)$ 是個通用寫法。如果正則表達式不匹配,則不會設(shè)置任何域。如果正則表達式匹配,則第一個分組將用作域。例如:https://child.mydomain.com的請求會將域設(shè)置為mydomain.com。http:// localhost:8080 /或https://192.168.1.100:8080/的請求將不對域名進行處理。因此,在切換域名時,不需要再做任何修改。
- domainName : 域名。設(shè)置成你想使用的域名。應設(shè)置成項目所在域名的某個父級域名。
- 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
總結(jié)
以上是生活随笔為你收集整理的【spring-session】多项目实现session共享的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【spring-session】 1.x
- 下一篇: 方程豹汽车首款车型豹5上市:28.98万