前端扫雷之cookie和session

不废话了,直接来吧。

无状态的协议

在学习cookie和session时总会碰到这么一句话:“http协议是一种无状态协议…”,然后再扯到cookie,那究竟无状态协议是什么呢?
无状态协议是指协议对于事务处理没有记忆能力。比如说你这次成功登录了某个网站,过一会再登录这个网站,服务器并不知道你之前登录过,会当做一个全新的请求来响应,让你输入用户名和密码。即每一次请求都是独立的。

如何进行状态保持

看一个经典的现实生活例子

让我们用几个例子来描述一下cookie和session机制之间的区别与联系。笔者曾经常去的一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠,然而一次性消费5杯咖啡的机会微乎其微,这时就需要某种方式来纪录某位顾客的消费数量。想象一下其实也无外乎下面的几种方案:

1、该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。 

2、发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。 

3、发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。 

由于HTTP协议是无状态的,而出于种种考虑也不希望使之成为有状态的,因此,后面两种方案就成为现实的选择。具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择。 

简单的说,只要让服务器知道这次请求是由谁发起的就行了。可以通过客户端携带的cookie来判断也可以通过sessionIdD查找session来判断。

cookie是客户端本地保持状态的方案。在第一访问服务器时,服务器的http响应头中会包含一个Set-Cookie 字段,客户端根据Set-Cookie在本地生成一个cookie,下次向服务器发起请求时就会携带上这个cookie。服务器在收到请求后根据cookie来进行相应操作。比如说如果cookie里面存的是用户名和密码(一般不会这样),服务器直接和数据库比照是否正确就行了,免去了用户每次登陆输入名字和密码的麻烦。

总之cookie就是客户端存于本地的一撮数据(4K),每次请求都会携带上并且服务器和客户端都可以对其进行修改。具体的你是要用来保存用户信息还是传递相关消息就看个人的使用了。

session

session是服务器端的状态保持方案。在第一访问服务器时,服务器端会生成一个session,并返回给客户端一个sessionID,下次向服务器发起请求时只需要携带上这个sessionID,服务器根据sessionID去查找相应的session,根据结果进行相应操作。

sessionID一般使用cookie来传递,服务器将sessionID写入cookie返回给客户端,以后每次客户端访问时都会携带上cookie,服务器通过cookie中sessionID的值来判别会话。

当cookie被禁用时,可以通过url重写的方式来传递sessionID,即在每次请求服务器时都在url后加上sessionID。

几个其他的问题

跨域:cookie不可跨域名,隐私安全机制能够禁止网站非法获取其他网站的Cookie。
访问和修改:服务器和客户端都可以修改cookie,只有服务能修改访问session,客户端拿到的只是sessionID。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值