u 常用的API
创建Cookie对象
Cookie(String name, String value) ->以指定数据创建Cookie对象
设置Cookie对象
void setMaxAge(int expiry) ->设置Cookie的最大有效时间
void setPath(String uri) ->设置Cookie的有效路径
void setDomain(String pattern) ->设置Cookie的有效域
发送Cookie对象
void addCookie(Cookie cookie) ->发送Cookie对象
获取Cookie对象
Cookie[] getCookies() ->获取用户请求中的Cookie数组
获取Cookie中携带信息
int getMaxAge() ->获取Cookie的最大有效时间
String getName() ->获取Cookie的名字
String getValue() ->获取Cookie存储的值
String getDomain() ->获取Cookie的有效域
String getPath() ->获取Cookie的有效路径
读和写多个Cookie
如果给客户端输出多个Cookie对象,那么服务器会创建多个
Set-Cookie: name=jack; Expires=Wed, 16-Jan-2013 07:02:01 GMT
Set-Cookie: password=root; Expires=Wed, 16-Jan-2013 07:02:01 GMT头字段进行Cookie的发送。
多个Cookie在浏览器缓存中以一个文件的形式进行存储。
浏览器使用一个Cookie: name=jack; password=root带多个Cookie数据。
Cookie有效路径
以上的代码在第一次写回Cookie后,如果后面继续请求该网站的其他资源,那么还会继续携带Cookie对象直到Cookie过期。但是如果访问不同网站那么不带该Cookie。
cookie2.setPath("/day08/read");
Set-Cookie: password=root; Expires=Wed, 16-Jan-2013 07:25:06 GMT; Path=/day08/read
存储的时候由于两个Cookie的有效路径不同,因此存储在不同的Cookie文件中。
但是指定有效路径的Cookie文件中多了有效路径的值。
password
root
localhost/day08/read
但是如果现在需要在不同的网站中传递Cookie对象,那么如何指定有效路径。
cookie2.setPath("/"); à 指定Cookie的有效路径是tomcat的webapps目录
Cookie的跨域
假定A服务器上发布一个网站叫CMS系统,域名www.sina.com.cn
在CMS系统中可以直接编写一个写Cookie的Servlet。但是要设置该Cookie的有效域。
cookie.setDomain(“.163.com”);
假定B服务器上发布一个网站叫IT系统,域名www.163.com
编写一个获取Cookie数据的Servlet进行Cookie的数据读取。
总结:
- 可以实现自动登录。用户名和密码默认是明码的。开发者需要自定义加密。Md5 Base64
- 购物车的商品ID信息
- 存储用户上次的登录时间
使用Cookie实现显示用户的上次访问时间
1 public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { 2 // 页面输出 3 response.setCharacterEncoding("utf-8"); 4 response.setContentType("text/html;charset=utf-8"); 5 request.setCharacterEncoding("utf-8"); 6 // 获取字符输出流对象 7 PrintWriter out = response.getWriter(); 8 // 获取Cookie数组对象 9 Cookie [] cookies = request.getCookies(); 10 // 定义一个时间的字符串变量 11 String date = null; 12 // 定义一个变量存储系统当前日期 13 Date current_date = new Date(); 14 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 15 // 判断是否是第一次登陆 16 if(cookies != null){ 17 // 直接循环 18 for(Cookie cookie : cookies){ 19 // 获取Cookie 20 if("lasttime".equals(cookie.getName())){ 21 // 获取上次访问的时间 22 date = cookie.getValue(); 23 break; 24 }else{ 25 // 获取系统时间 26 date = format.format(current_date); 27 } 28 } 29 }else{ 30 // 获取系统时间 31 date = format.format(current_date); 32 } 33 // 显示时间 34 out.println(date); 35 // 将这次访问的时间写入Cookie 36 Cookie new_cookie = new Cookie("lasttime", 37 format.format(new Date())); 38 new_cookie.setMaxAge(5*60); 39 new_cookie.setPath("/day08/showtime"); 40 // 发送 41 response.addCookie(new_cookie); 42 }
如果cookie没有调用setMaxAge方法,这个cookie没被放在文件里,而是放在客户端浏览器的内存中。
Cookie细节
- 一个Cookie只能存储一种信息。
- 一个网站可以发送多个Cookie,浏览器可以同时携带多个Cookie。
- 同一个网站最多发送20个Cookie,浏览器最多存储300个Cookie,一个Cookie最多存储数据在4K以内。
- 如果创建了Cookie对象没有指定最大有效时间那么不会存储在浏览器的缓存中。