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>

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>-->

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>

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

springSession框架来实现sso单点登陆

最后一个是存的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都在这个类里面

上一篇:[BZOJ 4417][Shoi2013]超级跳马


下一篇:洛谷 P3990 [SHOI2013]超级跳马 解题报告