(一直都有听说Cookie,但是本渣渣只是个刚入门的小水货,最近正好有j2ee的课 ,就好好看看Cookie 顺便做个笔记.(师从姜国海,哈哈哈)
1.Cookie创建
Cookie(String name, String value)乍一看,cookie挺像map集合的 ,一样都是名值对。
Cookie c = new Cookie("user","psw");
注意的是:cookie一旦被创建,cookie的名字就不能改变。
Cookies[]cs=request.getCookies();
response.addCookie(c);
2.基本函数
clone()
public java.lang.Object clone() 返回一个cookie副本。
注意的是,copy返回的是object ,要强制转换哦!
Cookie a =(Cookie) c.clone();
setVersion(int v) 和 getVersion()
public void setVersion(int v)
设置cookie 协议的版本 ,v的取值是0和1,
public int getVersion()
获cookie的版本号。Version 0 是 original Netscape cookie specification. Version 1是RFC 2109.
API中说 RFC 2109有点新 ,试用的样子,所以做产品项目时候还是别用啦~
Cookie c =new Cookie("name ","ss");int i =c.getVersion();
setSecure(boolean flag)和getSecure()
public void setSecure(boolean flag)
public boolean getSecure()
设置cookie是否只是在安全协议下才会被发送(如https和ssl),默认值是false,也就是在任何协议下都可以发送cookie。
Cookie c =new Cookie("a","a");
c.setSecure(true);
setHttpOnly(boolean isHttpOnly)和isHttpOnly()
public void setHttpOnly(boolean isHttpOnly)
public boolean isHttpOnly()
如果在Cookie中设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息,这样能有效的防止XSS攻击。
setComment(String purpose)和 getComment()
public void setComment(java.lang.String purpose)
public java.lang.String getComment()
是对Cookie设置Comment,传入的String就是对Cookie作用的描述,这样就可以知道相应的cookie是干什么用的啦,如果没有进行setcomment,则getComment()返回null;
getName()
public java.lang.String getName()
获取cookie的名字,cookie的名字一旦创建就不能更改。
setValue(String newValue)和getValue()
public void setValue(java.lang.String newValue)
public java.lang.String getValue()
cookie的value是可以更改,每次setValue(String v)就是重新设置value的值,
需要注意的是,如果我们想要存二进制的值,需要用base64编码进行转换。
setMaxAge(int expiry) 和 getMaxAge()
public void setMaxAge(int expiry)见文知义 int 参数 expiry 表示的就是cookie 最大有效期时长(单位秒),
expiry 是正数,表示设置cookie最大的有效时长,
expiry 是0,表示删除cookie,
expiry 是负数,表示不会一直存着cookie,当浏览器关闭的时候,就会删除掉cookie。
public int getMaxAge() 则对应着返回cookie的有效时长,要注意的是,如果返回的是负数,那么表示的是cookie会一直存在直到关闭浏览器。
- // 设置Cookie立即失效
- cookie.setMaxAge(0);
- /**
- * 删除Cookie时,只设置maxAge=0将不能够从浏览器中删除cookie,
- * 因为一个Cookie应当属于一个path与domain,所以删除时,Cookie的这两个属性也必须设置。
- *
- * 误区:刚开始时,我没有发现客户端发送到服务器端的cookie的path与domain值为空这个问题。
- * 因为在登陆系统时,我设置了Cookie的path与domain属性的值,就误认为每次客户端请求时,都会把Cookie的
- * 这两个属性也提交到服务器端,但系统并没有把path与domain提交到服务器端(提交过来的只有Cookie的key,value值)。
- */
- // 重点是这里1,必须设置domain属性的值
- cookie.setDomain(domain);
- // 重点是这里2,必须设置path属性的值
- cookie.setPath(path);
- response.addCookie(cookie);
setPath(String uri)和getPath()
public void setPath(java.lang.String uri)
public java.lang.String getPath()
假如说我们有多个webapp,分别是webapp_a和webapp_b。正常情况下的cookie,只能在一个webapp中共享。也就是说,哪个webapp创建了这个cookie,哪个webapp才能获得并使用这个cookie。
setPath(String uri):设置了能够获取此cookie的应用的路径,这样一来,这个cookie就可以在一个服务器下的多个webapp间共享了。
要点说明:
1.原本,在webapp_a下面new的cookie,在webapp_b下面是获取不到,因为cookie的Path默认值是产生cookie的应用的路径,也就是"/webapp_a/"。
2.若,在webapp_a下面new一个cookie的时候,增加一条cookie.setPath("/");或者cookie.setPath("/webapp_b/");
这样就可以在webapp_b下面获取到webapp_a中设置的cookie了。
3. 此处的参数uri,是相对于应用服务器存放应用的文件夹的根目录而言的(比如tomcat下面的webapp),因此 cookie.setPath("/");之后,webapp文件夹下的所有应用都可以共享cookie,而cookie.setPath(" /webapp_b/");
是指这个cookie只能在webapp_b应用下的获得,即便产生这个cookie是webapp_a,webapp_a也无法获得。
4. 同上,设置cookie.setPath("/webapp_b/jsp")或者cookie.setPath("/webapp_b/jsp/")的时 候,只有在webapp_b/jsp下面可以获得cookie,在webapp_b下面但是在jsp文件夹外的都不能获得cookie。
5.有多条cookie.setPath("XXX")语句的时候,以最后一条为准。
public String getPath()则是返回cookie应用的path。
setDomain(String domain)和 getDomain()
//这部分写的不好,抄网上的,自己也没怎么实践,先大概看看,之后再实践实践,写出自己的
可以看看这个 http://blog.csdn.net/ghsau/article/details/20395681
cookie是与域名绑定的,比如说A站点的cookie,B站点是不能访问的,这是浏览器的同源策略限定,主要是出于安全考虑。但是,如果A站点在设置cookie时,设置了domain参数,那么这个cookie可以在domain指定的域名或子域名的站点使用。setDomain就是设置cookie能够跨域共享。
A机所在的域:home.langchao.com,A机中有应用webapp_a
B机所在的域:jszx.com,B机中有应用webapp_b
这个参数必须以“.”开始。
1)在webapp_a下面设置cookie的时候,增加cookie.setDomain(".jszx.com");,这样在webapp_b下就可以取到这个cookie。 输 入url访问webapp_b的时候,必须输入域名才能解析。比如说在A机器输入:http://lc-bsp.jszx.com:8080 /webapp_b,可以获取刚才在webapp_a客户端中设置的cookie,而B机器访问本机的应用,输入:http: //localhost:8080/webapp_b则不可以获得cookie。
2)A机设置了cookie.setDomain(".jszx.com");,还可以在默认的home.langchao.com下面共享
关于cookie小问题 http://www.educity.cn/wenda/100626.html