解决 session 共享问题,将 session 存入到 Redis 之中
spring-session 代替的时原本的 httpSession,相当于做代理
下面的操作是基于已经搭建完成 SSM 环境的
Spring Session 和 Redis 整合需要的包
<dependency>
<groupId>org.springframework.sessiongroupId>
<artifactId>spring-session-data-redisartifactId>
<version>2.5.1version>
dependency>
Redis 自身需要的包
<dependency>
<groupId>redis.clientsgroupId>
<artifactId>jedisartifactId>
<version>3.6.3version>
dependency>
spring-session.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
<property name="maxInactiveIntervalInSeconds" value="1800"/>
bean>
beans>
记得将它导入 applicationContext.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="classpath:spring-*.xml"/>
beans>
然后需要再 web.xml
中配置过滤器
<filter>
<filter-name>springSessionRepositoryFilterfilter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxyfilter-class>
filter>
<filter-mapping>
<filter-name>springSessionRepositoryFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
这样就初步配置好了,使用 session 的方法没有变
还是和以前一样 request.getSession().setAttribute
和 request.getSession().getAttribute
但以上只能实现 同域名
同项目
的 session 共享,注意需要同时满足两个”同“
如果是不同项目,那 session 将无法共享
原因是 cookie 存放的位置在各自的项目路径下,不同项目的 cookie 路径各不相同
所以两个 cookie 在不同的路径下,都无法访问到对方的 session (不能跨路径)
所以,想要做到不同项目的 session 共享,需要改变 cookie 存放的位置
将 spring-sessio.xml
修改为:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
<property name="maxInactiveIntervalInSeconds" value="1800"/>
<property name="cookieSerializer" ref="defaultCookieSerializer"/>
bean>
<bean id="defaultCookieSerializer" class="org.springframework.session.web.http.DefaultCookieSerializer">
<property name="cookiePath" value="/"/>
bean>
beans>
其实就是修改了 cookie 的存放路径,放在了域名的根目录下,这样所有项目的 cookie 放在一个相同的路径下,就实现了不同项目共享 session 了
上面已经基本上能达成大部分要求了
但如果是同一域名不同二级域名呢?那就还是不行
原因就是 cookie 虽然存放在域名的根路径下了,但如果二级域名不同,就相当于是存放在不同域名的根路径下,这就又导致了 cookie 没在一起,无法共享 session
那么既然路径可以设置为根路径,那域名同理,也可以设置根域名
所以解决方法就是指定 cookie 存放在根域名下,这样所有 cookie 都存放在根域名下的根路径,就都可以共享 session 啦!
修改配置如下(值修改序列化规则):
<bean id="defaultCookieSerializer" class="org.springframework.session.web.http.DefaultCookieSerializer">
<property name="cookiePath" value="/"/>
<property name="domainName" value="localhost"/>
bean>
完毕,以上已经基本上解决了现在的我们能遇到的情况
但我们又会想,如果是完全不同的两个域名呢?
完全不同的两个域名的 session 共享,有一个功能我们可能听说过
那就是 单点登录 (Single Sign On 简称 SSO)
要实现单点登录,就相当于实现完全不同的两个域名之间的 session 共享
但这个功能已经不是 SpringSession 能完成的了,需要额外写一个系统来完成这个功能(还不会)
期待日后的学习咯~
仰望星空,何尝不是凝视深渊,所以哇星星也在看着你(IceClean)