cookies是一种WEB服务器通过浏览器在访问者的硬盘上存储信息的手段。IE浏览器把Cookie信息保存在类似于C://windows//cookies的目录下。Cookie是保存在客户端的多组记录,在客户端以文件的形式存在。在与服务通信时,Cookie中通常会被要求保存会话的Session ID等信息,以用于识别客户端。服务器通过response
响应头的set-Cookie
字段来让客户端在本地Cookie中记录信息,下面是一个示例:
[HTTP/1.1 200 OK]
Server:[bfe/1.0.8.18]
Etag:["58860415-98b"]
Cache-Control:[private, no-cache, no-store, proxy-revalidate, no-transform]
Connection:[Keep-Alive]
Set-Cookie:[BDORZ=27315; max-age=86400; domain=.baidu.com; path=/]
Pragma:[no-cache]
Last-Modified:[Mon, 23 Jan 2017 13:24:37 GMT]
Content-Length:[2443]
Date:[Mon, 09 Apr 2018 09:59:06 GMT]
Content-Type:[text/html]
Cookie包含什么信息?
它可以记录你的用户ID、密码、浏览过的网页、停留的时间等信息。当你再次来到该网站时,网站通过读取Cookies,得知你的相关信息,就可以做出相应的动作,如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等等。**一个网站只能读取它自己放置的信息,不能读取其他网站的Cookie文件。**因此,Cookie文件还保存了host属性,即网站的域名或ip。
这些属性以名值对的方式进行保存,为了安全,它的内容大多进行了加密处理。Cookie文件的命名格式是:用户名@网站地址[数字].txt
Cookie的优点:
- 给用户更人性化的使用体验,如记住“密码功能”、老用户登录欢迎语
- 弥补了HTTP无连接特性
- 站点统计访问人数的一个依据
- Cookie能使站点跟踪特定访问者的访问次数、最后访问时间和访问者进入站点的路径
- Cookie能告诉在线广告商广告被点击的次数,从而可以更精确的投放广告
Cookie的缺点:
- 它无法解决多人共用一台电脑的问题,带来了不安全因素
- Cookie文件容易被误删除
- Cookies欺骗。修改host文件,可以非法访问目标站点的Cookie
怎样指定当前cookie不能通过js脚本获取
所谓" 不能通过js脚本获取 " 主要指的是: 使用document.cookie / XMLHttpRequest对象 / Request API 等无法获取到当前cookie. 设置方法为: HttpOnly. 没错, 这是一个没有值的属性, 只要在 Set-Cookie里面附带了这个属性, 那么这个cookie就不能被js脚本所获取.
利用HttpResponse的addHeader方法,设置Set-Cookie的值
cookie字符串的格式:
key=value; Expires=date; Path=path; Domain=domain; Secure; HttpOnly
//设置cookie
response.addHeader("Set-Cookie", "uid=112; Path=/; HttpOnly");
//设置多个cookie
response.addHeader("Set-Cookie", "uid=112; Path=/; HttpOnly");
response.addHeader("Set-Cookie", "timeout=30; Path=/test; HttpOnly");
//设置https的cookie
response.addHeader("Set-Cookie", "uid=112; Path=/; Secure; HttpOnly");
cookie过期时间设置方式:
cookie.setMaxAge(0);//不记录cookie
cookie.setMaxAge(-1);//会话级cookie,关闭浏览器失效
cookie.setMaxAge(60*60);//过期时间为1小时
js设置cookie过期时间
var name = 'one_name';
var value = '123';
var exp = new Date();
exp.setTime(exp.getTime() + 60 * 2000);//过期时间 2分钟
document.cookie = name + "=" + escape(value) + ";expires=" + exp.toGMTString();
console.log(name + "=" + escape(value) + ";expires=" + exp.toGMTString());