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的头部 --> 服务器返回响应数据
我在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);
}
浏览器输入地址进行访问,结果如图所示:
可见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时的情况。