zoukankan      html  css  js  c++  java
  • Cookie和Session的区别

    前言

    HTTP是一种无状态的协议,为了分辨链接是谁发起的,就需要我们自己去解决这个问题。不然有些情况下即使是同一个网站我们每打开一个页面也都要登录一下。而Session和Cookie就是为解决这个问题而提出来的两个机制。

    应用场景

    日常登录一个网站,今天输入用户名密码登录了,第二天再打开很多情况下就直接打开了。这个时候用到的一个机制就是cookie。

    session的一个场景是购物车,添加了商品之后客户端处可以知道添加了哪些商品,而服务器端如何判别呢,所以也需要存储一些信息,这里就用到了session。

    通俗讲,Cookie是访问某些网站以后在本地存储的一些网站相关的信息,下次再访问的时候减少一些步骤。另外一个更准确的说法是:Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器,是一种在客户端保持状态的方案。

    Cookie的主要内容包括:名字,值,过期时间,路径和域。使用Fiddler抓包就可以看见,比方说我们打开百度的某个网站可以看到Headers包括Cookie,如下:

    BIDUPSID: 9D2194F1CB8D1E56272947F6B0E5D47E
    PSTM: 1472480791
    BAIDUID: 3C64D3C3F1753134D13C33AFD2B38367:FG
    ispeed_lsm: 2
    MCITY: -131:
    pgv_pvi: 3797581824
    pgv_si: s9468756992
    BDUSS: JhNXVoQmhPYTVENEdIUnQ5S05xcHZMMVY5QzFRNVh5SzZoV0xMVDR6RzV-bEJZSVFBQUFBJCQAAAAAAAAAAAEAAACteXsbYnRfY2hpbGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALlxKVi5cSlYZj
    BD_HOME: 1
    H_PS_PSSID: 1423_21080_17001_21454_21408_21530_21377_21525_21193_21340
    BD_UPN: 123253
    sug: 3
    sugstore: 0
    ORIGIN: 0
    bdime: 0

    可以看见是key, value的形式,也就是我们说的对应着的名字,值。过期时间是可以设置的,如果不设置,则浏览器关掉就消失了,是存储在内存当中的,否则就是按照我们设置的时间来存储在硬盘上的,当过期后自动清除,比方说我们开机关机关闭再打开浏览器后他都会还存在,前者称之为Session cookie 又叫 transient cookie,后者称之为Persistent cookie 又叫 permenent cookie。路径和域就是对应的域名,a网站的cookie自然不能给b用。

    Session

    Session是存在服务器的一种用来存放用户数据的类HashTable结构。

      (什么是hashTable,另一篇文章:--https://www.cnblogs.com/goddog1024/p/11174417.html

    当浏览器 第一次发送请求时,服务器自动生成了一个HashTable和一个Session ID用来唯一标识这个HashTable,并将其通过响应发送到浏览器。当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的HashTable。

    摘自http://caibaojian.com/477.html

    一般这个值会有一个时间限制,超时后毁掉这个值,默认是20分钟。

    Session的实现方式和Cookie有一定关系。试想一下,建立一个连接就生成一个session id,那么打开几个页面就好几个了,这显然不是我们想要的,那么该怎么区分呢?这里就用到了Cookie,我们可以把session id存在Cookie中,然后每次访问的时候将Session id带过去就可以识别了,是不是很方便~

    区别

    通过上面的简单叙述,很容易看出来最明显的不同是一个在客户端一个在服务端。因为Cookie存在客户端所以用户可以看见,所以也可以编辑伪造,不是十分安全。

    Session过多的时候会消耗服务器资源,所以大型网站会有专门的Session服务器,而Cookie存在客户端所以没什么问题。

    域的支持范围不一样,比方说a.com的Cookie在a.com下都能用,而www.a.com的Session在api.a.com下都不能用,解决这个问题的办法是JSONP或者跨域资源共享

    参考

    1. cookie和session的区别
    2. cnblogs-cookie与session区别
    3. 知乎-session、cookie区别
    4. cnblogs-session与cookie区别
    5. 百度百科-cookie
    6. 维基百科-session

    PS

    参考链接可能写的更详细,建议都看看,可能会了解的更全面。

  • 相关阅读:
    UDP:用户数据报协议(User Datagram Protocol)
    线程池的使用
    SQL Server表和模式空间使用情况http://www.51myit.com/thread2466911.html
    bytetobmp and bmptobyte(Image)
    c# TCP例子转载
    POJ 4047Garden
    NYOJ 102 次方求模
    Sum
    POJ 1094 Sorting It All Out(经典拓扑,唯一排序)
    POJ 2387 Til the Cows Come Home(Dijkstra)
  • 原文地址:https://www.cnblogs.com/goddog1024/p/11174400.html
Copyright © 2011-2022 走看看