这里使用spring-session和redis来解决共享session
首先加入依赖
org.springframework.boot
spring-boot-starter-data-redis
2.0.6.RELEASE
org.springframework.session
spring-session-data-redis
加入redis的配置
在启动类加入开启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测试一下
貌似一切正常 ,我们去另一个微服务 也加入依赖,和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测试,貌似成功了,但是突然想起来我没有在启动类加入开启注解居然也成功了
那么继续不加入注解在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 {
}