前言

本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!
也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!


一、什么是 Cookie?

  1. Cookie 翻译过来是饼干的意思。
  2. Cookie是一种用于在客户端浏览器和服务器之间进行状态跟踪的技术。当用户访问一个网站时,服务器将一小段用于标识用户和跟踪用户访问行为的信息发送到用户的浏览器,浏览器将这些信息存储在用户的计算机上。然后,在用户下次访问该网站时,浏览器会将这些信息发送回服务器,从而实现用户的状态跟踪。
  3. Cookie 是服务器通知客户端保存键值对的一种技术。
  4. 客户端有了 Cookie 后,每次请求都发送给服务器。
  5. 每个 Cookie 的大小不能超过 4kb

二、Cookie的特点

Cookie的特点包括:

  1. 持久性:Cookie可以设置一个过期时间,在这个时间之前,浏览器会持续保存该Cookie并在用户下次访问网站时发送回服务器。这使得网站可以长期跟踪用户的行为和偏好。

  2. 可扩展性:Cookie可以存储任意类型的数据,如用户标识、用户首选项等。这使得网站可以根据用户的需求和行为来提供个性化的服务。

  3. 安全性:Cookie可以设置为只在通过安全连接(如HTTPS)时传输,或者只能通过服务器访问,从而增加了一定的安全性。

  4. 灵活性:Cookie可以通过设置路径和域来限制它们的作用范围,使得不同的网页或子域可以拥有各自的Cookie。

总的来说,Cookie在互联网应用中起到了重要的作用,它可以实现用户的状态跟踪和个性化服务。然而,由于Cookie会在用户计算机上存储一些个人信息,因此也引发了一些安全和隐私的问题。

二、如何创建 Cookie?

在这里插入图片描述

public class CookieServlet extends BaseServlet {
    protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.创建cookie对象
        Cookie cookie1 = new Cookie("key4","value4");
        //2. 通知客户端保存Cookie
        resp.addCookie(cookie1);
        //1. 创建cookie对象
        Cookie cookie2 = new Cookie("key5","value5");
        //2. 通知客户端保存Cookie
        resp.addCookie(cookie2);
        resp.getWriter().write("Cookie创建成功"); 
    }
}

三、服务器如何获取 Cookie

服务器获取客户端的 Cookie 只需要一行代码:req.getCookies():Cookie[]
在这里插入图片描述

public class CookieUtils {
    /**
     * 查找指定名称的Cookie对象
     * @param name
     * @param cookies
     * @return
     */
    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;
    }

}

Servlet :

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 iWantCookie = CookieUtils.findCookie("key1", cookies);

//        for (Cookie cookie : cookies) {
//            if ("key2".equals(cookie.getName())) {
//                iWantCookie = cookie;
//                break;
//            }
//        }
        // 如果不等于null,说明赋过值,也就是找到了需要的Cookie
        if (iWantCookie != null) {
            resp.getWriter().write("找到了需要的Cookie");
        }


    }

四、Cookie 值的修改

4.1 方案一

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

4.2 方案二

  1. 先查找到需要修改的 Cookie 对象
  2. 调用 setValue()方法赋于新的 Cookie 值。
  3. 调用 response.addCookie()通知客户端保存修改
protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        方案一:
//        1、先创建一个要修改的同名的Cookie对象
//        2、在构造器,同时赋于新的Cookie值。
        Cookie cookie = new Cookie("key1","newValue1");
//        3、调用response.addCookie( Cookie ); 通知 客户端 保存修改
        resp.addCookie(cookie);

//        方案二:
//        1、先查找到需要修改的Cookie对象
        Cookie cookie = CookieUtils.findCookie("key2", req.getCookies());
        if (cookie != null) {
//            2、调用setValue()方法赋于新的Cookie值。
            cookie.setValue("newValue2");//值不能为中文,除非必须使用base64编码
//        3、调用response.addCookie()通知客户端保存修改
            resp.addCookie(cookie);
        }


        resp.getWriter().write("key1的Cookie已经修改好");

    }

五、浏览器查看 Cookie

谷歌浏览器如何查看 Cookie:
在这里插入图片描述
火狐浏览器如何查看 Cookie:
在这里插入图片描述
edge浏览器如何查看 Cookie:
在这里插入图片描述

六、Cookie 生命控制

  1. Cookie 的生命控制指的是如何管理 Cookie 什么时候被销毁(删除)
  2. setMaxAge()
    • 正数,表示在指定的秒数后过期
    • 负数,表示浏览器一关,Cookie 就会被删除(默认值是-1)
    • 零,表示马上删除 Cookie
 /**
     * 设置存活1个小时的Cooie
     * @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
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 先找到你要删除的Cookie对象
        Cookie cookie = CookieUtils.findCookie("key4", req.getCookies());
        if (cookie != null) {
            // 调用setMaxAge(0);
            cookie.setMaxAge(0); // 表示马上删除,都不需要等待浏览器关闭
            // 调用response.addCookie(cookie);
            resp.addCookie(cookie);

            resp.getWriter().write("key4的Cookie已经被删除");
        }

    }

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

七、Cookie 有效路径 Path 的设置

  1. Cookie 的有效路径(Path)指定了哪些路径下发送的请求会附带该 Cookie。只有与 Cookie 的有效路径匹配的请求才会携带该 Cookie。

常见的可选值有以下几种:

  • 默认值(/):表示服务器的根路径,所有请求都会携带该 Cookie;
  • 特定路径:例如,设置为 /myapp 表示只有路径以 /myapp 开头的请求会携带该 Cookie;
  • 精确路径:例如,设置为 /myapp/index.html 表示只有请求路径为 /myapp/index.html 的请求会携带该 Cookie;
  • 目录路径(目录名后带斜杠):例如,设置为 /myapp/ 表示只有路径以 /myapp/ 开头的请求会携带该 Cookie。例如,请求路径为 /myapp/page1 或者 /myapp/page2 都会携带该 Cookie。
  1. 注意事项:

    • Cookie 的有效路径是以斜杠 / 开头的路径字符串。
    • 如果不指定有效路径,默认为根路径,即所有请求都会携带该 Cookie。
    • Cookie 只会被发送到与其有效路径匹配的请求中。
    • 如果请求路径包含多个目录,例如 /myapp/subfolder/page.html,则该请求会携带该路径下的所有符合条件的 Cookie。
  2. 有效路径的设置可以帮助服务器控制哪些请求会附带 Cookie,从而实现更精确的控制和提高安全性。

  3. 举例:

CookieA path=/工程路径
CookieB path=/工程路径/abc

举例一:
请求地址如下: http://ip:port/工程路径/a.html
CookieA 发送
CookieB 不发送
举例二:
http://ip:port/工程路径/abc/a.html
CookieA 发送
CookieB 发送

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

八、案例:Cookie 练习—免输入用户名登录

在这里插入图片描述
login.jsp

<%--
  Created by IntelliJ IDEA.
  User: Hey
  Date: 2022/4/10
  Time: 19:55
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="http://localhost:8080/13_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 HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("username");
        String password = request.getParameter("password");
        if("abc".equals(name)&&"123456".equals(password)){
            Cookie cookie = new Cookie("username","abc");
            response.addCookie(cookie);
            System.out.println("登陆成功!");
            cookie.setMaxAge(60*60*24*7);
        }else{
            System.out.println("登陆失败!");
        }
    }
}
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐