Cookie笔记

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有三个步骤:

  1. 创建一个cookie对象
Cookie cookie = new Cookie("key","value");

注意,键值对中不能包括空格或者如下的字符:

[ ] ( ) = , " / ? @ : ;
  1. 设置cookie期限
    setMaxAge()方法用来设置cookie有效期,例如:设置一小时
cookie.setMaxAge(60*60);
  1. 将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("没有发现");
  }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值