https://www.cnblogs.com/shiyangxt/articles/1305506.htmlcookie和session
Cookie是由服务器生成,保存在客户端本地的一个文件,通过response响应头的set-Cookie字段进行设置,下面是一个示例:
Cookie包含什么信息?
它可以记录你的用户ID、密码、浏览过的网页、停留的时间等信息。当你再次来到该网站时,网站通过读取Cookies,得知你的相关信息,就可以做出相应的动作,如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等等。一个网站只能读取它自己放置的信息,不能读取其他网站的Cookie文件。因此,Cookie文件还保存了host属性,即网站的域名或ip。
这些属性以名值对的方式进行保存,为了安全,它的内容大多进行了加密处理。Cookie文件的命名格式是:用户名@网站地址[数字].txt
name字段为一个cookie的名称。
value字段为一个cookie的值。
domain字段为可以访问此cookie的域名。
path字段为可以访问此cookie的页面路径。 比如domain是abc.com,path是/test,那么只有/test路径下的页面可以读取此cookie。
expires/Max-Age 字段为此cookie超时时间。若设置其值为一个时间,那么当到达此时间后,此cookie失效。不设置的话默认值是Session,意思是cookie会和session一起失效。当浏览器关闭(不是浏览器标签页,而是整个浏览器) 后,此cookie失效。
Size字段 此cookie大小。
http字段 cookie的httponly属性。若此属性为true,则只有在http请求头中会带有此cookie的信息,而不能通过document.cookie来访问此cookie。
secure 字段 设置是否只能通过https来传递此条cookie
将重要的cookie标记为http only, 这样的话当浏览器向Web服务器发起请求的时就会带上cookie字段,但是在脚本中却不能访问这个cookie,这样就避免了XSS攻击利用JavaScript的document.cookie获取cookie。
设置cookie
每个cookie都是一个名/值对,可以把下面这样一个字符串赋值给document.cookie(多个cookie之间用半角的’; ‘分隔)
document.cookie="age=28;userName=hulk";
注意:cookie 的名或值中不能使用分号(;)、逗号(,)、等号(=)、空格,以及中文(会出现错误或乱码问题)。
如果必须使用上述的特殊字符,则需要用escape()函数进行编码(以16进制数的形式转码)存储:
document.cookie="userName="+escape("珊珊"); //cookie的存储形式为"userName=%u73CA%u73CA"
读取cookie
var cookies = doucment.cookie; alert(cookies); //"age=28;userName=%u73CA%u73CA"
如果想读取指定的cookie值,只能自己解析获得到的包含所有cookie的字符串。
例如,要获取age的值,可以这样实现:
var age = document.cookie.split("age=")[1].split(";")[0]; //28
如果想要读取含特殊字符如中文的cookie值,
取出值以后需要使用unescape()进行解码才能得到原来的cookie值
例如,要获取userName的值,可以这样实现:
var name= unescape(document.cookie.split("userName=")[1].split(";")[0]); //珊珊
给cookie设置终止日期
现在的cookie都是单会话cookie,即浏览器关闭后这些cookie将会丢失,事实上这些cookie仅仅是存储在内存中,而没有建立相应的硬盘文件。
如果需要长期保存cookie(例如保存用户登录的状态就需要长期保存),如10天。可以用下面的方式来实现:
<script> var date = new Date(); //获取当前时间 date.setTime(date.getTime()+10*24*3600*1000); //获取10天后的时间戳 //将age和userName两个cookie设置为10天后过期 document.cookie="age=28;userName=aaa;expires="+date.toGMTString(); </script>
删除cookie
如果要删除一个cookie,可以将其过期时间设定为一个过去的时间。
例如删除age这个cookie:
var date = new Date(); date.setTime(date.getTime()-10000); document.cookie="age=28;expires="+date.toGMTString();
指定可访问cookie的路径
默认情况下,创建的cookie只可以由它所在目录的 同级目录 或同级目录的 子集目录 访问。
可以使用path参数设置可访问cookie的目录:
document.cookie="age=28; path=/shop"; //表示当前cookie仅能在shop目录下使用。 document.cookie="userId=320; path=/"; //表示当前cookie可在整站使用。 document.cookie="name=value;domain=.baidu.com"; //这样,所有baidu.com下的主机都可以访问该cookie
编码:
乱码的原因要么编码不支持,要么就是存储端解码和接收端编码使用的编码集不一样.
第一步:先解决cookie存入时不支持中文的乱码报错问题
cookie(String name,URLEncode("String value","UTF-8"));存储前先使用UTF-8解码
第二步解决接收端的乱码问题:保证存储和接收编码集一致
URLDecoder.decode(cookies[i].getValue(), "UTF-8"),接收的数据用UTF-8编码
Cookie存取中文的时候可能会出现乱码问题,这是因为cookie文件是以ASCII编码格式来存放的,占2个字节,而Unicode中的字符占用4个字节。所以,要在cookies中保存中文的话,必须进行相应的编码后才能正确的存取,读取时还要解码。
实例:
1 cookie存取: 2 存: Cookie cookie = new Cookie("title",URLEncoder.encode("标题","utf-8")) 3 cookie.setMaxAge(365 * 24 * 60 * 60); 4 response.addCookie(cookie); 5 取: Cookie[] cookies = request.getCookies(); 6 Cookie sCookie = null; 7 String cookievalue=""; 8 for(int i = 0; i < cookies.length; i++){ 9 sCookie = cookies[i]; 10 if(sCookie.getName()!=null&&sCookie.getName().equals("title")) 11 cookievalues=URLDecoder.decode(sCookie.getValue(),"utf-8"); 12 }