1、cookie的读写方式
1.1 cookie 客户端读取
常规cookie读取方法
function getCookies(cookiename){
var value = document.cookie.match(new RegExp("(^| )" + cookiename + "=([^;]*)(;|$)"));
return null != value ? decodeURIComponent(value[2]) : null;
};
1.2 cookie 服务器端读取
//java
Cookie cookies = request.getCookies();
//php
$_COOKIE["cookiename"];
1.3 cookie 客户端写入
常规cookie写入方法
function setcookie(name,value,day){
var expdate=new Date();
var outms=day*24*60*60*1000;//过期时间,以天为单位‘1’表示一天
expdate.setTime(expdate.getTime()+outms);
document.cookie = name+"="+encodeURIComponent(value)+";path=/;domain="+getPath('domain').slice(1)+";expires="+expdate.toGMTString();
};
1.4 cookie服务器端写入
java代码
//java的写法
response.setHeader("SET-COOKIE", key + "="+ value + ";Path=/;domain="+ domain + ";date="+date);
//php 中的写法
setcookie(name,value,expire,path,domain,secure)
//参数 描述
//name 必需。规定 cookie 的名称。
//value 必需。规定 cookie 的值。
//expire 可选。规定 cookie 的有效期。
//path 可选。规定 cookie 的服务器路径。
//domain 可选。规定 cookie 的域名。
//secure 可选。规定是否通过安全的 HTTPS 连接来传输 cookie。
2、javascript 中的编码方式
2.1 encodeURI / decodeURI
该函数可把字符串作为 URI 进行编码
不会对下列字符编码 ASCII字母 数字 ~!@#$&*()=:/,;?+’
2.2 encodeURIComponent /decodeURIComponent
函数可把字符串作为 URI 组件进行编码。
不会对下列字符编码 ASCII字母 数字 ~!*()’
2.3 escape unescape
函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。
不会编码的字符:@*/+
2.4 三种编码方式对比结论
encodeURIComponent比encodeURI编码的范围更大。
escape 编码的字符串可以直接显示,但需要处理
如:
//a的值定义如下
var a= "%u,,%u1231sdfsdf\123sdfnsdfs!@#$%^&张三丰时代发生地方+——)(*&";
//将a编码后,b的值
var b= escape(a);
//"%25u%2C%2C%25u1231sdfsdfSsdfnsdfs%21@%23%24%25%5E%26%u5F20%u4E09%u4E30%u65F6%u4EE3%u53D1%u751F%u5730%u65B9+%u2014%u2014%uFF09%uFF08*%26"
//转换成Unicode表示法,替换后的可以直接汉字等字符,如"%u65F6"和"\u65F6"直接在控制台打印出来是不一样的
var c = b.replace(/%u/g,'\\u');
//"%25u%2C%2C%25u1231sdfsdfSsdfnsdfs%21@%23%24%25%5E%26\u5F20\u4E09\u4E30\u65F6\u4EE3\u53D1\u751F\u5730\u65B9+\u2014\u2014\uFF09\uFF08*%26"
//解码传输的都是英文常规字符,不回有其他的特殊字符
var d = unescape(c);
//"%u,,%u1231sdfsdfSsdfnsdfs!@#$%^&\u5F20\u4E09\u4E30\u65F6\u4EE3\u53D1\u751F\u5730\u65B9+\u2014\u2014\uFF09\uFF08*&"
//数据又回来了
console.log(d)
//%u,,%u1231sdfsdfSsdfnsdfs!@#$%^&张三丰时代发生地方+——)(*&
我们在cookie的操作,到底用哪个来编码比较合适呢,如果key=value 只是字符串可以用escape, 如果value里面的内容含有链接等建议使用encodeURIComponent
//escape
escape('http://www.qiku.com/zt/youth/index.html')
//结果:"http%3A//www.qiku.com/zt/youth/index.html"
//encodeURIComponent
encodeURIComponent('http://www.qiku.com/zt/youth/index.html')
//结果:"http%3A%2F%2Fwww.qiku.com%2Fzt%2Fyouth%2Findex.html"
3、前端cookie操作集成
集成cookie的读取,cookie的写入,cookie的删除
var cookie=function(name, key, day, domain){
var len = arguments.length;
if(len == 1){
var value = document.cookie.match(new RegExp("(^| )" + name + "=([^;]*)(;|$)"));
//如果前后端cookie操作一直,这句话可以不加,这里是做为防止后端是escape编码,前端直接用decodeURIComponent解码报错
if(value != null && value[2]!='' && /%u[a-z0-9]{4}/g.test(value[2])) value[2] = unescape(value[2]);
return null != value ? decodeURIComponent(value[2]) : null
}
//domain操作
var mydomain =function(){
var hostname = window.location.hostname,
array = hostname.split('.'),
length = array.length;
return array[length-3]+"."+ array[length-2] + '.' +array[length-1];
}
var domain = domain || mydomain;
var day = day || 30;
if(key == '') day = 0;
var expdate = new Date();
expdate.setTime(expdate.getTime()+day*24*60*60*1000);//过期时间,以天为单位‘1’表示一天
document.cookie = name + "=" + key + ";path=/;domain=" + domain + ";expires=" + expdate.toGMTString();
}