Javaweb学习总结(五)

来源:互联网 发布:辽宁省软件行业协会 编辑:程序博客网 时间:2024/05/16 16:58

cookie

一、cookie概述

每个客户访问服务器都会产生一个会话对象,当在一个服务器上有多个会话时,服务器端就可以通过cookie区分不同会话对象对应的ID,cookie 就是用来记录服务器与客户端的交互信息。

cookie是servlet发送到web 浏览器的少量信息,这些信息不是特别大,一般默认为4K,这些信息由浏览器保存,然后发送回服务器。

一个cookie拥有一个名称、一个值和一个可选属性,它最核心的就是一个键值对,其他的可选属性包括注释、路径、域限定符、最大生存时间和版本号等。

Servlet 通过使用 HttpServletResponse 的 addCookie(cookie) 方法将cookie发送到浏览器,该方法将字段添加到HTTP响应头发送到浏览器。浏览器通过向HTTP请求头添加字段将 cookie 返回给 Servlet 。可使用 HttpServletResponse  的 getCookies() 方法从请求中获取 cookie 。

不同的服务器网站的不同 cookie 通过名称和路径来区分。如我们在访问百度和谷歌时,会生成不同的 cookie,这时主要是通过域限定符来区分的。


二、cookie的常用方法

1、向客户程序发送cookie

1.1、 创建cookie对象

Cookie c = new Cookie(“userId”,”landril”);

1.2、 设置最大时效,默认该cookie是存储在浏览器的内在中,用户关闭浏览器则被删除,下面的方法是将cookie存储在硬盘上。

c.setMaxAge(60*60*24);//一天,如果设置为0则是删除该cookie

1.3、 将cookie放入到HTTP响应报头,可以使用HttpServletResponse的addCookie方法,此方法不修改之前指定的Set-Cookie报头,而是创建新的报头。

response.addCookie(c);

注意:设置cookie的步骤为创建cookie对象,设置最大时效,将cookie放入响应报头,即发送到客户程序,记住一定要将cookie发送到客户程序

2、从客户端读取cookie

2.1、 调用HttpServletRequest的getCookies得到一个Cookie对象的数组

2.2、 对数组进行循环,调用cookie的getName方法,获取具体的cookie的值

Cookie[] cookies = request.getCookies();

if(cookies != null){

for(int i=0;i<cookies.length;i++){

       Cookie c = cookies[i];

       if(“userId”.equals(c.getName())){

       System.out.println(c.getValue());

}

}

}

3、cookie的常用方法

3.1、 setComment()/getComment():指定或查找与该cookie相关的注释

3.2、 setDomain()/getDomain():设置或读取该cookie适用的域

3.3、 setMaxAge()/getMaxAge():操作cookie保留的时间,多长时间后过期

3.4、 getName():读取cookie的名称

3.5、 setPath()/getPath():设置或取得cookie适用的路径

cookie.setPath(“/”);指定服务器的所有页面都应该收到该cookie

3.6、 setSource()/getSource():指定cookie是否只能通过加密连接(SSL)

默认false,表示cookie适用所有连接

3.7、 setValue()/getValue():指定或获取cookie的值

4、cookie的生命

Cookie不只是有namevalueCookie还是“生命”。所谓生命就是Cookie在客户端的有效时间,可以通过setMaxAge(int)来设置Cookie的有效时间。

 cookie.setMaxAge(-1)cookiemaxAge属性的默认值就是-1,表示只在浏览器内存中存活。一旦关闭浏览器窗口,那么cookie就会消失。

 cookie.setMaxAge(60*60):表示cookie对象可存活1小时。当生命大于0时,浏览器会把Cookie保存到硬盘上,就算关闭浏览器,就算重启客户端电脑,cookie也会存活1小时;

 cookie.setMaxAge(0)cookie生命等于0是一个特殊的值,它表示cookie被作废!也就是说,如果原来浏览器已经保存了这个Cookie,那么可以通过CookiesetMaxAge(0)来删除这个Cookie。无论是在浏览器内存中,还是在客户端硬盘上都会删除这个Cookie。 


三、cookie与session

不要混淆 session 和 session 实现。本来 session 是一个抽象概念,开发者为了实现中断和继续等操作,将 user agent 和 server 之间一对一的交互,抽象为“会话”,进而衍生出“会话状态”,也就是 session 的概念。

而 cookie 是一个实际存在的东西,http 协议中定义在 响应头中的字段。所以可以将cookie认为是 session 的一种后端无状态实现。


而我们今天常说的 “session”,是为了绕开 cookie 的各种限制,如信息容量过小、每个服务器上的cookie个数有限等,借助 cookie 本身和后端存储实现的,一种更高级的会话状态实现。

所以 cookie 和 session,可以认为是同一层次的概念,也可以认为是不同层次的概念。

具体到实现,session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比

如在 url 中传递 session_id)