Cookie是服务器发送给浏览器的体积很小的纯文本信息,用户以后访问同一个Web服务器时浏览器会把它们原样发送给服务器。cookie一般用于在线交易过程中标识用户身份、安全要求不高的场合避免用户重复输入名字和密码、门户网站的主页定制、有针对性地投放广告等等。 Servlet中可以同时创建多个cookie,但是每个站点最多只能保存20个cookie。
原理
1. 服务器脚本向浏览器发送一组 Cookies。例如:姓名、年龄或识别号码等。
2. 浏览器将这些信息存储在本地计算机上,以备将来使用。
3. 当下一次浏览器向 Web 服务器发送任何请求时,浏览器会把这些 Cookies 信息发送到服务器,服务器将使用这些信息来识别用户。
Servlet Cookie方法
序号 | 方法 & 描述 |
1 | public void setDomain(String pattern) 该方法设置 cookie 适用的域,例如 w3cschool.cc。 |
2 | public String getDomain() 该方法获取 cookie 适用的域,例如 w3cschool.cc。 |
3 | public void setMaxAge(int expiry) 该方法设置 cookie 过期的时间(以秒为单位)。如果不这样设置,cookie 只会在当前 session 会话中持续有效。 |
4 | public int getMaxAge() 该方法返回 cookie 的最大生存周期(以秒为单位),默认情况下,-1 表示 cookie 将持续下去,直到浏览器关闭。 |
5 | public String getName() 该方法返回 cookie 的名称。名称在创建后不能改变。 |
6 | public void setValue(String newValue) 该方法设置与 cookie 关联的值。 |
7 | public String getValue() 该方法获取与 cookie 关联的值。 |
8 | public void setPath(String uri) 该方法设置 cookie 适用的路径。如果您不指定路径,与当前页面相同目录下的(包括子目录下的)所有 URL 都会返回 cookie。 |
9 | public String getPath() 该方法获取 cookie 适用的路径。 |
10 | public void setSecure(boolean flag) 该方法设置布尔值,表示 cookie 是否应该只在加密的(即 SSL)连接上发送。 |
11 | public void setComment(String purpose) 该方法规定了描述 cookie 目的的注释。该注释在浏览器向用户呈现 cookie 时非常有用。 |
12 | public String getComment() 该方法返回了描述 cookie 目的的注释,如果 cookie 没有注释则返回 null。 |
Servlet设置Cookie
1. 创建一个 Cookie 对象
Cookie cookie = new Cookie("key","value");
无论是名字还是值,都不应该包含空格或以下任何字符:[ ] ( ) = , " / ? @ : ;
2. 设置最大生存周期
cookie.setMaxAge(60*60*24); //设置一个最长有效期为 24 小时的 cookie。
3. 保存Cookie
response.addCookie(cookie);
使用response.addCookie来添加HTTP响应头中的Cookies,保存到客户端。
读取删除Cookie
1. 通过Servlet读取Cookies
要读取 Cookies,您需要通过调用 HttpServletRequest 的 getCookies( ) 方法创建一个 javax.servlet.http.Cookie 对象的数组。然后循环遍历数组,并使用 getName() 和 getValue() 方法来访问每个 cookie 和关联的值。
2. 通过Servlet删除Cookies
a. 读取一个现有的 cookie,并把它存储在 Cookie 对象中。
b. 使用 setMaxAge() 方法设置 cookie 的年龄为零,来删除现有的 cookie。
c. 把这个 cookie 添加到响应头。
例子
//创建cookie
public void doGet(HttpServletRequest req, HttpServletResponse res) {
try {
res.setContentType("text/html;charset=gbk");
PrintWriter pw = res.getWriter();
//当用户访问该servlet时, 就将信息创建到该用户的cookie中
//1. 现在服务器端创建一个cookie
Cookie myCookie = new Cookie("color1", "red");
//2. 该cookie存在的时间 以秒为单位
myCookie.setMaxAge(30000);
//如果你不设置存在时间,那么该cookie将不会保存
//3. 将该cookie写回到客户端
res.addCookie(myCookie);
pw.println("已经创建了cookie");
} catch(Exception ex) {
ex.printStackTrace();
}
}
//读取cookie
public void doGet(HttpServletRequest req, HttpServletResponse res) {
try {
res.setContentType("text/html;charset=gbk");
PrintWriter pw = res.getWriter();
//从客户端得到所有cookie信息
Cookie[] allCookies = req.getCookies();
int i = 0;
//如果allCookies不为空...
if (allCookies != null) {
//从中取出cookie
for (i = 0; i < allCookies.length; i++) {
//依次取出
Cookie temp = allCookies[i];
if (temp.getName().equals("color1")) {
//得到cookie的值
String val = temp.getValue();
pw.println("color1=" + val);
break;
}
}
if (allCookies.length == i) {
pw.println("cookie 过期");
}
} else {
pw.println("不存在color1这个cookie/或是过期了!");
}
} catch(Exception ex) {
ex.printStackTrace();
}
}
//删除cookie
public void doGet(HttpServletRequest req, HttpServletResponse res) {
try {
res.setContentType("text/html;charset=gbk");
PrintWriter pw = res.getWriter();
//从客户端得到所有cookie信息
Cookie[] allCookies = req.getCookies();
int i = 0;
//如果allCookies不为空...
if (allCookies != null) {
//从中取出cookie
for (i = 0; i < allCookies.length; i++) {
//依次取出
Cookie temp = allCookies[i];
if (temp.getName().equals("color")) {
//将该cookie删除
temp.setMaxAge(0);
pw.println("删除了color这个cookie");
break;
}
}
}
} catch(Exception ex) {
ex.printStackTrace();
}
}
总结
1. Cookie的目的就是为用户带来方便,为网站带来增值。虽然有着许多误传,事实上Cookie并不会造成严重的安全威胁。Cookie永远不会以任何方式执行,因此也不会带来病毒或攻击你的系统。另外,由于浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4 KB,因此Cookie不会塞满你的硬盘,更不会被用作“拒绝服务”攻击手段。
2. Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie)。当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了。
3. Servlet先要调用new Cookie(name,value)用合适的名字和值创建一个或多个Cookie,通过cookie.setXXX设置各种属性,通过response.addCookie(cookie)把cookie加入应答头。
4. Servlet从客户端读入Cookie,应该调用request.getCookies(),getCookies()方法返回一个Cookie对象的数组。在大多数情况下,你只需要用循环访问该数组的各个元素寻找指定名字的Cookie,然后对该Cookie调用getValue方法取得与指定名字关联的值。