一直对Session和Cookies的使用有点困惑,趁手上有个小需求用到了的机会学习一下。nginx
1.因为http协议是无状态的协议,为了可以记住请求的状态,因而引入了Session和Cookie的机制。
2.Session是存在于服务器端的,在单体式应用中,由Tomcat管理,而Cookie则是存在于客户端,更方便理解的说法,能够说存在于浏览器。
3.Cookie只是实现Session的其中一种方案。虽然是最经常使用的,但并非惟一的方法。
4.流程git
1.若是没有调用request.getSession()方法,那么服务器永远都不会建立JSESSIONID。
2.若是调用request.getSession()方法那么状况分为如下两种状况:github
Set-Cookie:JSESSIONID=********************************; Path=/; HttpOnly
redis
Cookie:JSESSIONID=*********************************
request.getSession()会先去获取请求头的JSESSIONID,而且在服务器里面查找该ID,若是该session对象还存活(tomcat默认session的存活时间为30分钟,过了30分钟后,该session对象会被销毁)则直接获取该session,若是该session已经被销毁了,则从新又建立一个session对象spring
经过一个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,此时没有再生成新的sessionIdtomcat
Demo: https://github.com/WillLiaowh...服务器