`
rentianchou
  • 浏览: 68507 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多
Cookie知识整理
Cookie整理

最近在项目中需要用到Cookie来实现从一个域名到另外一个域名的免登。于是需要了解整理一下Cookie的相关知识。
由于HTTP协议是无状态的协议(虽然Socket连接是有状态的,但每次用HTTP协议进行数据传输后就关闭的Socket连接,因此,HTTP协议并不会保存上一次的状态),因此,如果要保存某些HTTP请求过程中所产生的数据,就必须要有一种类似全局变量的机制保证数据在不同的HTTP请求之间共享,所以要用到Cookie来标识用户状态。

一,设置Cookie
Cookies分为[内存Cookie](临时Cookie,在浏览器关闭的时候消失),和[硬盘Cookie](写到客户端的硬盘中)。
每个Cookie有一个超时时间,内存Cookie只写到客户端的内存中,其超时时间为任何负数。如下可以定义一个内存Cookie:
Cookie cookie = new Cookie("key","value");
cookie.setMaxAge(-1); 
response.addCookie(cookie);
对于硬盘Cookie,可以对其进行超时时间的设置,以秒为单位,如下定义一个硬盘Cookie:
Cookie cookie = new Cookie("key","value");
cookie.setMaxAge(3600); //在此定义了Cookie的有效时间为一个小时。 
response.addCookie(cookie);

永久Cookie在任意新开启的IE窗口都可以生成Cookie。而临时Cookie由于只保存在当前IE窗口,因此,在新开启的IE窗口,是不能生成Cookie字段的,也就是说,新窗口和旧窗口是不能共享临时Cookie的。使用重定向机制弹出的新窗口也无法和旧窗口共享临时Cookie。但在同一个窗口可以。如在一个IE窗口输入http://localhost:8080/test/first.jsp,向内存写入一个临时Cookie后,在同一个IE窗口输入http://localhost:8080/test/second.jsp,浏览器在向服务端发送HTTP请求时,自动将当前浏览器的临时Cookie(也就是first.jsp所创建的Cookie)和永久Cookie作为HTTP请求头的Cookie字段值发送给服务端。但是如果新启一个IE窗口,由于新IE窗口没有这个临时Cookie,因此,second.jsp只发送了保存在硬盘上的永久Cookie。

设置Cookie的时候还有其他参数可以设置
●path,设置哪些目录下的应用可以访问改Cookie。如下设置:
Cookie cookie = new Cookie("key","value");
cookie.setPath("/test/test2"); //在此定义了/test/test下的应用可以访问该Cookie。
response.addCookie(cookie);
path的默认值是"./"为当前路径。
●Domain,设置Cookie生成的域。如下:
Cookie cookie = new Cookie("key","value");
cookie.setDomain(".channel.alisoft.com"); //在此定义了Cookie生成在哪个域下面
response.addCookie(cookie);
这个参数必须以"."开始。

下面说下怎么通过setDomain的方法实现Cookie的跨域访问:
A机所在的域:home.aaa.com,A有应用appInA。
B机所在的域:bbb.com,B有应用appInB.
1)在appInA下面设置cookie的时候,增加cookie.setDomain(".bbb.com");这样在appInB下面就可以取到cookie。
2)输入url访问appInB的时候,必须输入域名才能解析。比如说在A机器输入:http://bbb.com:8080/appInB,可以获取appInB在客户端设置的cookie,而B机器访问本机的应用,输入:http://localhost:8080/appInB则不可以获得cookie。
3)设置了cookie.setDomain(".bbb.com");,还可以在默认的home.aaa.com下面共享。
4)问题:怎么设置多个域?在多个域下共享。网上找了很久都没有找到真正能用的方法,估计要用其他技术实现了。

二,读取Cookie
读取Cookie可以按照下面的语句进行:
Cookie[] cookies = request.getCookies();
然后用for语句查找你想要的Cookie。
该方法可以读取当前路径以及"直接父路径"的所有Cookie对象,如果没有任何Cookie的话,则返回null

三,删除Cookie
Cookie cookie = new Cookie("key", null);
cookie.setMaxAge(0);
设置为0为立即删除该Cookie
cookie.setPath("/test/test2");
删除指定路径上的Cookie,不设置该路径,默认为删除当前路径Cookie
response.addCookie(cookie);
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics