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机所在的域:,B有应用appInB. 1)在appInA下面设置cookie的时候,增加cookie.setDomain(".");这样在appInB下面就可以取到cookie。 2)输入url访问appInB的时候,必须输入域名才能解析。比如说在A机器输入:http://:8080/appInB,可以获取appInB在客户端设置的cookie,而B机器访问本机的应用,输入:http://localhost:8080/appInB则不可以获得cookie。 3)设置了cookie.setDomain(".");,还可以在默认的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); |
|
来自: CevenCheng > 《JVM》