前述所说,session就是在服务器开辟一块内存记录下来你的内容,然后他又是怎么找到的呢,是通过sessionID,每一个session都有唯一的id。
流程就是服务创建了一个session,然后服务器把session的id返回给客户端,然后客户端可以通过这个id去访问其他页面服务。
session技术是基于cookie--------cookie技术
存储session编号--------JSESSIONID
我们来小敲一下代码
@GetMapping(value="setsession")
@ApiOperation(value = "sola最吊设置session")
public Map<String, Object> setSession(String key , String username,String value){
Map<String, Object> map = new HashMap<>();
//创建该客户端(会话)的私有的session区域
//request.getSession();方法内部会判断,该客户端是否已在服务端已有session,存在不创建
HttpSession session = request.getSession();
//获取该session区域的唯一id
String id = session.getId();
session.setAttribute(key, username + "#" + value);
map.put("id", id);
return map;
}
这就创建了一个session区域并设置了一个值 然后我们去看下cookie
如刚才所说session是基于cookie技术,cookie 来 记录服务器存储的id。
//request.getSession();方法内部会判断,该客户端是否已在服务端已有session,存在不创建,原理就是去读取cookie 看看有没有一个叫JSESSIONID的cookie,如果有就不创建新区域,没有就创建新区域
假如你清除了cookies那么也就没有的名为JSESSIONID的cookie,那么request.getSession();相当于没有拿到客户端的id,就会创建一个新的区域给你,但是之前的区域还存在但是已经无法找到了
---------------------------------------------------------------------------------------------------------------------------------------
上面搞定了设置值
下面来搞定获取值
@GetMapping(value="getSession")
@ApiOperation(value = "sola最吊获取session")
public Map<String, Object> getSession(String key){
Map<String, Object> 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;
}
获取值很简单
——————————————————————————————————————————————————————
Session对象的生命周期
创建:第一次执行request.getsession的时候创建session
销毁:(1)服务器关闭时
(2)Session过期/失效,默认(30分钟) 从不操作服务器资源时开始计时
(3)手动销毁Session(session.invalidate)
——————————————————————————————————————————————————————
创建session用的cookie默认是会话级别的,也就是说关闭服务器就没有该cookie了,虽然session默认是30分钟失效,但是关闭了网页再打开去访问也找不到原来的session。
然而解决的方法挺二的
@GetMapping(value="setsession")
@ApiOperation(value = "sola最吊设置session")
public Map<String, Object> setSession(String key , String username,String value){
Map<String, Object> 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("JSESSIONID", id);
cookie.setPath("/");
cookie.setMaxAge(60*30);
response.addCookie(cookie);
return map;
}
自己去设置一个JSESSION的Cookie并设置路径时间。。。。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
zuul共享session
默认设置假设sola子服务设置了一个session 然后去mgr子模块去取session mgr默认会丢掉原id从新建立一个新的id(重新给Cookie里的JSESSIONID赋值一个新的id一个新的模块)
然后我们再zuul配置文件配置一下
spring:
application:
name: ZUUL
server:
port: 30600
zuul:
sensitive-headers: "*" //这是重点貌似就可以了
routes:
postman:
path: /postman/**
service-id: POSTMAN
systemmgr:
path: /mgr/**
service-id: SYSTEMMGR
code:
path: /code/**
service-id: CODE
post:
path: /post/**
service-id: POST
resource:
path: /resource/**
service-id: RESOURCE
intergration:
path: /intergration/**
service-id: INTERGRATION
roadwork:
path: /roadwork/**
service-id: ROADWORK
solatest:
path: /solatest/**
service-id: SOLATEST
上述还是不行嗯。。。。。。。。。。。。。。。。。。