【Spring之轨迹】Spring Session 基础使用(三种情况)

—— 目录 ——

  • 0. Spring Session 简介
  • 1. 所需的依赖包
  • 2. 配置文件
  • 3. 同域名不同项目的 session 共享
  • 4. 同域名不同二级域名的 session 共享
  • 5. 完全不同域名的 session 共享(单点登录,还不会)


0. Spring Session 简介

解决 session 共享问题,将 session 存入到 Redis 之中
spring-session 代替的时原本的 httpSession,相当于做代理

下面的操作是基于已经搭建完成 SSM 环境的

1. 所需的依赖包

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>

2. 配置文件

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().setAttributerequest.getSession().getAttribute

3. 同域名不同项目的 session 共享

但以上只能实现 同域名 同项目 的 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 了


4. 同域名不同二级域名的 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>

5. 完全不同域名的 session 共享(单点登录,还不会)

完毕,以上已经基本上解决了现在的我们能遇到的情况
但我们又会想,如果是完全不同的两个域名呢?

完全不同的两个域名的 session 共享,有一个功能我们可能听说过
那就是 单点登录 (Single Sign On 简称 SSO)
要实现单点登录,就相当于实现完全不同的两个域名之间的 session 共享

但这个功能已经不是 SpringSession 能完成的了,需要额外写一个系统来完成这个功能(还不会)

期待日后的学习咯~


仰望星空,何尝不是凝视深渊,所以哇星星也在看着你(IceClean)

你可能感兴趣的:(【Spring之轨迹】,笔记,spring,java,session)