spring boot--整合spring session实现session共享以及cookie丢失问题解决

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/liuchuanhong1/article/details/78432401

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>


2 开启spring session配置

@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里面的信息,如有更好的解决方案,还请不吝赐教。


猜你喜欢

转载自blog.csdn.net/liuchuanhong1/article/details/78432401