当前位置:编程学习 > JSP >>

jsp中cookie 读写操作详解介绍

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为:

 

补充:Jsp教程,Java基础 
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,