09. Servlet Cookie 处理

来源:互联网 发布:江苏省困难职工数据库 编辑:程序博客网 时间:2024/06/04 19:44

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 的键值进行相应的编码、解码


设置/添加 Cookie 到响应头


通过 Servlet 设置添加 Cookie 一般包含以下3个步骤:
① 创建 Cookie 对象;
Cookie cookie = new Cookie("key","value");
② 设置 Cookie 的最大生命周期;
cookie.setMaxAge( 60 * 60 * 24 );  //单位时间为s,设置过期时间为24h
③ 发送 Cookie 到 HTTP 响应头;
response.addCookie( cookie );
示例代码如下:
1
public class Demo extends HttpServlet{
2
    //将表单提交得到的 username 数据添加到Cookie
3
    public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IoException{
4
        //创建Cookie对象
5
        Cookie username = new Cookie("username", URLEncoder.encode(request.getParameter("username")"UTF-8") );
6
        //设置过期时间为 24h
7
        username.setMaxAge(60 * 60 * 24)
8
        //向相应头添加 Cookie
9
        response.addCookie(username);
10
        ...... 
11
    }
12
}

获取 Cookie 从请求头

获取Cookie,只需要通过HttpRequest的getCookies() 方法获取一个 Cookie 对象数组,然后循环遍历数组使用 getName() 和 getValue() 获取数组的键值对;
示例代码如下:

删除 Cookie

Servlet 删除 Cookie 过程如下:
  • 读取一个现有的 cookie,并把它存储在 Cookie 对象中;
  • 使用 setMaxAge() 方法设置 cookie 的年龄为零,来删除现有的 cookie;
  • 把这个 cookie 添加到响应头;
示例代码如下:
1
public class Demo extends HttpServlet{
2
    //删除key为username的Cookie
3
    public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IoException{
4
        
5
        Cookie username = null;
6
        //获取Cookie数组,遍历数组找出目标Cookie对象
7
        Cookie[] cookies = request.getCookies();
8
        for(Cookie cookie :cookies){
9
            if( cookie.getName().equals("username"))
10
                username = cookie;
11
        }
12
        //设置cookie为到期时间为0
13
        username.setMaxAge(0);
14
        //将cookie添加到响应头中
15
        response.addCookie(username);
16
    }
17
}






原创粉丝点击