关于session和cookie
近期有被问到一个问题--“session和cookie的本质是什么?为什么需要这两种技术?”,我一脸懵,所以在此记录一下整理的一些知识点。
首先,Session和Cookie的本质是会话跟踪技术。web应用程序是使用HTTP协议传输数据的,由于HTTPS是无状态的,一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要重新建立连接。简单一点说明问题:HTTP协议是无状态的协议。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种机制。
首先是Cookie,Cookie本质是服务器发送给客户端的特殊信息,而这些信息是以文本的形式存储在客户端的,然后客户端每次发送请求的时候,都会带上这些信息,从而可以让服务器知道是哪一个用户,个人理解,Cookie就好像是一个身份证,无论要去办什么事情,请随时带着自己的身份证,以证明你是谁,接着才能知道接下来的事情应该是什么。下面简单的用图的方式说明一下,cookie传递的过程:
注意:cookie具有不可跨域性。
然后是Session,Session是另一种记录客户状态的机制,不同于Cookie技术,Session是记录在服务器端的。客户端浏览器访问服务器的时候,服务器把信息以某种形式记录下来。产生一个SessionId来表明这块内存空间是你的(在tomcat中称为jsesessionId)。同时,会在服务器返回给浏览器端时,将sessionId返回,然后记录在Cookie中,也就是只要浏览器没有关闭,并且没有失效,那么你每次发送信息都会带着sessionId,那么服务器就会根据sessionId找到对应的存储空间,找到相应的信息,从而就完全能将http无状态的问题解决掉了。但是,如果浏览器关闭,那么服务器就会将对应的sessionId对应的存储空间清除,下次登陆的时候,重新产生新的存储空间和对应的sessionId。
注意:当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了sessionId,如果已包含则说明以前已经为此客户端创建过session。如果客户端请求不包含sessionId,则为此客户端创建一个session并且生成一个与此session相关的sessionid。
参考文章:https://www.cnblogs.com/zhouhbing/p/4204132.html
https://blog.csdn.net/jpygx123/article/details/82973816