Cookie
Cookie的作用
Cookie的英文原意是“点心”,它是用户访问Web服务器时,服务器在用户硬盘上存放的信息,好像是服务器送给客户的“点心”。
服务器可以根据Cookie来跟踪用户,这对于需要区别用户的场合(如电子商务)特别有用。
通常访问论坛时,如果勾选“保存用户名和密码”,服务器就会在你的硬盘上存放一个Cookie;再次访问时,服务器就会利用这个Cookie中存的上次访问的用户名和密码,实现自动登录。
浏览器为了安全考虑,只允许服务器访问自己存放的Cookie,即A服务器存的Cookie,B服务器是访问不到的,禁止跨域访问。
并且Cookie存放时都是加密的,不是直接存明文的。
Cookie的具体形式
一个Cookie包含一对Key/Value,下面的代码生成一个Cookie并将它写到用户的硬盘上:
Cookie theCookie = new Cookie("cookieName", "cookieValue"); response.addCookie(theCookie);
Cookie类
Cookie的类定义可以查看Java EE的javax.servlet.http.Cookie类文档:
一个cookie是一个量很小的信息,是servlet发送给浏览器的,浏览器会存储在客户端,之后用到的时候会返回给服务器。
因为cookie的值可以唯一地确定(或者说认证)一个客户端,所以cookie通常是用来进行session管理的。
Cookie有一个name,一个value,还有一些其他的附加属性,比如comment,path,domain qualifiers,最大年龄(max age),版本号等。
但是注意有的浏览器在处理Cookie的附加属性的时候可能会有bug,所以为了兼容性着想,要保守地使用附加属性。
Cookie的发送和返回
servlet向浏览器发送cookies是通过:HttpServletResponse#addCookie方法,它是将字段加在HTTP response的headers里面来发送cookies的,这个方法每次只能加一条cookie,可以多次调用,增加多个不同的cookie对象。
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返回cookies,是通过将字段加在HTTP request的headers里面。使用HttpServletRequest#getCookies方法可以获取请求中的Cookies。
一些Cookies可能有相同的名字但是不同的path属性。
Cookie的Max Age
查看Cookie类的setMaxAge(int expiry)方法说明:
这个类用于给Cookie设置最大的年龄,以秒为单位。
expiry - an integer specifying the maximum age of the cookie in seconds; if negative, means the cookie is not stored; if zero, deletes the cookie.
如果这个方法的参数给的是正值,表明cookie在超过指定的年龄时间后会消亡。
负值意味着cookie不是永久性存储的,在浏览器关闭的时候将会被删除。
这个方法的参数如果是零值将会导致cookie被删除。
测试程序Servlet
package com.mengdd.servlet;import java.io.IOException;import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CookieServlet extends HttpServlet { private int counter1; private int counter2; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie cookie = new Cookie("cookieName" + counter1++, "cookieValue" + counter2++); cookie.setMaxAge(10);// 设置Cookie的最大存活时间为10秒钟 resp.addCookie(cookie);// 将cookie增加在响应对象上 // 从请求中获取客户端的Cookie Cookie[] cookies = req.getCookies(); if (null == cookies) { // 如果没有cookie,返回的是null,而不是空数组 return; } for (Cookie c : cookies) { System.out.println("Cookie name: " + c.getName() + ", Cookie value: " + c.getValue()); } } }
启动Tomcat测试,可以看到旧的Cookie会随着时间的流逝而消失(根据编号判断)。
测试程序JSP
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %>My JSP 'jspCookie.jsp' starting page <%!int count1 = 0; int count2 = 0;%> <% Cookie cookie = new Cookie("cookieName" + count1++, "cookieValue" + count2++); cookie.setMaxAge(10); response.addCookie(cookie); %> <% Cookie[] cookies = request.getCookies(); if (null == cookies) { return; } for (Cookie c : cookies) { %>cookie name: <%=c.getName()%>
cookie value: <%=c.getValue()%> <% } %>
参考资料
圣思园张龙老师Java Web教学视频33-34集。