Cookie中的信息是以键值对存在的,Cookie文件是以ASCII编码存储的,所以如果想存储中文信息,需额外进行编码后再存储到Cookie中,读取时再解码。
Cookie从服务器传送到客户端时通过在响应头信息中使用:
Java代码
代码如下 | 复制代码 |
Set-Cookie: NAME=VALUE; expires=DATE; path=PATH; domain=DOMAIN_NAME; secure NAME=VALUE |
是Cookie信息中最关键的属性,name为Cookie的名字,value为对应的值。必需的。
expires
Cookie有效期。格式为:Wdy, DD-Mon-YYYY HH:MM:SS GMT。当超过这个时间,此cookie将失效。可选属性,如果未指定过期时间,则在当前会话结束后失效。
path
cookie在当前域名的哪个路径下可见。如果设置为"/",则在当前域名下的所有路径均可见;如果设置为"/news",则只能在"http://XXX.com/news"下可见。如果为未设置,则在哪个页面产生就只能在该页面访问。
domain=DOMAIN_NAME
可以访问该Cookie的域名地址。google.com的cookie只属于google.com,不能被baidu.com操作。当将域名设置为".google.com",最前面的一个点,表示,google.com下的所有二级域名都和一级域名共享Cookie。否则,code.google.com域名无法使用google.com下的Cookie,只能使用code.google.com下的Cookie。
secure
指定当前cookie是否使用安全协议发送cookie(SSL,HTTPS等)。
上面是在响应头信息的设置,如果客户端需要提交Cookie到服务器,则格式为:
Cookie: NAME1=OPAQUE_STRING1; NAME2=OPAQUE_STRING2 …
以Cookie打头,每个键值对之间分号相隔。
关于Cookie的更多信息,请访问NetScape Cookie规范。(目前多数浏览器都已支持,其他Cookie规范(比如w3c的)不是所有浏览器都支持,所以NetScapeCookie较常见。)
Java中的Cookie
在java中,把Cookie封装在了javax.servlet.http.Cookie类中。我们所操作的每一个cookie都是该类的对象。
要增加一个cookie时,先声明一个Cookie对象,就是javax.servlet.http.Cookie类对象,在声明构造同时可以带两个参数(Cookie名,Cookie值),比如:
代码如下 | 复制代码 |
Cookie cookie = new Cookie("name","the8m"); |
声明了一个Cookie对象,Cookie名为name,值为the8m。接着,我们需要将这个Cookie添加到响应response中,发送给客户端。
response.addCookie(cookie);
这样一个简单的Cookie就存储到客户端了。
读取Cookie
当通过response.addCookie(Cookie cookie)给客户端添加了一个Cookie后,我们可以使用request.getCookie()获取一个Cookie对象数组,因为有可能一个页面存储了多个Cookie。
下面是示例:
Java代码
代码如下 | 复制代码 |
<% if(request.getCookies()!=null) { for(Cookie coo : request.getCookies()) { String name = coo.getName() String value = coo.getValue() out.println(name+"-- "+value); } } %> |
我们还可以使用EL表达式中的内置隐藏对象cookie读取,比使用request对象获取方便很多。
Java代码
代码如下 | 复制代码 |
${cookie}<!-- 显示所有Cookie对象 --> ${cookie.age.name }<!-- 显示Cookie名为age的name --> ${cookie.age.value }<!-- 显示Cookie名为age的值 --> |
Cookie名与Cookie值
名称必须遵守 RFC 2109。这意味着它只能包含 ASCII 字母数字字符,不能包含逗号、分号或空格,也不能以 $ 字符开头。cookie 的名称在创建之后不得更改。
值不能包含空格,方括号,圆括号,等号,逗号,双引号,斜杠,问号,@,冒号,分号。如果值为二进制数据,需要使用BASE64编码,比如图片。
Cookie与中文
Cookie文件是以ASCII编码格式存储的,占2个字节,而中文则属于Unicode中的(Unicode包含世界上所有语言的符号,当然包括咱的汉字了)字符,占4个字符。
所以,如果想在Cookie中保存中文的话,必需得进行相应的编码后才能正确存储,读取时再解码。
一般使用java.net.URLEncoder.encode(String s,String enc)进行编码,会得到application/x-www-form-urlencoded MIME字符串。
使用java.net.URLDecoder.decode(String s,String enc)进行解码。
两个方法中的第二参数,一般默认为UTF-8即可。
Java代码
代码如下 | 复制代码 |
<%@ page language="java" contentType="text/html; charset=UTF-8" %> <jsp:directive.page import="java.net.*"/> <% Cookie cookie = new Cookie( URLEncoder.encode("姓名","UTF-8"), URLEncoder.encode("李佳龙","UTF-8") ); response.addCookie(cookie); %> <html> <title>Cookie-中文</title> <body> <% if(request.getCookies()!=null) { for(Cookie coo : request.getCookies()) { String name =URLDecoder.decode(coo.getName(),"UTF-8"); String value = URLDecoder.decode(coo.getValue(),"UTF-8"); out.println(name+"-- "+value); } } %> </body> </html> |
application/x-www-form-urlencoded类似于我们在浏览器地址栏中经常看到的那些带有百分号的符号,比如。使用谷歌浏览器搜索"姓名",最后生成的URL为: