始终对Session和Cookies的应用有点困惑,趁手上有个小需要用到了的机会学习一下。

基础知识

1.因为http协定是无状态的协定,为了可能记住申请的状态,于是引入了Session和Cookie的机制。
2.Session是存在于服务器端的,在单体式利用中,由Tomcat治理,而Cookie则是存在于客户端,更不便了解的说法,能够说存在于浏览器。
3.Cookie只是实现Session的其中一种计划。尽管是最罕用的,但并不是惟一的办法。
4.流程

  • 首先,客户端会发送一个http申请到服务器端。
  • 服务器端承受客户端申请后,建设一个session,并发送一个http响应到客户端,这个响应头,其中就蕴含Set-Cookie头部。该头部蕴含了sessionId。
  • 在客户端发动的第二次申请,如果服务器给了set-Cookie,浏览器会主动在申请头中增加cookie
  • 服务器接管申请,合成cookie,验证信息,核查胜利后返回response给客户端

代码示例



1.如果没有调用request.getSession()办法,那么服务器永远都不会创立JSESSIONID。
2.如果调用request.getSession()办法那么状况分为以下两种状况:

  • 如果是第一次拜访,那么request.getSession()会创立一个JSESSIONID,并且在响应头外面有设置:

Set-Cookie:JSESSIONID=********************************; Path=/; HttpOnly

  • 如果不是第一拜访,那么此次浏览器拜访该项目标时候,申请头会带有:

Cookie:JSESSIONID=*********************************
request.getSession()会先去获取申请头的JSESSIONID,并且在服务器外面查找该ID,如果该session对象还存活(tomcat默认session的存活工夫为30分钟,过了30分钟后,该session对象会被销毁)则间接获取该session,如果该session曾经被销毁了,则从新又创立一个session对象

分布式状况下的Session

通过一个ngxin的负载平衡拜访来阐明下存在的问题。
1.启动一个nginx,负载平衡拜访到8080,8081两个服务


2.首先拜访到了8080,带回了set-cookies命令和sessionID

3.拜访getName接口,因为nginx的负载平衡,此时拜访到了8081

因为Session是存储在了Tomcat上的,而当初是两个Tomcat,所以Session是不同的!

整合spring-session-data-redis



首先拜访到了8080,带回了set-cookies命令和sessionID

查看redis

拜访getName接口,因为nginx的负载平衡,此时拜访到了8081,此时没有再生成新的sessionId

Demo: https://github.com/WillLiaowh...