• cookie浅谈


    cookie是Web服务器识别客户端的一种方法,一个服务器可能会同时与数千个不同的客户端进行对话,识别不同客户端是非常有必要的,常见的使用场合如网站去识别不同用户,给予不同反馈(如广告的相关推荐,个性化问候,信息管理等)。

    cookie大致分为两种:会话cookie和持久cookie。会话cookie生存周期是一次会话过程,当用户退出浏览器时,会话cookie就会被删除。持久cookie的生存周期取决于设置的时间,它们被存储在硬盘上,用户退出浏览器它们不会消失。

    用户首次访问Web站点时,服务器会在响应首部里加入Set-Cookie属性来标识客户端,格式如下:

    cookie名-值键值对是强制规定必须设置的,其他属性可选,中间由分号隔开。注意一个Set-Cookie字段只能设置一个cookie,设置多个 cookie,需要添加多个的Set-Cookie字段。

    客户端获取到cookie后,会将其存储在浏览器的cookie数据库中,再次访问时会在请求首部里添加Cookie字段,将保存的cookie发送给服务器端,这样服务器就能识别出客户端了。cookie的基本思想就是让浏览器积累一组服务器特有的信息,每次访问服务器时都将这些信息提供给它。cookie经常被滥用当做存储工具,由于前端也可以用js来设置cookie,一些不需要被发送到服务器端的数据也会被存储在cookie中发送过去,这无疑增大了网络开销。cookie的本质作用是让服务器识别客户端,我们经常拿cookie跟session作比较,其实Session机制本身就可以通过cookie来实现。

    Session是存放在服务器端的类似于HashTable的数据结构,用来存放用户数据,当浏览器第一次发送请求时,服务器自动生成了一个HashTable和一个Session ID用来唯一标识这个HashTable,并将其通过响应发送到浏览器。当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的HashTable。一般情况下,服务器会在一定时间内(默认20分钟)保存这个HashTable,过了时间限制,就会销毁这个HashTable。在销毁之前,程序员可以 将用户的一些数据以键值对的形式暂时存放在这个HashTable中。

    我们通常用以下两种方式来保存 Session ID:

    [1] 使用Cookie来保存,这是最常见的方法。服务器通过设置Cookie的方式将Session ID发送到浏览器。

    [2] 使用URL附加信息的方式(当cookie被禁止时可以采取这种方式)

    下面我们来分析一下保存用户登录状态的Session实现方法,用户首次访问网站时需要在登录页面进行登录,登录后跳转到网站首页,关闭浏览器后再次访问网站,不需要进行登录,可直接访问首页。首先分析一下逻辑,首次访问网站时,请求首部是没有Cookie字段的,服务器找不到Session ID,要通知浏览器跳转到登录页面,同时生成HashTable和Session ID,在响应首部里的Set-Cookie字段加入Session ID返回给客户端。用户再次访问该网站时请求首部里有了Cookie字段,包含Session ID,服务器端提取出Session ID,查找到对应的HashTable,即找到Session ID则判断为已登录状态。前面我们说到,HashTable的默认保存时间为20分钟,也就是说,过了20分钟我们就无法保存登录状态了。现在通用的解决办法是,将用户的用户名和加密之后的密码也通过Cookie的方式存放在客户端,当服务器上的Session销毁以后,使用Cookie里面存放的用户名和加密之后的密码重新执行一次登录操作,重建Session,并更新客户端上Cookie中存放的的Session ID。需要注意的是,虽然在前端也能通过cookie来判断登录状态,但任何前端的验证都是不可靠的,判断状态还是要通过后端来实现。

    参考:https://segmentfault.com/a/1190000004556040

               https://www.cnblogs.com/xlh-2014/p/8110685.html

  • 相关阅读:
    MVC 自定义异常过滤特性
    写一个左中右布局占满屏幕,其中左右两块是固定宽度200,中间自适应宽度, 要求先加载中间块,请写出结构及样式。
    请写出jQuery绑定事件的方法,不少于两种
    用js写个原生的ajax过程
    link和@import的区别
    attribute和property的区别是什么?
    请简要描述margin重复问题,及解决方式
    display:none;与visibility:hidden;的区别
    web标准以及w3c标准
    css优先级
  • 原文地址:https://www.cnblogs.com/zdd2017/p/9762665.html
Copyright © 2020-2023  润新知