技术点13:Cookie

JAVA学习网 2020-11-17 09:39:15

Cookie技术

一、什么是 Cookie?

  1、Cookie 翻译过来是饼干的意思。
  2、Cookie 是服务器通知客户端保存键值对的一种技术。
  3、客户端有了 Cookie 后,每次请求都发送给服务器。
  4、每个 Cookie 的大小不能超过 4kb

二、如何创建 Cookie

2.1、创建Cookie的流程

 

 

2.2、具体操作

①创建一个JavaEE工程

 

② 将cookie的演示文件拷贝到web目录下

 

 

③ 创建一个包用来存放Servlet程序

 

④ 将BaseServlet拷贝到创建的包下

 

⑤ 创建CookieServlet程序

package com.zixue.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author Mr Guo
 * @create 2020-11-16 14:49
 */
public class CookieServlet extends BaseServlet{

    protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.创建Cookie
        Cookie cookie = new Cookie("key1", "value1");
        //2.通知客户端保存Cookie
        resp.addCookie(cookie);

        //1.创建Cookie
        Cookie cookie1 = new Cookie("key2", "value2");
        //2.通知客户端保存Cookie
        resp.addCookie(cookie1);

        resp.getWriter().write("Cookie创建成功");
    }
}

⑥ 修改cookie.html页面中创建Cookie的地址

 

⑦解决响应中文乱码问题

 

⑧ 启动项目,浏览器访问cookie.html页面

 

 

三、服务器如何获取 Cookie

  服务器获取客户端的 Cookie 只需要一行代码:req.getCookies():获取到一个Cookie[]数组。

3.1、获取流程

 

3.2、具体操作

① 在CookieServlet程序中创建getCookie方法用于获取Cookie

protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();
        for (Cookie cookie : cookies) {
            //getName方法返回Cookie的key
            //getValue方法返回Cookie的value
            resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "]<br/>");
        }
    }

② 修改cookie.html页面获取Cookie的访问地址

 

③ 浏览器访问

 

3.3、获取某个key的Cookie

  有时候,我们要获取某个特定的Cookie,比如key1,而这种情况开发中很长见,具体操作如下:

① 创建CookieUtils工具类

 

② 声明一个方法,用来查找指定名称的Cookie对象

public class CookieUtils {
    /**
     * 查找指定名称的Cookie对象
     * @param name
     * @param cookies
     * @return 如果返回null,表示没有这个名称对应的Cookie对象,否则就是找到了指定名称的cookie对象
     */
    public static Cookie findCookie(String name, Cookie[] cookies){
        if (name == null || cookies == null || cookies.length == 0){
            return null;
        }

        for (Cookie cookie : cookies) {
            if (name.equals(cookie.getName())){
                return cookie;
            }
        }
        return null;
    }
}

③ CookieServlet程序中查找指定的Cookie对象

protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();

        Cookie iWantCookie = CookieUtils.findCookie("key1", cookies);
        if (iWantCookie != null){
            resp.getWriter().write("找到了需要的Cookie");
        }
 }

 

四、Cookie 值的修改

方案一:
  1、先创建一个要修改的同名(指的就是 key)的 Cookie 对象
  2、在构造器,同时赋于新的 Cookie 值。
  3、调用 response.addCookie( Cookie );

CookieServlet程序:

protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("key1", "newValue1");
        resp.addCookie(cookie);

        resp.getWriter().write("Cookie中的值已经修改了");
    }

cookie.html页面:

 

方案二:
  1、先查找到需要修改的 Cookie 对象
  2、调用 setValue()方法赋于新的 Cookie 值。
  3、调用 response.addCookie()通知客户端保存修改
 protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = CookieUtils.findCookie("key2", req.getCookies());
        if (cookie != null){
            cookie.setValue("newValue2");
            resp.addCookie(cookie);
        }
    }

 

五、浏览器查看 Cookie

谷歌浏览器如何查看 Cookie:

 

火狐浏览器如何查看 Cookie:

六、Cookie 生命控制

  Cookie 的生命控制指的是如何管理 Cookie 什么时候被销毁(删除)
setMaxAge()
  正数,表示在指定的秒数后过期
  负数,表示浏览器一关,Cookie 就会被删除(默认值是-1)
  零,表示马上删除 Cookie

CookieServlet程序:

/**
     * 默认的会话级别的Cookie
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("defaultLife", "defaultLife");
        cookie.setMaxAge(-1);//设置存活时间
        resp.addCookie(cookie);

    }

    /**
     * 马上删除一个Cookie
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //先找到你要删除的Cookie对象
        Cookie cookie = CookieUtils.findCookie("key2", req.getCookies());
        //设置setMaxAge(0)
        cookie.setMaxAge(0);//表示马上删除,不需要等浏览器关闭
        resp.addCookie(cookie);
        resp.getWriter().write("key2的Cookie已经被删除了");
    }

    /**
     * 设置存活一个小时的Cookie
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("life3600", "life3600");
        cookie.setMaxAge(60 * 60);//设置Cookie一小时之后被删除
        resp.addCookie(cookie);
        resp.getWriter().write("已经创建了一个存活一小时的Cookie");
    }

cookie.html页面:

 

七、Cookie 有效路径 Path 的设置

Cookie 的 path 属性可以有效的过滤哪些 Cookie 可以发送给服务器。哪些不发。
path 属性是通过请求的地址来进行有效的过滤。
  CookieA    path=/工程路径
  CookieB    path=/工程路径/abc

 

CookieServlet程序:

protected void testPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("path1", "path1");
        cookie.setPath(req.getContextPath() + "/abc");
        resp.addCookie(cookie);
        resp.getWriter().write("创建了一个带有path路径的cookie");
    }

cookie.html页面:

 

八、Cookie 练习---免输入用户名登录 

8.1、实现流程

 

8.2、具体操作

login.jsp页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="http://localhost:8080/cookie_session/loginServlet" method="get">
    用户名:<input type="text" name="username" value="${cookie.username.value}"> <br>
    密码:<input type="password" name="password"> <br>
    <input type="submit" value="登录">
</form>
</body>
</html>

LoginServlet程序:

public class LoginServlet extends BaseServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        if ("wzg168".equals(username) && "123456".equals(password)){
            //登录成功
            Cookie cookie = new Cookie("username", username);
            cookie.setMaxAge(60 * 60 * 24 * 7);//当前cookie一周内有效
            resp.addCookie(cookie);
            System.out.println("登录成功");
        }else{
            //登录失败
            System.out.println("登录失败");
        }
    }
}

 

 

阅读(2439) 评论(0)