Cookie的工作原理和应用详解

目录
  • 1. Cookie 原理
    • 1.1 Cookie 背景信息
    • 1.2 Cookie 工作原理
    • 1.3 Cookie 创建、获取、修改
    • 1.4 Cookie 共享范围
    • 1.5 Cookie 生命周期
    • 1.6 Cookie 中文乱码 - 解决方案
    • 1.7 Cookie 优缺特点分析
  • 2. Cookie 应用
    • 2.0 工具类:CookieUtils
    • 2.1 案例:记录用户上一次访问时间
    • 2.2 案例:记录商品的浏览历史信息
  • 总结

1. Cookie 原理

1.1 Cookie 背景信息

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

1.2 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 {
    /**
     * 获取指定名称的Cookie对象
     * @param cookies 一组Cookie
     * @param cookieName 指定的Cookie名称
     * @return 需要的Cookie
     */
    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);

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);

点击第一个后:

总结

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

(0)

相关推荐

  • php cookie工作原理与实例详解

    在php 中cookie是我们常用到的,但是可能很多朋友都不知道cookie是怎么工作的,下面小编来给大家整理一下关于php cookie 工作原理与一些对于cookie读写操作实例. Cookie和会话状态 做BS开发,这两个概念必不可少,先来个大概了解,没有实际应用很难深入,深入看参考地址! 什么是 Cookie? Cookie 是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递.用户每次访问站点时,Web 应用程序都可以读取 Cookie 包含的信息. Cookie

  • ASP.NET Core 使用Cookie验证身份的示例代码

    ASP.NET Core 1.x提供了通过Cookie 中间件将用户主体序列化为一个加密的Cookie,然后在后续请求中验证Cookie并重新创建主体,并将其分配给HttpContext.User属性.如果您要提供自己的登录界面和用户数据库,可以使用作为独立功能的Cookie中间件. ASP.NET Core 2.x的一个主要变化是不再存在Cookie中间件.取而代之的是在Startup.cs文件中的Configure方法中的调用UseAuthentication方法会添加设置HttpConte

  • Python Selenium操作Cookie的实例方法

    有了Selenium,还可以轻松操作Cookies,比如获取.添加.删除Cookies.具体代码如下: from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.zhihu.com' print(browser.get_cookies()) # browser.add_cookie({'aa':'aa','bb':'bb'}) # print(browser.get_cookies()

  • vue登录页实现使用cookie记住7天密码功能的方法

    问题描述 项目的登录页中,会有要求记住7天密码的功能,本篇文章记录一下写法,主要是使用cookie,注释我写的很详细了,大家可以看一下我写的注释的步骤,还是比较详细的.亲测有效 html部分 代码图示 效果图示 代码粘贴 <el-form ref="form" :model="form" label-width="80px" label-position="top" @submit.native.prevent >

  • python爬虫用request库处理cookie的实例讲解

    python爬虫中使用urli库可以使用opener"发送多个请求,这些请求是能共享处理cookie的,小编之前也提过python爬虫中使用request库会比urllib库更加⽅便,使用使用requests也能达到共享cookie的目的,即使用request库get方法和使用requests库提供的session对象都可以处理. 方法一:使用request库get方法 resp = requests.get('http://www.baidu.com/') print(resp.cookies

  • Cookie的工作原理和应用详解

    目录 1. Cookie 原理 1.1 Cookie 背景信息 1.2 Cookie 工作原理 1.3 Cookie 创建.获取.修改 1.4 Cookie 共享范围 1.5 Cookie 生命周期 1.6 Cookie 中文乱码 - 解决方案 1.7 Cookie 优缺特点分析 2. Cookie 应用 2.0 工具类:CookieUtils 2.1 案例:记录用户上一次访问时间 2.2 案例:记录商品的浏览历史信息 总结 1. Cookie 原理 1.1 Cookie 背景信息 客户端状态管

  • AJAX工作原理及优缺点详解

    AJAX 是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 一.ajax所包含的技术 大家都知道ajax并非一种新的技术,而是几种原有技术的结合体.它由下列技术组合而成. 使用CSS和XHTML来表示. 使用DOM模型来交互和动态显示. 使用XMLHttpRequest来和服务器进行异步通信. 使用javascript来绑定和调用. 在上面几中技术中,除了XmlHttpReq

  • java中Servlet监听器的工作原理及示例详解

    监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行. 监听器原理 监听原理 1.存在事件源 2.提供监听器 3.为事件源注册监听器 4.操作事件源,产生事件对象,将事件对象传递给监听器,并且执行监听器相应监听方法 监听器典型案例:监听window窗口的事件监听器 例如:swing开发首先制造Frame**窗体**,窗体本身也是一个显示空间,对窗体提供监听器,监听窗体方法调用或者属性改变:

  • PHP的cookie与session原理及用法详解

    本文实例讲述了PHP的cookie与session原理及用法.分享给大家供大家参考,具体如下: 产生背景 HTTP协议是无状态的协议.一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接.这就意味着服务器无法从连接上跟踪会话.于是需要引入一种机制,COOKIE于是就顺应而生. Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上.客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上.这就是

  • javascript原型继承工作原理和实例详解

    先为大家分享JS原型继承实例,供大家参考,具体内容如下 一.JS原型继承 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>JS原型继承</title> </head> <body> <!--原型继承--> <script type="text/javascript"> //cl

  • JavaScript注入漏洞的原理及防范(详解)

    初次接触: 初次接触JavaScript注入漏洞后,如果不对这种漏洞的作用机理仔细分析并提取出其发生的某种模式,你就不能做到快速的发现项目中可能存在的所有注入风险并在代码中防范. 发生模式: JavaScript注入漏洞能发生作用主要依赖两个关键的动作,一个是用户要能从界面中注入JavaScript到系统的内存或者后台存储系统中:二是系统中存在一些UI会展示用户注入的数据. 比如注入漏洞最常见的就是发生在各种类型的名字中,比如系统中的人名等等,因为名字往往会在各种系统上显示,如果在某个用户输入名

  • Spring IOC和aop的原理及实例详解

    这篇文章主要介绍了Spring IOC和aop的原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架.特点是面向接口编程,松耦合. 1:IOC(控制反转) 别名(DI:依赖注入) 首先来一段ioc的实现原来代码: public class ClassPathXmlApplicationContext implements BeanFactory { privat

  • Python 异步协程函数原理及实例详解

    这篇文章主要介绍了Python 异步协程函数原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一. asyncio 1.python3.4开始引入标准库之中,内置对异步io的支持 2.asyncio本身是一个消息循环 3.步骤: (1)创建消息循环 (2)把协程导入 (3)关闭 4.举例: import threading # 引入异步io包 import asyncio # 使用协程 @ asyncio.coroutine def

  • Java switch关键字原理及用法详解

    这篇文章主要介绍了Java中 switch关键原理及用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Switch语法 switch作为Java内置关键字,却在项目中真正使用的比较少.关于switch,还是有那么一些奥秘的. 要什么switch,我有if-else 确实,项目中使用switch比较少的一个主要原因就在于它的作用能被if-else代替,况且switch对类型的限制,也阻碍了switch的进一步使用. 先看看switch的语法

随机推荐