背景

HTTP是一个无状态协议

这里的无状态是指服务器不知道客户端是什么状态,每一个请求都是独立的。但是HTTP的无状态特性严重阻碍了交互式应用程序的实现,因为交互是需要承前启后的,例如一个购物车程序需要知道用户之前选择了什么东西。于是,两种用于保持HTTP状态的技术就应运而生了,一个是Cookie,另一个是Session

Cookie

Cookie是保存在客户端中的一小段数据。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器发送Cookie。客户端收到响应后,会把Cookie保存起来。当客户端再次向服务器发起请求时,客户端会在请求中携带Cookie,一同提交给服务器。服务器收到请求后,会检查Cookie,以此来辨认用户身份、用户状态。服务器还可以根据需要修改Cookie的内容。

  • Cookie的用途

  1. 记录用户信息,实现免用户名/密码登录

  2. 服务器根据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的用途

  1. Session可以记录用户的登录与行为数据,即记录下用户目前访问服务器上的那些内容,状态是什么

  2. 在用户执行刷新操作时,或者再次访问服务器时(一定时间范围内),可以直接根据Session,打开用户上次访问时网页的状态(如用户输入的表单内容等等),为用户带来更优的体验,提供个性化服务。

Cookie与Session

  • Cookie和Session都是用于记录用户信息、状态的方法

  • Session因为SessionId的存在,它的实现通常要依赖Cookie

  • Session保存在服务器端,Cookie则保存在客户端

  • 在客户端可以通过一定的方式修改Cookie,但是再客户端无法修改Session

  • 客户端发起的每次请求都会携带所有的Cookie信息,而Session中的信息不会在请求/响应中携带

  • 服务器会把长时间没有活动的Session清除,Cookie则是根据其过期时间参数决定其有效时长


jhhfft
590 声望40 粉丝

Write the Code. Change the World.


引用和评论

0 条评论