springSession框架来实现sso单点登陆

介绍一下springsession这个框架,其实springsession框架默认的是使用redis来实现单点登陆的,但是不支持redis集群,这个框架的特点是无侵入的实现单点登陆,就是说我们之前获取user的信息是从session中获取的,我们改造好之后还是从session中获取,逻辑代码不用改变,只不过这个session已经不是我们之前的httpsession了,它是框架包装的session,因为我们在配置文件中配置了相关的属性。ok,看代码吧。 

注意:spring的版本要是4.0.3.RELEASE之上。否者会出错!!!

pom.xml

<!-- spring session 单点登录 -->
    <dependency>
      <groupId>org.springframework.session</groupId>
      <artifactId>spring-session-data-redis</artifactId>
      <version>1.2.0.RELEASE</version>
    </dependency>
View Code

web.xml配置   这个过滤器意思就是说拦截.do的请求,就是这个过滤器来包装session的。

<!--<filter>-->
        <!--<filter-name>springSessionRepositoryFilter</filter-name>-->
        <!--<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>-->
    <!--</filter>-->
    <!--<filter-mapping>-->
        <!--<filter-name>springSessionRepositoryFilter</filter-name>-->
        <!--<url-pattern>*.do</url-pattern>-->
    <!--</filter-mapping>-->
View Code

applicationContext-spring-session.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- 配置存在redis的session的过期时间-->
    <bean id="redisHttpSessionConfiguration" class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
        <property name="maxInactiveIntervalInSeconds" value="1800" />
    </bean>
    <!-- 配置redis的最大数量 -->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal" value="20"/>
    </bean>
    <!-- 配置redisFactory -->
    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="127.0.0.1" />
        <property name="port" value="6379" />
        <property name="poolConfig" ref="jedisPoolConfig" />
    </bean>




</beans>
View Code

原理是登陆的时候框架会默认向redis插入三条数据:

 最后一个是存的User对象的一些数据。第二个是存的过期时间,也就是我们在xml中配置的那个时间,第一个我也不知道是啥。反正是只要时间一到,第一和第二就会删除,就得不到User的信息。尽管第三条数据没有删除(时间到了也会删除),他们三个都是有过期时间的。

那么客户端浏览器呢?浏览器会存一个cookie,cookie的key是SESSION , value是第三条数据的最后那个UUID。

我们也可以设置这个key的名字,他的类在DefaultCookieSerializer.class这个类。包括path和顶级域名,时长什么的都在这个类设置。

注意:上面的applicationContext-spring-session.xml中我没有设置这个DefaultCookieSerializer的属性,在我们要实现单点登陆的情况下,必须要设置的,因为我们要设置顶级域名和,不懂的看redis原生实现单点登陆那篇博客。设置很简单,就是<bean></bean>设置几个字段就ok了。

 RedisOperationsSessionRepository 这个类也需要特别注意下,session的get,remove都在这个类里面

原文地址:https://www.cnblogs.com/coder-lzh/p/8784770.html