cookie简介
Cookie是存储在客户机的文本文件,它们保存了大量轨迹信息。servlet,JSP能够提供对HTTP cookie的支持。
识别返回用户包括三个步骤:
- 服务器脚本向浏览器发送一组cookie。例如:姓名,年龄和id号码等。
- 浏览器将这些信息存储在本地计算机上,以备将来使用。
- 当下一次浏览器向 Web 服务器发送任何请求时,浏览器会把这些 Cookie 信息发送到服务器,服务器将使用这些信息来识别用户。
Cookie通常设置在HTTP头信息中,设置cookie的servlet会发送比如下面的头信息:
HTTP/1.1 200 OK
Date: Fri, 04 Feb 2015 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name=ck; expires=Friday, 04-Feb-07 22:03:38 GMT;
path=/; domain=ck.com
Connection: close
Content-Type: text/html
可以看到,Set-Cookie信息头包含一个键值对,一个GMT时间,一个路径,一个域名。键值对会被编码为url。时间是告诉浏览器什么时候清除cookie。
如果用户访问匹配了cookie中的路径的域名的任何页面,浏览器会重新将这个cookie发回给web服务器。浏览器端的信息头长的就像下面这样:
GET / HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)
Host: zink.demon.co.uk:1126
Accept: image/gif, */*
Accept-Encoding: gzip
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8
Cookie: name=abc
servlet通过 request.getCookies() 访问 Cookie,该方法将返回一个 Cookie 对象的数组。
Servlet的Cookie的API
方法 | 描述 |
---|---|
public void setDomain(String pattern) | 设置cookie的域名,比如 baidu.com |
public String getDomain() | 获取cookie的域名,比如 baidu.com |
public void setMaxAge(int expiry) | 设置cookie有效期,以秒为单位,默认有效期为当前session的存活时间 |
public int getMaxAge() | 获取cookie有效期,以秒为单位,默认为-1 ,表明cookie会活到浏览器关闭为止 |
public String getName() | 返回 cookie的名称,名称创建后将不能被修改 |
public void setValue(String newValue) | 设置 cookie的值 |
public String getValue() | 获取cookie的值 |
public void setPath(String uri) | 设置cookie 的路径,默认为当前页面目录下的所有URL,还有此目录下的所有子目录 |
public String getPath() | 获取cookie 的路径 |
public void setSecure(boolean flag) | 指明cookie是否要加密传输 |
public void setComment(String purpose) | 设置注释描述 cookie的目的。当浏览器将cookie展现给用户时,注释将会变得非常有用 |
public String getComment() | 返回描述cookie目的的注释,若没有则返回null |
如何设置cookie
javaweb中设置cookie有三个步骤:
- 创建一个cookie对象
Cookie cookie = new Cookie("key","value");
注意,键值对中不能包括空格或者如下的字符:
[ ] ( ) = , " / ? @ : ;
- 设置cookie期限
setMaxAge()方法用来设置cookie有效期,例如:设置一小时
cookie.setMaxAge(60*60);
- 将cookie发送到HTTP响应头中
response.addCookie()方法用来将cookie添加到HTTP响应头中。
response.addCookie(cookie);
代码示例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.net.*" %>
<%
String str = URLEncoder.encode(request.getParameter("name"),"utf-8");
// 设置 name 和 url cookie
Cookie name = new Cookie("name",
str);
Cookie url = new Cookie("url",
request.getParameter("url"));
// 设置cookie过期时间为24小时。
name.setMaxAge(60*60*24);
url.setMaxAge(60*60*24);
// 在响应头部添加cookie
response.addCookie( name );
response.addCookie( url );
%>
<html>
<head>
<title>设置 Cookie</title>
</head>
<body>
<h1>设置 Cookie</h1>
<ul>
<li><p><b>网站名:</b>
<%= request.getParameter("name")%>
</p></li>
<li><p><b>网址:</b>
<%= request.getParameter("url")%>
</p></li>
</ul>
</body>
</html>
表单页面:
提交到CookieTest类
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<h1>登录</h1>
<form action="${pageContext.request.contextPath}/cookieTest" method="post">
<p>
用户名:<input type="text" name="username">
</p>
<p>
密码:<input type="text" name="password">
</p>
<p>爱好:
<input type="checkbox" name="hobby" value="sing">唱
<input type="checkbox" name="hobby" value="dance">跳
<input type="checkbox" name="hobby" value="rap">rap
<input type="checkbox" name="hobby" value="basketball">篮球
</p>
<p>
<input type="submit">
<input type="reset">
</p>
</form>
</body>
</html>
CookieTest类处理表单提交的数据,设置cookie
package com.ck;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "CookieTest")
public class CookieTest extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
Cookie username = request.getParameter("username");
Cookie password = request.getParameter("password");
username.setMaxAge(60*60*24);
password.setMaxAge(60*60*24);
//转发:服务器将这个请求转到另一个servlet去处理,地址栏不会变
request.getRequestDispatcher("/success.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
CookieTest处理完返回success.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注册成功</title>
</head>
<body>
<h1>注册成功!!</h1>
</body>
</html>
读取Cookie
要读取cookie,需要调用request.getCookies()方法来获取cookie对象的数组,然后遍历数组,使用getName()方法和getValue()方法来获取每一个cookie的键值。
关键代码:
Cookie cookie = null;
Cookie[] cookies = null;
// 获取cookies的数据,是一个数组
cookies = request.getCookies();
if( cookies != null ){
for (int i = 0; i < cookies.length; i++){
cookie = cookies[i];
cookie.getName();
cookie.getValue();
}
}else{
System.out.println("没有发现 Cookie");
}
删除Cookie
删除cookie只需要获取存在的cookie然后存在Cookie对象中,将有效期设为0,然后将这个cookie添加到响应头中。
关键代码:
Cookie cookie = null;
Cookie[] cookies = null;
// 获取当前域名下的cookies,是一个数组
cookies = request.getCookies();
if( cookies != null ){
for (int i = 0; i < cookies.length; i++){
cookie = cookies[i];
if((cookie.getName( )).compareTo("name") == 0 ){
cookie.setMaxAge(0);
response.addCookie(cookie);
}
}
}else{
System.out.println("没有发现");
}