Cookie与Session一直看到,但是没系统去了解,这里专门整理一下
https://blog.csdn.net/github_37037281/article/details/80403938
https://www.cnblogs.com/l199616j/p/11195667.html
https://blog.csdn.net/Bb15070047748/article/details/108809255
https://www.cnblogs.com/zhuanzhuanfe/p/8010854.html
Cookie与Session是用来干什么的?
1.
这得从HTTP协议讲起,HTTP协议是短连接、无状态的,简单说就是:短连接指浏览器每次发送请求,都是建立一个全新的HTTP连接,不能发送完成后还保持连接,连续请求时不方便;无状态指服务器无法通过HTTP连接判断用户的身份,无法判断是不是上个连接的用户。Cookie、Session解决的是无状态这个问题,Websocket、HTTP1.1解决的是短连接问题。
2.
实际业务中,特别是登录场景中,是需要服务器能够识别用户身份的,需要知道哪些请求是来自同一个用户的,即使用户暂时离开再操作、关闭浏览器重开,也都要能够识别到是上一个用户。在短连接的情景下,可想而知,至少有一方(这个说法不对,因为HTTP是无状态的,必须要浏览器主动告诉服务器自己的身份,所以浏览器必须保存身份信息,服务器可选保存身份信息)要保存用户身份信息,在重新建立HTTP连接时,浏览器发送请求时将身份信息带上,告诉服务器。Cookie、Session就是浏览器干的事。
注意:
1)照上面这个分析,长连接WebSocket似乎不需要Cookie、Session?网上看了一下,确实可以不需要。
2)需要识别连接来自同一个用户的场景:电商中购物车,添加一次商品就是发送一次请求,如果服务器不能识别是同一个用户的话,会混乱。 上面这个说法不对,应该说任何需要登录的功能都需要识别,因为登录操作本身就算一个请求,登录的目的是要长时间保持一个状态,如果不能识别请求来自同一个用户,这次请求完成登录之后,下个请求又是一个新的链接,无法判断与上次登录是不是一个用户,那还是无法判断是否登录了,登录就没有意义。
3.
上面说到,浏览器必须保存身份信息,服务器可选保存身份信息,这个说法可以更细致一些:浏览器可选(长时间)保存身份信息、浏览器请求必须携带身份信息、服务器可选(长时间)保存身份信息。
HTTP链接是无状态的,所以服务器要识别链接属于同一个用户,必须要浏览器主动告诉它,所以浏览器请求必须携带身份信息是肯定的。但是,这个身份信息可只是一个身份证号,详细的身份信息到底保存在哪,是可选的。保存在浏览器端就是用Cookie,保存在服务器端就是用Session。Cookie在浏览器端是一个文件,可以持久化存储,Session在服务器端只是一个内存对象,关了就没了。
1)Session技术出现在Cookie技术之后,现在貌似Session是一定存在,而Cookie倒不一定了;如果要基于Session来使用详细身份信息,浏览器请求时要用携session-id作为身份信息。那么浏览器要保存session-id信息,保存在哪?可以用cookie来保存,这时使用cookie的主要目的就不是记录详细身份信息了,而只是保存并携带session-id信息。也可以不用cookie保存,通过URL重写来实现,看一些博客中的讲解,貌似是服务器返回给浏览器的HTML页面中,与链接有关的部分,都加上了session-id信息。
2)如果要用Cookie存储session-id,服务器会让浏览器创建名为JSESSIONID的Cookie,value字段为session-id。这个Cookie的生命周期为会话,浏览器关了就没了。这里很奇怪啊,浏览器管理session不会消失,但是这个cookie会消失?哪session不一样,还是没用了吗?貌似真是这么回事。如下面连接中说的:
https://blog.csdn.net/xldmx/article/details/86532897
3)说的是Cookie、Session保存详细身份信息,但是Cookie中与身份相关的信息貌似只有一个,就是value字段,value值在服务器上是唯一的,因此可以用于区分用户。并不包含具体的用户身份信息。另外,存在cookie貌似就表示登录了。Session本身存在一个属性字段,能够以键值对方式存储具体信息,所以能够存储的信息比Cookie多。
4.
Cookie、Session什么时候创建、什么时候销毁、由谁创建?
注意了,Cookie、Session都是为了让服务器识别出HTTP连接,所以Cookie、Session中装的内容都是由服务器决定的,也是由服务器决定是否创建的。Cookie是服务器将Cookie信息发送给浏览器,然后浏览器在本地创建保存,Session是服务器在服务器端创建的。
Session是浏览器首次连接到服务器时创建的,服务器会检测请求中的session-id字段【也可能是名称为JSESSIONID的Cookie的value字段】,如果不存在该字段,或者不存在与之对应的session对象,服务器就会创建一个session对象。Session存在过期时间,在到达过期时间之前无法删除,浏览器关闭了,服务器也不会删除。
Cookie是浏览器接收到服务器的响应,而且响应中要求创建Cookie,浏览器才会创建的。Cookie的过期时间可以是会话,也可以是某个时间。如果是会话【这个会话与Session含义不同?】,那么Cookie保存到内存中,浏览器关闭了就没了,如果是某个具体时间,那么会存到硬盘。