【转】理解Cookie和Session的区别和使用

前言

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

应用场景

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

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

1.Cooke

  • 通俗讲,是访问某些网站后在本地存储的一些网站相关信息,下次访问时减少一些步骤。更准确的说法是:Cookie 是服务器在本地机器上存储的小段文本并随每一个请求发送至同一服务器,是在客户端保持状态的方案。
  • 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用。

2.Session

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

  • 浏览器第一次发送请求时,服务器自动生成了一 HashTable 和一 Session ID 来唯一标识这个 HashTable,并将其通过响应发送到浏览器。浏览器第二次发送请求会将前一次服务器响应中的Session ID 放在请求中一并发送到服务器上,服务器从请求中提取Session ID,并和保存的所有Session ID 进行对比,找到这个用户对应的HashTable。
    一般这个值会有时间限制,超时后毁掉这个值,默认30分钟。

  • 当用户在应用程序的Web 页间跳转时,存储在 Session 对象中的变量不会丢失而是在整个用户会话中一直存下去。

  • Session的实现方式和CooKie有一定关系。建立一个连接就生成一个session ID,打开几个页面就好几个了,这里就用到了Cookie,把session id存在Cookie中,每次访问的时候将 session id带过去就可以识别了。

区别

  • 存储数据量方面:session 能够存储任意的java对象,cookie只能存储 String 类型的对象。
  • 一个在客户端一个在服务端。因Cookie在客户端所以可以编辑伪造,不是十分安全。
  • Session 过多时会消耗服务器资源,大型网站会有专门 Session 服务器,Cookie存在客户端没问题。
  • 域的支持范围不一样,比方是 a.com 的 Cookie 在 a.com下都能用,而 www.a.com的Session 在 api.a.com下都不能用,解决这个问题的办法是 JSONP或者跨域资源共享。

Session 多服务器间共享

  1. 服务器实现的 session 复制或 session 共享,如 webSphere 或 JBOSS在搭建集群时配置实现 session复制或session共享,致命缺点:不好扩展和移植。
  2. 利用成熟技术做session复制,如12306使用的gemfire,如常见内存数据库Redis或 memcached ,虽然较普适但依赖第三方。
  3. 将session维护在客户端,利用 cookie ,但客户端存在 风险数据不安全,且可以存放的数据量较小,所以将 session 维护在客户端还要对 session 中的信息加密。
  4. 第二种方案和第三种方案的合体,可用 gemfire实现 session 复制共享,还可将 session 维护在 Redis中实现 session 共享,同时可将 session 维护在客户端的cookie中,但前提是数据要加密。

这三种方式可迅速切换,而不影响应用正常执行。在实践中,首选 gemfire 或者 redis 作为 session 共享的载体,一旦 session 不稳定出现问题的时候,可以紧急切换 cookie 维护 session 作为备用,不影响应用提供服务。

单点登录中,cookie被禁用了怎么办?(一点登陆,子网站其他系统不用再登陆)

  • 单点登录的原理是后端生成了一个 session ID ,设置到 cookie,后面所有请求浏览器都会带上 cookie,然后服务端从cookie 获取 session id,查询到用户信息。
  • 所以,保持登录的关键不是 cookie,而是通过 cookie保存和传输的 session id,本质是能获取用户信息的数据。
  • 除了cookie,还常用 HTTP 请求头来传输。但这个请求头浏览器不会像 cookie一样自动携带,需要手工处理。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值