一、javax.servlet.http包API 结构图:
可见,Cookie与HttpServletResponse、HttpServletRequest类处于同一包中,后面也常用这两个类操作Cookie对象。
javax.servlet包与javax.servlet.http包的理解:前者者主要定义了一些通用的接口,用于所有网络主机的管理,如获取网络主机名、IP等,而后者注重于服务器与客户端的业务管理,且实现了前者中的一些接口。
二、cookie工作过程
API文档:
Creates a cookie, a small amount of information sent by a servlet to a Web browser, saved by the browser, and later sent back to the server. A cookie's value can uniquely identify a client, so cookies are commonly used for session management.
Cookie,一些被servlet发送给浏览器的少量信息,被浏览器保存,且以后会反发给web服务器。cookie的value能唯一标识一个客户端,因此cookies普遍应用于会话管理。
A cookie has a name, a single value, and optional attributes such as a comment, path and domainqualifiers, a maximum age, and a version number. Some Web browsers have bugs in how they handle the optional attributes, so use themsparingly(保守地,仁慈地) to improve the interoperability(互动性,协同能力) of your servlets.
一个cookie有一个name,一个唯一的value和许多可选的属性,如comment、path与domain 资格、最大失效时间、版本号。一些浏览器存在bug在操作这些可选属性时,因此保守地使用这些属性将能提高你的servlets的协同工作能力。
The servlet sends cookies to the browser by using the HttpServletResponse.addCookie(javax.servlet.http.Cookie)
method, which adds fields to HTTP response headers to send cookies to the browser, one at a time. The browser is expected to support 20 cookies for each Web server, 300 cookies total, and may limit cookie size to 4 KB each.
servlet通过使用HttpServletResponse.addCookie(javax.servlet.http.Cookie)方法发送cookie给浏览器,此方法添加域到HTTP 响应头用于发送cookie给浏览器,一次一个。浏览器对每个web服务器能支持20个cookie,总的支持300个cookie,且每个cookie大小可能被限制在4kb。
The browser returns cookies to the servlet by adding fields to HTTP request headers. Cookies can beretrieved(取回,恢复) from a request by using theHttpServletRequest.getCookies()
method. Several cookies might have the same name but different path attributes.
浏览器返回cookie给servlet将通过添加域到HTTP 请求头。cookie能从请求中取回,通过使用HttpServletRequest.getCookies()方法。一些cookie可能拥有相同的名字和不同的path属性值。
Cookies affect the caching of the Web pages that use them. HTTP 1.0 does not cache pages that use cookies created with this class. This class does not support the cache control defined with HTTP 1.1.
This class supports both the Version 0 (by Netscape) and Version 1 (by RFC 2109) cookie specifications. By default, cookies are created using Version 0 to ensure the best interoperability.
三、具体方法
1、public Cookie(String name,String value):
构造方法;
2、public Object clone():
重载了标准的java.lang.Object.clone方法,用于返回一个copy的对象。
3、public String getComment():
返回描述这个cookie目的的注释(如果存在),或返回null(没有设置comment)。
4、public String getDomain():
返回为这个cookie设置的域名;
5、public int getMaxAge():
返回该cookie的最大寿命,以毫秒计。默认为-1,表明该cookie将persist(存留)直到浏览器关闭;
6、public String getName();
7、public String getPath():
返回浏览器返回该cookie到服务器的路径。cookie对于服务器上所有的子路径都是可见的;
8、public boolean getSecure():
如果浏览器正在发送cookie仅通过安全协议,将返回true,否则如果通过任何协议,将返回false;
9、public String getValue();
10、public int getVersion():
返回该cookie编译所使用的协议。Version 1表明使用RFC 2109编译,Version 0 表明使用传统的Netscape起草的cookie规格。浏览器提供的cookie使用且标识该浏览器的cookie version。
以下为设置属性:
12、public void setComment(String purpose);
13、public void setDomain(String pattern):
确定该cookie应该存在的域,域的名字格式被RFC 2109 定义;
14、public void setMaxAge(int expiry):
expiry:n,终止,满期,届满;
15、public void setPath(String uri):
设置浏览器返回该cookie的路径;
16、public void setSecure(boolean flag):
设置是否使用安全协议传输,如HTTPS或SSL 协议。默认false。
17、public void setValue(String newValue);
18、public void setVersion(int v):
参数为0(传统Netscape cookie规范编译)或1(RFC 2109规范编译)。
理解:
更新一下对B/S系统开发的理解,无论是前端还是后端开发,我们直接编写的html、jsp或servlet等都是放在服务器端的,所以要弄清楚cookie是由谁来设置,什么时候设置的问题。
假设用JSP ,简单总结了下设置cookie的位置与真正设置时间。
第一种,在servlet中设置。因为servlet就是使用HttpServletResponse与HttpServletRequest对象,用于各页面(html或jsp)间通信的,所以可以在servlet中使用setCookie等方法设置即可。真正设置时间是在浏览器通过表单访问到该servlet时,才被设置在客户端的。
第二种,在jsp页面中设置。本质与第一种相同,因为jsp页面会被编译为servlet。与第一种有点区别的是,此时cookie是浏览器转到该页面的某个时候设置在客户端的。
第三种,在html页面中通过js设置。不用解释。
关键点:
1、cookie是在客户端访问服务器时被设置在客户端的;
2、当从一个页面跳转到该网站的另一个页面时,cookie是被自动添加到HTTP请求的请求头部分的(此外HTTP请求还包括请求行、信息体,信息体包含提交的表单信息等);
3、服务器端接受到HTTP请求时,可通过getHeaders、getCookies等方法获取cookie,从而识别客户端的身份(具体查看另一篇转载的日志:HTTP 请求行、请求头、信息体)。