我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Cookie的工作原理和应用详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Cookie的工作原理和应用详解

1. Cookie 原理

1.1 Cookie 背景信息

客户端状态管理技术,将状态信息保存在客户端。网景公司发明,浏览器会话技术。一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称name和设置值value。浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个大小限制为4kb

1.2 Cookie 工作原理

Cookie工作原理

执行流程:

1.浏览器向服务器发送请求,服务器需要创建cookie,服务器会通过响应携带cookie,在产生响应时会产生Set-Cookie响应头,从而将cookie信息传递给了浏览器;

2.当浏览器再次向服务器发送请求时,会产生cookie请求头,将之前服务器的cookie信息再次发送给了服务器,然后服务器根据cookie信息跟踪客户端状态。

1.3 Cookie 创建、获取、修改

chrome谷歌浏览器查看cookie信息,浏览器地址栏输入:

  • chrome://settings/content/cookies
  • chrome://settings/siteData

Cookie 创建:


// 用响应创建Cookie,等价于 response.addHeader("set-cookie", "name=value");
Cookie cookie = new Cookie(String name, String value); // Cookie: name=value
cookie.setMaxAge(seconds); // 设置Cookie的生命周期
cookie.setPath("/"); // 设置Cookie的共享范围
response.addCookie(cookie); // 添加1个Cookie

Cookie 获取:


// 用请求获取Cookie
Cookie[] cookies = request.getCookies(); // 获取Cookies返回数组
// 需遍历
cookie.getName(); // 获取键
cookie.getValue(); // 获取值

Cookie 修改:


// 修改Cookie
cookie.setValue(String name);

1.4 Cookie 共享范围

/ 当前项目下所有资源均可共享访问该Cookie对象内容

/project/demo 当前项目下只有资源demo均可共享访问该Cookie对象内容

设置 Cookie 数据共享范围:


// 设置Cookie的共享范围
cookie.setPath("/");

1.5 Cookie 生命周期

  • <0:浏览器会话结束/浏览器关闭,内存存储(默认)
  • =0:失效
  • >0:生效时间,单位s

在生命周期内Cookie会跟随任何请求,可通过设置路径限制携带Cookie的请求资源范围

设置 Cookie 数据生命周期:


// 设置Cookie生命周期,单位s
cookie.setMaxAge(int second); // 7天:7*24*60*60

1.6 Cookie 中文乱码 - 解决方案

中文:Unicode,4个字节 英文:ASCII,2个字节

Cookie的中文乱码需要进行编码和解码处理:

编码:java.net.URLEncoder 的 URLEncoder.encode(String str, String encoding)

解码:java.net.URLDecoder 的 URLDecoder.decode(String str, String encoding)


// 编码
Cookie cookie = new Cookie(
        URLEncoder.encode("键", "utf-8"),
        URLEncoder.encode("值", "utf-8")
);
response.addCookie(cookie);
// 解码
String keyStr = URLDecoder.decode(cookie.getName(), "utf-8");

1.7 Cookie 优缺特点分析

优点:

可配置到期规则:① 1次请求就失效 ②1次浏览器会话(关闭)失效 ③配置永久生效 ● 简单性:基于文本的轻量结构,简单键值对

数据持久性:虽然Cookie可被客户端浏览器的过期处理和干预,但Cookie通常也是客户端上持续时间最长的数据保留形式缺点:

大小受到限制:大多数浏览器的Cookie只有4kb大小的限制

用户配置禁用:客户浏览器设置了禁用接收Cookie的能力,限制了该功能

潜在安全风险:用户可能会操纵篡改浏览器上的Cookie,会造成Cookie应用程序执行失败的问题

2. Cookie 应用

2.0 工具类:CookieUtils


public class CookieUtils {
    
    public static Cookie getCookie(Cookie[] cookies, String cookieName) {
        if (null != cookies && 0 != cookies.length) {
            for (Cookie ck : cookies) {
                if (cookieName.equals(ck.getName())) {
                    return ck;
                }
            }
        }
        return null;
    }
}

2.1 案例:记录用户上一次访问时间

核心逻辑:


    // 判断是否是第一次请求
    Cookie cookie = CookieUtils.getCookie(request.getCookies(), "lastTime");
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    if (null == cookie) {
        // 第一次访问,打印当前时间,并创建Cookie,存储当前时间
        Date date = new Date();
        System.out.println("第一次访问时间:" + sdf.format(date));
        cookie = new Cookie("lastTime", String.valueOf(date.getTime()));
    } else {
        // 不是第一次访问,从cookie去除上一次访问时间,并打印,获取当前时间,存储cookie中
        long currTimeMills = Long.parseLong(cookie.getValue());
        System.out.println("上一次访问时间:" + sdf.format(new Date(currTimeMills)));
        cookie.setValue(String.valueOf((new Date()).getTime()));
    }
    response.addCookie(cookie);

Cookie应用

2.2 案例:记录商品的浏览历史信息

历史记录核心逻辑:


    String id = request.getParameter("id");
    Cookie cookie = CookieUtils.getCookie(request.getCookies(), "history");
    if (null == cookie) {
        // 木有浏览记录:创建Cookie,并存储浏览记录
        cookie = new Cookie("history", id);
    } else {
        // 有浏览记录
        String history = cookie.getValue();
        if (!history.contains(id)) {
            // 有浏览记录,不包含当前浏览商品:将浏览商品拼接到已有的浏览记录中
            history += "-" + id;
            cookie.setValue(history);
        }
        // 有浏览记录,包含当前浏览商品则无需处理
    }
    response.addCookie(cookie);
    // 显示商品浏览记录,路径:/demo/show
    response.sendRedirect(request.getContextPath() + File.separator + "show");

显示历史记录信息:


        // 获取商品浏览记录
        Cookie cookie = CookieUtils.getCookie(request.getCookies(), "history");
        StringBuffer respsb = new StringBuffer();
        if (null == cookie) {
            // 没有浏览记录
            respsb.append("<font color='red'>没有浏览记录</font>,");
            respsb.append("<a href='books.html'>浏览商品</a>");
        } else {
            // 有浏览记录: 0-1-2-3
            String[] books = {"西游记", "红楼梦", "水浒传", "三国志"};
            String history = cookie.getValue();
            String[] historys = history.split("-");
            respsb.append("您的浏览记录如下:<br>");
            for (String index : historys) {
                String bookName = books[Integer.parseInt(index)];
                respsb.append(bookName).append("<br>");
            }
        }
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().println(respsb);

Cookie应用

点击第一个后:

Cookie应用

总结

本篇文章的内容就到这了,希望大家可以多多关注编程网的其他精彩内容!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Cookie的工作原理和应用详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SELINUX工作原理详解

1. 简介SElinux带给Linux的主要价值是:提供了一个灵活的,可配置的MAC机制。 Security-Enhanced Linux (SELinux)由以下两部分组成: 1) Kernel SELinux模块(/ke
2022-06-04

深入理解z-index的工作原理和应用技巧

z-index是CSS中控制元素层级的属性,但其工作原理并不简单。本文将深入探讨z-index的工作原理,包括堆叠上下文、层叠顺序和层叠上下文等概念,并介绍z-index的应用技巧,如如何避免z-index的陷阱、如何使用z-index实现复杂布局等。
2023-05-19

Spring @Transactional工作原理详解

本文将深入研究Spring的事务管理。主要介绍@Transactional在底层是如何工作的。之后的文章将介绍:propagation(事务传播)和isolation(隔离性)等属性的使用事务使用的陷阱有哪些以及如何避免JPA和事务管理很重
2023-05-30

解密ios响应链的工作原理

本文将深入探讨事件响应链的工作原理,并提供 Swift 中的代码示例来帮助读者更好地理解这一概念
2023-03-22

详解时间轮TimeWheel的工作原理

时间轮(TimeWheel)作为一种高效率的计时器实现方案,在1987年发表的论文Hashed and Hierarchical Timing Wheels中被首次提出。本文主要来聊聊它的工作原理,感兴趣的可以了解一下
2023-02-17

PHP缓存机制详解:深入探究其工作原理和实际应用

PHP缓存机制全解析:深入理解其原理与应用引言:在开发Web应用程序中,缓存是一种重要的技术手段,能够显著提升应用程序的性能和用户体验。而PHP作为一种常用的服务器端编程语言,也提供了丰富的缓存机制供开发者使用。本文将深入探讨PHP缓存机
PHP缓存机制详解:深入探究其工作原理和实际应用
2024-01-23

RocketMQ Namesrv架构工作原理详解

这篇文章主要为大家介绍了RocketMQ Namesrv架构工作原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录