背景
HTTP是一个无状态协议
这里的无状态是指服务器不知道客户端是什么状态,每一个请求都是独立的。但是HTTP的无状态特性严重阻碍了交互式应用程序的实现,因为交互是需要承前启后的,例如一个购物车程序需要知道用户之前选择了什么东西。于是,两种用于保持HTTP状态的技术就应运而生了,一个是Cookie,另一个是Session
Cookie
Cookie是保存在客户端中的一小段数据。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器发送Cookie。客户端收到响应后,会把Cookie保存起来。当客户端再次向服务器发起请求时,客户端会在请求中携带Cookie,一同提交给服务器。服务器收到请求后,会检查Cookie,以此来辨认用户身份、用户状态。服务器还可以根据需要修改Cookie的内容。
Cookie的用途
记录用户信息,实现免用户名/密码登录
服务器根据Cookie推送一些用户相关的信息
Session
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端中,而Session保存在服务器上。客户端访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是Session。客户端再次访问服务器时,服务器只需要从该Session中查找该客户的状态就可以了。
每个客户端访问服务器都会建立一个session,那服务器是怎么找到与客户端对应的那个Session?最常见的解决方法就是:客户端与服务器建立连接的同时,服务器除了会建立一个Session。服务器还会自动为这个Session分配一个SessionId,服务器将这个SessionId写入Cookie,并将通过response返回给客户端,客户端就会在本地保存这个SessionId。此后,客户端发起的每次请求,都会包含SessionId这个信息,服务器通过查询cookie就可以获取SessionId,从而匹配到对应的Session。
如果客户端的浏览器禁用了Cookie,那上述方法就失效了, 这是需要使用URL重写技术来解决Session的匹配问题。简单地将就是在每次请求的URL中加上SessionId的相关信息,服务器以此来识别用户,匹配对应的Session
Session的用途
Session可以记录用户的登录与行为数据,即记录下用户目前访问服务器上的那些内容,状态是什么
在用户执行刷新操作时,或者再次访问服务器时(一定时间范围内),可以直接根据Session,打开用户上次访问时网页的状态(如用户输入的表单内容等等),为用户带来更优的体验,提供个性化服务。
Cookie与Session
Cookie和Session都是用于记录用户信息、状态的方法
Session因为SessionId的存在,它的实现通常要依赖Cookie
Session保存在服务器端,Cookie则保存在客户端
在客户端可以通过一定的方式修改Cookie,但是再客户端无法修改Session
客户端发起的每次请求都会携带所有的Cookie信息,而Session中的信息不会在请求/响应中携带
服务器会把长时间没有活动的Session清除,Cookie则是根据其过期时间参数决定其有效时长
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。