Servlet自学之旅(6):Cookie

本文介绍了Servlet中Cookie的工作原理和使用方法,包括创建、设置有效期、读取和删除Cookie的详细步骤。Cookie用于在客户端存储信息,常用于会话管理、个性化设置和追踪用户行为。在设置Cookie时需要注意编码问题,并通过HttpServletResponse添加到响应头。读取Cookie时,通过HttpServletRequest获取并遍历Cookie数组。删除Cookie则需将其MaxAge设为0并重新添加到响应头。
摘要由CSDN通过智能技术生成
  • Cookie 是服务器保存在客户端的一小段文本信息,保留了各种追踪信息。每个 Cookie 的大小一般不能超过4KB。客户端每次向服务器发出请求,就会自动附上这段信息。Servlet可以设置、重置、访问、删除Cookie。
  • Cookie 主要用来分辨两个请求是否来自同一个浏览器,以及用来保存一些状态信息:
    Servlet服务器识别用户的三个步骤:

    • 服务器脚本向客户端发送一组Cookie。包含姓名、年龄等。
    • 客户端将这些信息存储在本地,以备使用。
    • 当下一次客户端向服务器发送请求是,客户端将会把这些Cookie中的信息发送给服务器,服务器使用这些信息来识别用户。
  • 它的常用场合有以下一些:

    • 对话(session)管理:保存登录、购物车等需要记录的信息。
    • 个性化:保存用户的偏好,比如网页的字体大小、背景色等等。
    • 追踪:记录和分析用户行为。

Servlet处理Cookie时,需要先对中文进行编码和解码:

//编码
String enCodeStr = java.net.URLEncoder.encode("中文","UTF-8");
//解码
String deCodeStr = java.net.URLDecoder.decode("编码后的字符串","UTF-8");

Cookie解析

Cookie包含一下几部分信息:

  • Cookie 的名字
  • Cookie 的值(真正的数据写在这里面)
  • 到期时间
  • 所属域名(默认是当前域名)
  • 生效的路径(默认是当前网址)

一般在HTTP头文件中设置Cookie(JavaScript可以在浏览器上设置一个Cookie),Servlet通过发送如下头信息来设置Cookie:

HTTP/1.1 200 OK
Date: Fri,04 Feb 2018 09:08:11 GMT
Server: Apache/1.3.9 (UNIX)PHP/4.0b3
Set-Cookie: name=xyz; expires=Friday,04-Feb-07 09:08:11 GMT;
                    paht=/;domain=gsc.com
Connection: close
Content-Type: text/html

名称和值会被 URL 编码,expires字段是一个指令,告诉浏览器在给定的时间之后遗忘该Cookie。

客户端向服务器发送请求时,若请求与Cookie匹配的域名,路径的页面,就会把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

在与Cookie匹配的Servlet中,可以通过request对象访问改Cookie,调用request.getCookies()将得到Cookie对象的数组。
Cookie对象提供以下方法:

方法名描述
public void setDomain(String pattern)该方法设置 cookie 适用的域,例如 runoob.com。
public String getDomain()该方法获取 cookie 适用的域,例如 runoob.com。
public void setMaxAge(int expiry)该方法设置 cookie 过期的时间(以秒为单位)。如果不这样设置,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 都会返回 cookie。
public String getPath()该方法获取 cookie 适用的路径。
public void setSecure(boolean flag)该方法设置布尔值,表示 cookie 是否应该只在加密的(即 SSL)连接上发送。
public void setComment(String purpose)设置cookie的注释。该注释在浏览器向用户呈现 cookie 时非常有用。
public String getComment()获取 cookie 的注释,如果 cookie 没有注释则返回 null

设置Cookie

通过Servlet设置Cookie有三个步骤:

  • 创建Cookie对象
  • 设置有效时间
  • 添加Cookie到HTTP响应头
创建Cookie对象

Cookie cookie = new Cookie(key,value);
key和value 不可包含[] () = , ” / ? @ : ; 和空格这些字符。

设置最大有效时间

cookie.setMaxAge(second);
已秒为单位,设置Cookie生效的最大时间。

添加Cookie到HTTP响应头

response.addCookie(cookie);

读取Cookie

读取Cookie需通过HttpServletRequest.getCookies() 获得Cookie数组,遍历此数组,即可调用getName()和getValue()方法访问Cookie的值。

Cookie[] cookies = request.getCookies();
Cookie cookie = null;
for(int i = 0; i < cookies.length; i++){
    cookie = cookies[i];
    String cookieName = cookie.getName();
    String cookieValue = cookie.getValue();
}

cookie.getMaxAge()方法不返回设置的MaxAge,只返回-1。所以不可以通过判断过期时间判断Cookie是否过期。当Cookie过期后,Cookie不返回。

删除Cookie

Servlet删除Cookie分为三个步骤:

  • 读取Cookie.
  • setMaxAge(0)将有效时间设置为0.
  • 添加Cookie到HTTP响应头,以此来删除Cookie.
Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (int i = 0; i < cookies.length; i++) {
                if (cookies[i].getName().equals("key") || cookies[i].getName().equals("value")) {
                    cookies[i].setMaxAge(0);
                    cookies[i].setPath("/");
                    response.addCookie(cookies[i]);
                }
            }
        }

其中cookies[i].setPath();要根据所要删除的Cookie而有所区别,”/”是项目路径的所有Cookie,也可以是(“/CookieServlet/TestServlet”)等指定的Servlet设置的Cookie。

参考:菜鸟教程http://www.runoob.com/servlet/servlet-cookies-handling.html 等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值