Servlet Cookie 处理
- Servlet 对 Cookie 的设置是直接在 HTTP 头信息中进行的,设置了 Cookie 的 Servlet 通常会发送类似的头信息:
HTTP/1.1 200 OK
Date: Fri, 04 Feb 2000 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name=xyz; expires=Friday, 04-Feb-07 22:03:38 GMT;
path=/; domain=w3cschool.cc
Connection: close
Content-Type: text/html
|
- Set-Cookie 头包含了一个名称值对、一个 GMT 日期、一个路径和一个域,名称和值会被 URL 编码;
- expires 字段指定了Cookie的到期时间;
- 在浏览器被设置为储存Cookie,它会保留该信息到到期时间,如果浏览器指向任何匹配该 Cookie 的路径或域(path指定),它会重新发送 Cookie 到服务器,此时浏览器发送的头信息类似如下:
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=xyz
|
- Servlet 中对于 Cookie 的添加、获取、删除主要是通过 HttpServletRequest 和 HttpServletReponse 成员方法来实现的;
- Cookie 本身的属性修改、属性获取主要通过 javax.servlet.Cookie 类来实现,主要相关的API如下:
void setDomain(String pattern)
|
设置 cookie 适用的域,例如 w3cschool.cc。
|
String getDomain()
|
获取 cookie 适用的域,例如 w3cschool.cc
|
void setMaxAge(int expiry)
|
设置 cookie 过期的时间(以秒为单位)。如果不这样设置,cookie 只会在当前 session 会话中持续有效
|
int getMaxAge()
|
回 cookie 的最大生存周期(以秒为单位),默认情况下,-1 表示 cookie 将持续下去,直到浏览器关闭。
|
String getName()
|
该方法返回 cookie 的名称。名称在创建后不能改变。
|
void setValue(String newValue)
|
设置与 cookie 关联的值。
|
String getValue()
|
获取与 cookie 关联的值。
|
void setPath(String uri)
|
该方法设置 cookie 适用的路径。如果您不指定路径,与当前页面相同目录下的(包括子目录下的)所有 URL 都会返回 cookie。
|
String getPath()
|
获取 cookie 适用的路径。
|
void setSecure(boolean flag)
|
设置布尔值,表示 cookie 是否应该只在加密的(即 SSL)连接上发送
|
void setComment(String purpose)
|
设置cookie的注释。该注释在浏览器向用户呈现 cookie 时非常有用。
|
String getComment()
|
获取 cookie 的注释,如果 cookie 没有注释则返回 null。
|
- 当Cookie中可能包含中文或其他非英文字符时,要对 Cookie 的键值进行相应的编码、解码
String encodeStr = java.net.URLEncoder.encode("中文字符串","UTF-8"); //编码
String decodeStr = java.net.URLDecoder.decode("编码后的中文字符串","UTF-8"); // 解码
设置/添加 Cookie 到响应头
通过 Servlet 设置添加 Cookie 一般包含以下3个步骤:
① 创建 Cookie 对象;
Cookie cookie = new Cookie("key","value");
② 设置 Cookie 的最大生命周期;
cookie.setMaxAge( 60 * 60 * 24 ); //单位时间为s,设置过期时间为24h
③ 发送 Cookie 到 HTTP 响应头;
response.addCookie( cookie );
示例代码如下:
public class Demo extends HttpServlet{
//将表单提交得到的 username 数据添加到Cookie
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IoException{
//创建Cookie对象
Cookie username = new Cookie("username", URLEncoder.encode(request.getParameter("username"),"UTF-8") );
//设置过期时间为 24h
username.setMaxAge(60 * 60 * 24);
//向相应头添加 Cookie
response.addCookie(username);
}
}
获取 Cookie 从请求头
获取Cookie,只需要通过HttpRequest的getCookies() 方法获取一个 Cookie 对象数组,然后循环遍历数组使用 getName() 和 getValue() 获取数组的键值对;
示例代码如下:
public class Demo extends HttpServlet{
//获取Cookie中key为username的value
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IoException{
String username = "";
//获取Cookie数组
Cookie[] cookies = request.getCookies();
//遍历数组,找出目标键值对
for(Cookie cookie :cookies){
if( cookie.getName().equals("username")){
username = cookie.getValue();
break;
}
}
}
}
删除 Cookie
Servlet 删除 Cookie 过程如下:
- 读取一个现有的 cookie,并把它存储在 Cookie 对象中;
- 使用 setMaxAge() 方法设置 cookie 的年龄为零,来删除现有的 cookie;
- 把这个 cookie 添加到响应头;
public class Demo extends HttpServlet{
//删除key为username的Cookie
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IoException{
Cookie username = null;
//获取Cookie数组,遍历数组找出目标Cookie对象
Cookie[] cookies = request.getCookies();
for(Cookie cookie :cookies){
if( cookie.getName().equals("username"))
username = cookie;
}
//设置cookie为到期时间为0
username.setMaxAge(0);
//将cookie添加到响应头中
response.addCookie(username);
}
}