Cookie用法大全

cookie简介javascript

1. 定义
cookie是由服务器发送给客户端(浏览器)的小量信息。java

2. 做用
cookie是键值对形式存储的少许信息,那它有什么做用呢?web

咱们知道,平时上网时都是使用无状态的HTTP协议传输出数据,这意味着客户端与服务端在数据传送完成后就会中断链接。这时咱们就须要一个一直保持会话链接的机制。在session出现前,cookie就彻底充当了这种角色。也就是,cookie的小量信息能帮助咱们跟踪会话。通常该信息记录用户身份。数据库

固然cookie也常记录跟踪购物车的商品信息(如数量)、记录用户访问次数等。跨域

3. 原理
客户端请求服务器时,若是服务器须要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。而客户端浏览器会把Cookie保存起来。当浏览器再请求服务器时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器经过检查该Cookie来获取用户状态。数组

4.添加cookie示例
获取客户端的Cookie时,只能获取name与value属性,其它属性都不会被提交。浏览器

Cookie c = new Cookie("username","peter");// 新建一个Cookie对象
c.setMaxAge(24*60*60);                    // 设置过时时间1天,以秒为单位
response.addCookie(c);                    // 保存cookie到客户端

5.删除cookie示例
删除某个Cookie时,只须要新建一个只有maxAge和value不同的同名Cookie,而后添加到response中覆盖原来的Cookie安全

Cookie cookie = new Cookie("username","peter");// 新建Cookie
cookie.setMaxAge(0);                           // 设置生命周期为0,表示将要删除
response.addCookie(cookie);                    // 执行添加后就从response里删除了

6.修改cookie示例服务器

修改某个Cookie时,只须要新建一个只有value属性不同的同名Cookie,而后添加到response中覆盖原来的Cookiecookie

Cookie cookie = new Cookie("username","joker");// 新建Cookie
cookie.setMaxAge(24*60*60);                    // 设置生命周期
response.addCookie(cookie);                    // 执行添加后就从response里覆盖修改了

注意:修改、删除Cookie时,新建的Cookie除value、maxAge以外的全部属性,例如name、path、domain等,都要与原Cookie彻底同样。不然,浏览器将视为两个不一样的Cookie而不会覆盖以前的Cookie,从而致使修改、删除失败。

Cookie类的各方法详解

Cookie类在javax.servlet.http.Cookie包中
这里写图片描述

对应的getter方法我就不讲了。
若是cookie值为Unicode字符,须要为字符编码。若是cookie值为二进制数据,则须要使用BASE64编码

cookie的setPath()和setDomain()方法
默认状况下cookie只能在一个应用中共享,即一个cookie只能由建立它的应用得到。

设置同一服务器内的cookie使用范围用setPath
c.setPath(“/”),使同一服务器内全部应用均可访问到该Cookie:

Cookie c = new Cookie("name","peter");
c.setMaxAge(24*60*60);  
c.setPath("/");//同一服务器内全部应用均可访问到该Cookie
response.addCookie(c); //保存cookie到客户端

1.若是同一服务器内有两个应用agx1.0和agx2.0
当咱们在agx1.0里有c.setPath(“/agx2.0/”);时,该cookie就只能在agx2.0下面能获取到,就连建立该cookie的agx1.0也获取不到。

2.若是在agx1.0里有c.setPath(“/agx2.0/abc/”);时,则只能在agx2.0/abc下面才能得到该cookie,即便在agx2.0下面也不能获取到。

cookie的跨域
1.正常状况下Cookie不可跨域名,如域名www.google.com颁发的Cookie不会被提交到域名www.baidu.com去。这是由Cookie的隐私安全机制决定的。即便在同一个一级域名下的两个二级域名如www.agx.com和images.agx.com也不能交互使用Cookie,由于两者的域名并不严格相同。若是想全部agx.com名下的二级域名均可以使用该Cookie,则须要设置Cookie的domain参数为”.agx.com”,例如:

Cookie cookie = new Cookie("name","peter"); // 新建Cookie
cookie.setDomain(".agx.com");               // 设置域名
cookie.setPath("/");                        // 设置路径
cookie.setMaxAge(Integer.MAX_VALUE);        // 设置有效期为永久
response.addCookie(cookie);                 // 输出到客户端

读者能够修改本机C:\WINDOWS\system32\drivers\etc下的hosts文件来配置多个临时域名,而后使用setCookie.jsp程序来设置跨域名Cookie验证domain属性。
注意:domain参数必须以点(“.”)开始。另外,name相同但domain不一样的两个Cookie是两个不一样的Cookie。若是想要两个域名彻底不一样的网站共有Cookie,能够生成两个name相同的Cookie,domain属性分别为两个域名。

2.若A服务器的域名为:adv.audiogroup.com,有应用名为:agx1.0; B服务器的域名为:agx.com,有应用名为:agx2.0。
在A服务器的agx1.0应用下设置cookie以下:

Cookie cookie = new Cookie("name","peter"); // 新建Cookie
cookie.setDomain(".agx.com");               // 设置域名
cookie.setPath("/");                        // 设置路径
cookie.setMaxAge(Integer.MAX_VALUE);        // 设置有效期为永久
response.addCookie(cookie);                 // 输出到客户端

这时,在B服务器下的agx2.0应用和agx1.0里都能取到上面的Cookie。
注:输入URL访问agx2.0时,必须输入域名才能获取其它服务器共享给它的cookie,如:
输入http://images.agx.com:8080/agx2.0,能够获取agx1.0在客户端设置的cookie
输入:http://localhost:8080/agx2.0则不能够得到cookie。

setPath()与setDomain()的区别?
setDomain()主要用来肯定两个不一样名称但后缀相同的网站地址是否能使用同一个Cookie。
例: www.agx.com和 bbs.agx.com只要有cookie.setDomain(“.zjut.edu.cn”);就都能使用该cookie

setPath()主要用来肯定地址里什么后缀下可以使用这个Cookie

归结起来就是:setDomain决定容许访问Cookie的域名,而setPath决定容许访问Cookie的路径(ContextPath)

获取用户请求里的cookie

Cookie[] cookie = request.getCookies();//获取的是请求里的全部cookie组成的数组
for(int i=0;i<cookie.length;i++){
    if("name".equals(cookie[i].getName())){
        System.out.println(cookie[i].getValue());//获得peter
        break;
    }
}

解决cookie里中文乱码问题
Cookie中要保存中文只能编码。通常使用UTF-8编码便可。不推荐使用GBK等中文编码,由于浏览器不必定支持,并且JavaScript也不支持GBK编码。

Cookie不只可使用ASCII字符与Unicode字符,还可使用二进制数据。例如在Cookie中使用数字证书,提供安全度。使用二进制数据时也须要进行编码(如用BASE64编码保存二进制图片)。因为浏览器每次请求都会带着Cookie,所以Cookie内容不宜过多,因此通常不会在Cookie中存储二进制的内容

JS操做Cookie
Cookie是保存在客户端的,因此浏览器可使用脚本(JS)等操做Cookie。

<script language=javascript> //添加cookie function setCookie(name,value,time){ var date= new Date(); date.setDate(date.getDate()+time); document.cookie = name+"="+value+";expires="+date; } //得到cookie function getCookie(name){ var arr = document.cookie.split(";"); for(var i=0; i<arr.length; i++){ var arr2 = arr[i].split("="); if(arr2[0] == name){ return arr2[1]; } } return null; } //删除cookie function removeCookie(name){ setCookie(name,"",0) } </script>

W3C标准的浏览器会阻止JavaScript读写任何不属于本身网站的Cookie。即A网站的JavaScript代码里获取不到B网站的Cookie。

使用cookie记住密码
方案1:
直接把用户名与密码都保持到Cookie中,下次访问时检查Cookie中的用户名与密码,与数据库比较。这是一种比较危险的选择,通常不把密码等重要信息保存到Cookie中。
方案2:
把密码加密后保存到Cookie中,下次访问时解密并与数据库比较。这种方案略微安全一些。若是不但愿保存密码,还能够把登陆的时间戳保存到Cookie与数据库中,到时只验证用户名与登陆时间戳就能够了。
方案3:
实现方式是把帐号按照必定的规则(密钥)加密后,连同帐号一块保存到Cookie中。下次访问时只须要判断帐号的加密规则是否相同便可。
加 密:

String userName = request.getParameter("userName");//获取用户名
Md5Hash psw = new Md5Hash(userName, "peter.com", 2);//以peter.com为密钥加密

//将用户名添加进cookie并发送给客户端
Cookie userCookie = new Cookie("userName",userName);
userCookie.setMaxAge(7*24*60*60);
response.addCookie(userCookie);

//将密钥生成的密文加进cookie并发送给客户端
Cookie c = new Cookie("key",psw.toString());
c.setMaxAge(7*24*60*60);
response.addCookie(c);

解密:

String usreName = null;
String key = null;
Cookie[] cookie = request.getCookies();
if(cookie !=null){              
    for(Cookie c:cookie){  // 遍历Cookie
       if("userName".equals(c.getName()) 
           userName = c.getValue();      
       if("key".equals(c.getName()) 
           key= cookie.getValue();       
    }
}
if(userName != null && key != null){   
    String secrect = new Md5Hash(userName, "peter.com", 2);
    if(key.equals(secrect )){//加密规则正确,说明已经登陆
        //...
        //....省略后续处理
    }
}

由上面可知,若是将密码加密后存进cookie后,当咱们下次访问登陆页时,密码框里的密码将不是用户真正的密码。