spring session可以利用redis透明的存储并共享web应用的HttpSession,当结合spring boot使用时,更是大大的节省了我们整合的时间。
1 添加pom依赖
<!-- redis starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- spring session的依赖 -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
@SpringBootApplication
@EnableRedisHttpSession
public class SpringcloudGatewayApplication {
}
上面的例子中,使用的是Redis来存储应用的session,当然spring session还支持以下几种方式:
EnableGemFireHttpSession
EnableMongoHttpSession
EnableJdbcHttpSession
当然pom文件里面要加上各自对应的依赖
当添加完依赖之后,我们需要开启spring session的配置,该配置会负责创建一个Servlet的过滤器:SessionRepositoryFilter,该过滤器负责包装HttpServletRequest,并将替换HttpSession的实现。
3 HttpSession策略
默认的情况下,使用的是CookieHttpSessionStrategy,这种策略将允许使用setCookieName来指定Cookie的名称,如果不指定,默认是SESSION。当一个会话被创建时,HTTP响应将会有一个包含指定cookie名称和session id的cookie。spring session也支持其他的策略,如下:
HeaderHttpSessionStrategy
MultiHttpSessionStrategyAdapter
如何配置HttpSession策略,方式如下:
@Configuration
public class HttpSessionConfig {
@Bean
public HttpSessionStrategy httpSessionStrategy() {
return new CookieHttpSessionStrategy();
}
}
默认使用的是CookieHttpSessionStrategy
4 增加redis配置
由于session信息被过滤器拦截之后,会存放在redis中,因此,我们需要添加redis的配置,这部分就不做过多的介绍,请参考前面的博客。
5 查看redis中存放的session信息
我们可以使用keys *来查看redis中所有的session信息
使用hkeys来查看具体session里面包含的属性
使用hget来查看具体属性的值,例如:hget spring:session:sessions:98b669ec-9e1a-4bbc-a891-ac6502d28aa7 "sessionAttr:honeybeeSingleNo"
6 使用
使用的方式和原来的方式一致,不需要做任何的改变,例如
HttpSession session = request.getSession();
if(null != no && !no.isEmpty()){
UserInfo employee = client.queryEmployeeByNo(no);
if(null != employee){
session.setAttribute("employee", employee);
}
}
7 使用中发现的问题
在实际的使用中,我们发现每次请求经过zuul的时候,session就会发生改变,导致后面的请求获取不到session中的内容,该问题疑似是cookie丢失导致的,目前的解决方案是每次请求的时候,前端都将cookie信息带过来,从而获取session里面的信息,如有更好的解决方案,还请不吝赐教。