SpringCloud架构共享Session

这里使用spring-session和redis来解决共享session

首先加入依赖

		
			org.springframework.boot
			spring-boot-starter-data-redis
			2.0.6.RELEASE
		
		  
            org.springframework.session  
            spring-session-data-redis  
         

加入redis的配置

SpringCloud架构共享Session_第1张图片

在启动类加入开启redishttpSession的注解

@SpringBootApplication
@EnableEurekaClient
@EnableSwagger2
@EnableFeignClients
@EnableRedisHttpSession//重点在这
public class SolaApplication {

	public static void main(String[] args) {
		SpringApplication.run(SolaApplication.class, args);
	}
}

然后就去写个接口测试一下,和正常用session同一种用法(个人理解应该是写的拦截器)

	@GetMapping(value="setsession")
	@ApiOperation(value = "sola最吊设置session")
	public Map setSession(String key , String username,String value){
		Map map = new HashMap<>();
		//创建该客户端(会话)的私有的session区域
		//request.getSession();方法内部会判断,该客户端是否已在服务端已有session,存在不创建
		HttpSession session = request.getSession();
		
		//获取该session区域的唯一id
		String id = session.getId();
		
		session.setAttribute(key, username + "#" + value);

/*		Cookie cookie = new Cookie("SESSION", id);
		
		cookie.setPath("/");
		
		cookie.setMaxAge(60*30);
		
		response.addCookie(cookie);*/
		
		return map;
	}
	@GetMapping(value="getSession")
	@ApiOperation(value = "sola最吊获取session")
	public Map getSession(String key){
		Map map = new HashMap<>();

		HttpSession session = request.getSession();
		
		Object attribute = session.getAttribute(key);
		
		System.err.println(attribute);
		
		//删除值
		//session.removeAttribute(key);
		map.put("names", attribute);
		
		return map;
	}

去看下cookie,再去swagger测试一下

SpringCloud架构共享Session_第2张图片

SpringCloud架构共享Session_第3张图片

SpringCloud架构共享Session_第4张图片

 SpringCloud架构共享Session_第5张图片

貌似一切正常 ,我们去另一个微服务 也加入依赖,和redis直接调用一下session试试

mgr模块加入个session查询

public Map getSession(String key){
		Map map = new HashMap<>();

		HttpSession session = request.getSession();
		

		String id = session.getId();
		
		Object attribute = session.getAttribute(key);

		System.err.println(attribute);
		
		map.put("id", id);
		
		map.put("names", attribute);
		
		return map;
	}

然后去swagger测试,貌似成功了,但是突然想起来我没有在启动类加入开启注解居然也成功了

SpringCloud架构共享Session_第6张图片

那么继续不加入注解在mgr模块加个Session参数试试 

测试后发现也是可以设置的成功的。。。所以注解目测加不加都可以 但是保险起见还是加上吧

存取可以了,但是还有两个问题

之前用Response写回Cookie增加时间貌似不可以了,

还有这种Session存在redis的时间是多少。

设置Cookie时间可以在配置文件配置(暂时解决方法)(测试其他自定义cookie无效)

server:
  servlet:
    session:
      cookie:
        max-age: 10000

Session存储时间多少默认是多少?刚开始去搜没搜出来,但是突然看到可以用ttl 看key的存活时间,感觉之前redis白学了

127.0.0.1:6379> keys *
 1) "spring:session:sessions:expires:37783c3a-e743-456c-a53a-94c0ffef2f52"
 2) "jsession"
 3) "spring:session:sessions:37783c3a-e743-456c-a53a-94c0ffef2f52"
 4) "jedislist"
 5) "jedishash"
 6) "spring:session:expirations:1540202100000"
 7) "jedisString"
 8) "sola1121"
 9) "jedismaplist"
10) "solalist"
11) "mysortedset"
127.0.0.1:6379> ttl spring:session:sessions:37783c3a-e743-456c-a53a-94c0ffef2f52

(integer) 2035
127.0.0.1:6379> ttl spring:session:sessions:37783c3a-e743-456c-a53a-94c0ffef2f52

(integer) 2028

看到了默认大概是30分钟

用代码可以设置redis中sessionKey的存活时间

		session.setAttribute(key, username + "#" + value);
		
		session.setMaxInactiveInterval(60*60);

时间是比默认的多了 ,但是时间貌似比设置的多五分钟?

其他设置sessionKey时间,未测试

@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds= 3600,redisNamespace = "tl")
public class RedisSessionConfig {
    
}

 

你可能感兴趣的:(session)