cookies

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          }
原文地址:https://www.cnblogs.com/sarah-wen/p/10823598.html