1. 什么是Cookie:
Cookie,它指的是在客户端访问Web服务器的某个应用时,应用内的某个或某些组件会创建一部分数据(即Cookie),将其放置于响应的头部中(以Set-Cookie响应头的形式)发送给客户端浏览器,浏览器会根据服务器端的编程情况的不同,或将这个Cookie保存在浏览器的内存里(浏览器也是一个程序,运行时操作系统会为它维护一块内存),或将这个Cookie保存在客户端的硬盘上。当客户端再次访问服务器时,会将这部分数据(Cookie)一齐发送给服务器,服务器就可以根据这个Cookie来跟踪客户状态。通过这种方式,服务器就可以维护用户的状态。
Web服务器为了支持Cookie,需要具备以下功能:
1. 在HTTP响应结果中添加Cookie数据 2. 解析HTTP请求中的Cookie数据浏览器为了支持Cookie,需要具备以下功能:
1. 解析HTTP响应结果中的Cookie数据 2. 把Cookie数据保存到本地硬盘 3. 读取本地硬盘上的Cookie数据,将其添加到HTTP请求中
2. Cookie的使用:
(1)Cookie如何创建,如何添加到响应中:
Tomcat作为Web服务器,对Cookie提供了良好的支持。那么运行在Tomcat中的Servlet该如何访问Cookie呢?幸运的是,Servlet无须直接和HTTP请求或响应中的原始Cookie数据打交道,这项工作由Servlet容器来完成。Cookie用javax.servlet.http.Cookie类来表示。其构造器为:
Cookie(String name, String value)所以Cookie的创建和添加是极为简单的:
Cookie cookie=new Cookie("username","Tom"); response.addCookie(cookie);
(2)Cookie的查询:
Cookie[ ] cookies=request.getCookies(); for(Cookie cookie:cookies){ out.println("cookie name:"+cookie.getName()); out.println("cookie value:"+cookiegetValue()); }(3)Cookie的生存时间:
在默认情况下,Cookie会保存在浏览器的内存里,所以当浏览器关闭时,Cookie会丢失。当Servlet向客户端写Cookie时,可以通过Cookie类的setMaxAge(int expiry)方法来设置Cookie的生存期或者说有效时间。参数expiry以秒为单位,它具有以下含义:
expiry>0: 指示浏览器在客户端硬盘上保存Cookie的时间为expiry秒 expiry=0: 指示浏览器删除当前Cookie expiry<0: 指示浏览器不要把Cookie保存到客户端硬盘,Cookie仅仅存在于当前浏览器的内存里,当浏览器关闭,Cookie即消失。Cookie默认的有效期为-1,即属于此种情况。对于来自客户端的Cookie,Servlet可以通过Cookie类的getMaxAge()方法来读取Cookie的有效期。
(4)Cookie的编码问题:
Cookie的值只能为ascii字符,所以对于中文,需要进行编码。譬如:
String name=URLEncoder.encode("张三","utf-8"); Cookie cookie=new Cookie("name",name); response.addCookie(cookie);
读取Cookie时,再使用URLDecoder.decode(String s,String enc)方法:
Cookie[] cookies=request.getCookies(); for(Cookie cookie:cookies){ String name=cookie.getName(); String value=cookie.getValue(); value=URLDecoder.decode(value,"utf-8"); out.println("cookie name:"+name+",cookie value:"+value); }
(5)Cookie的路径问题:
http://ip:port/appname/jsp01/jsp01.jsp中有:Cookie c=new Cookie(" "," ");
创建一个Cookie时,这个Cookie都会有一个默认的path,其值是创建该Cookie的组件的地址。此示例中,path为/appname/jsp01。
浏览器在访问服务器的某个组件时,会比较要访问的组件的地址addr和cookie的path,只有path>=addr,浏览器才会将cookie添加到请求中携带给服务器。
可以使用Cookie.setPath(" ")来修改cookie的默认path.
Cookie.setPath("/appname");如果设置了如上path路径,则访问appname下的所有组件都会携带对应的cookie。
Cookie.setPath("/");如果设置了如上的path路径,则访问同一个服务器内部的所有应用,都会携带对应的cookie。
Cookie.setDomain(".tarena.com.cn");如果设置了如上的域名,则浏览器会先比较要访问的地址的域名是否匹配,然后再比较path。
1. Cookie只能保存字符串,并且对于中文,需要编码 2. Cookie的大小有限制(4K左右) 3. Cookie的个数有限制(浏览器能够在本地保存的Cookie的数量,大约为300) 4. Cookie不是很安全 5. Cookie可以被用户禁止4. Cookie的使用场合:
1. 记录用户的使用习惯 2. 网页换肤 3. 自动登录 4. 购物车(与Session配合使用)