炫意html5
最早CSS3和HTML5移动技术网站之一

Cookie和Session

测试如下

@RequestMapping("/test")
public void test(HttpServletRequest request) {
Logger logger = LoggerFactory.getLogger(Test.class);
Cookie[] cookies = request.getCookies();
for(Cookie cookie : cookies){
if("user".equals(cookie.getName()))
System.out.println("user");
if("JSESSIONID".equals(cookie.getName())) {
System.out.println("JSESSIONID");
System.out.println("ID-Cookie :" + cookie.getValue());
HttpSession session = request.getSession();
logger.info("Session", session);
logger.info("ID : " + session.getId());
}
}
System.out.println(cookies.length);
}

启动SpringBoot,第一次访问时,session.id和jssionid不相同,第二次访问路径,session.id和jsessionid变得相同。关闭项目重新启动SpringBoot,第一次访问,session.id和jsessionid任然不相同,但是session.id和项目上次关闭时最后一次的jsessionid相同。
猜想如下,项目运行时,服务端会将上次最后访问的jsessionid作为session.id,而浏览器第一次访问服务器时,会生成jsessionid,但是不会发送Cookie,只有第二次访问服务器时,才会发送Cookie,这时服务器的session.id才会和jsessionid同步(上次的session.id被覆盖)。
这样理解Cookie和Session有不对的吗?

回答

第0步 :清理下浏览器cookie:
第一次访问 :浏览器cookie中没有 sessionid ,所以服务端会生成sessonid 并通过cookie下发 ; [sessionid=” jsessionid=’aaa’]
第二次访问: 浏览器携带cookie 请求服务端 , 服务端去自己内存中找这个sessionid(aaa) ,存在不再下发新的id了 ; [sessionid=’aaa’ jsessionid=’aaa’]
服务端重启后:服务端内存中的session id被清空
第三次访问: 浏览器会携带第一次服务端下发的 cookie 请求服务端 , 服务端去自己内存中找这个id ,找不到 ,会下发新的session id ,浏览器接受到会更新再 cookie中保存的sessionid ; [sessionid=’aaa’ jsessionid=’bbb’]
第四次访问: 这次浏览器携带的是第三次生成的sesionid (bbb)访问服务端 ; [ sessionid=’bbb’ jsessionid=’bbb’]

总结: 服务端的sessionid 是获取的客户端上传过来的cookie中的sessionid ,服务端的jsessionid 是内存中维护的即将下发的session id ;

session 是会话的意思 , 是浏览器和服务端建立会话 , 因为http协议是无状态的,于是有了cookie的诞生 ,让服务端知道本次请求 是上次那个小王发出的 。 第一次访问,服务端不知道是谁访问的,于是给了它一个id ,让它保存好,以后每次访问我都携带上,放到cookie请求头里面 , 于是会话就建立了 ,服务单知道 本次请求和上次是同一个 id发出的 。

炫意HTML5 » Cookie和Session

Java基础教程Android基础教程