Cookie

  • Cookie详解
  • 什么是Cookie?
  • Cookie的工作机制是怎样的?
  • Cookie的组成
  • Cookie的使用
  • Cookie的局限


Cookie详解

什么是Cookie?

cookie 的作用就是用于解决如何记录客户端的用户信息

HTTP协议本身是无状态的 。无状态即为服务器无法判断用户身份,cookie 的作用就是用于解决如何记录客户端的用户信息。Cookie是存储在客户端简单文本文件(key-value格式)。客户端向服务端发起请求,服务端会为每个访问的客户端产生一个唯一的ID,然后以Cookie文本文件形式保存在客户端。当浏览器再次请求网站时 ,客户端携带Cookie交给服务器,服务器检查Cookie 用来辨认用户状态。

Cookie的工作机制是怎样的?

当用户第一次访问并登陆一个网站的时候,cookie的设置以及发送会经历以下4个步骤:
客户端发送一个请求到服务器 --> 服务器发送一个HttpResponse响应到客户端,其中包含Set-Cookie的头部 --> 客户端保存Cookie之后向服务器发送请求时,HttpRequest请求中会包含一个Cookie的头部 --> 服务器返回响应数据

Java 把请求头重的Cookie 置为空 请求头中的cookie作用_Web

我在doGet方法中,new了一个Cookie对象并将其加入到了HttpResponse对象中。

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        Cookie cookie = new Cookie("mcrwayfun",System.currentTimeMillis()+"");
        // 设置生命周期为MAX_VALUE
        cookie.setMaxAge(Integer.MAX_VALUE);
        resp.addCookie(cookie);
    }

浏览器输入地址进行访问,结果如图所示:

Java 把请求头重的Cookie 置为空 请求头中的cookie作用_客户端_02

可见Response Headers中包含Set-Cookie头部,而Request Headers中包含了Cookie头部。name和value正是上述设置的。

Cookie的组成

Cookie是一段不超过4KB的小型文本数据,由一个Name 一个值 和其他几个用于控制Cookie有效期 安全性,使用范围的可选属性组成。

属性

介绍

Name= Value

键值对,可以设置要保存的 Key/Value,注意这里的 NAME 不能和其他属性项的名字一样。对于认证Cookie,Value值包括Web服务器所提供的访问令牌

Expires

设置Cookie的生存期 。有两种存储类型的Cookie:会话性与持久性。Expires属性缺省时,为会话性Cookie,仅保存在客户端内存中,并在用户关闭浏览器时失效;持久性Cookie会保存在用户的硬盘中,直至生存期到或用户直接在网页中单击“注销”等按钮结束会话时才会失效

Domain

生成该 Cookie 的域名,如 domain=“www.baidu.com” 。Cookie 机制并未遵循严格的同源策略,允许一个子域可以设置或获取其父域的 Cookie。当需要实现单点登录方案时,Cookie 的上述特性非常有用,然而也增加了 Cookie受攻击的危险,比如攻击者可以借此发动会话定置攻击。因而,浏览器禁止在 Domain 属性中设置.org、.com 等通用顶级域名、以及在国家及地区顶级域下注册的二级域名,以减小攻击发生的范围

Path

定义了Web站点上可以访问该Cookie的目录

Secure

指定是否使用HTTPS安全协议发送Cookie 。使用HTTPS安全协议,可以保护Cookie在浏览器和Web服务器间的传输过程中不被窃取和篡改。该方法也可用于Web站点的身份鉴别,即在HTTPS的连接建立阶段,浏览器会检查Web网站的SSL证书的有效性。但是基于兼容性的原因(比如有些网站使用自签署的证书)在检测到SSL证书无效时,浏览器并不会立即终止用户的连接请求,而是显示安全风险信息,用户仍可以选择继续访问该站点。由于许多用户缺乏安全意识,因而仍可能连接到Pharming攻击所伪造的网站

HTTPOnly

用于防止客户端脚本通过document.cookie属性访问Cookie,有助于保护Cookie不被跨站脚本攻击窃取或篡改。但是,HTTPOnly的应用仍存在局限性,一些浏览器可以阻止客户端脚本对Cookie的读操作,但允许写操作;此外大多数浏览器仍允许通过XMLHTTP对象读取HTTP响应中的Set-Cookie头

Cookie的使用

  • 获取Cokie
    方法一:RegExp和match方法
function getCookie(name){
	var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");
	if(arr=document.cookie.match(reg))
	return unescape(arr[2]);
	else
	return null;
}

方法二:遍历

function getCookie2(name){
    var strcookie = document.cookie;//获取cookie字符串
    var arrcookie = strcookie.split("; ");//分割
    //遍历匹配
    for ( var i = 0; i < arrcookie.length; i++) {
        var arr = arrcookie[i].split("=");
        if (arr[0] == name){
            return arr[1];
        }
    }
    return "";
}

方法三:

//存在问题:如果cookie中存在 aaaname=aa;name=bb 获取name的值就会出现错误
function getCookie(name){
    if (document.cookie.length>0){//判断cookie是否存在
      //获取cookie名称加=的索引值
      var isHasName = document.cookie.indexOf(name + "=");
      if (isHasName !=-1){ //说明这个cookie存在
        //获取cookie名称对应值的开始索引值
        isHasName =isHasName + name.length+1
        //从isHasName 位置开始找第一个分号的索引值,也就是cookie名称对应值的结束索引值
       var value=document.cookie.indexOf(";",isHasName )  
        //如果找不到,说明是cookie名称对应值的结束索引值就是cookie的长度
        if (value ==-1) c_end=document.cookie.length
        //unescape() 函数可对通过 escape() 编码的字符串进行解码
        //获取cookie名称对应的值,并返回
        return unescape(document.cookie.substring(isHasName ,value))
      }
    }
    return "" //不存在返回空字符串
}

设置Cookie

//JS操作cookies方法!
//写cookies
function setCookie(name,value)
{
	var Days = 30;
	var exp = new Date();
	exp.setTime(exp.getTime() + Days*24*60*60*1000);
	document.cookie = name + "="+ escape (value) + ";expires=" +exp.toGMTString();
}

删除Cookie

function delCookie(name)
{
	var exp = new Date();
	exp.setTime(exp.getTime() - 1);
	var cval=getCookie(name);
	if(cval!=null)
	document.cookie= name +"="+cval+";expires="+exp.toGMTString();
}

清空Cookie

var cookies = document.cookie.split(";");
	var domain = '.'+location.host;
	console.log(cookies);
    for (var i = 0; i < cookies.length; i++) {
    var cookie = cookies[i];
    var eqPos = cookie.indexOf("=");
    var name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie;
    document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT; Domain="+domain+"; path=/";
    }
	if(cookies.length > 0){
    	for (var i = 0; i < cookies.length; i++) {
    	var cookie = cookies[i];
    	var eqPos = cookie.indexOf("=");
    	var name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie;
    	document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT; Domain="+domain+"; path=/";
    }

Cookie的局限

  • cookie的存储空间 : 浏览器对于能保存的cookie数量有所限制,通常是几百个或多一点。一般情况下,每个域名20个cookies是允许的,而每个域最多能保存4KB的cookie。
  • Cookie消失的情况:除了大小限制可能导致的问题,有很多原因都可能导致硬盘上的cookie消失,比如到达有效期了,或是用户清理cookie信息了,或是换用其他浏览器了。因此,永远都不应该使用cookie保存重要数据,而且在编写代码时一定要考虑到不能获取到所期望cookie时的情况。