一篇关于Cookie的基础知识

目录

一、现有问题

二、简介

三、Cookie原理

四、Cookie应用

4.1 创建并向客户端发送Cookie

4.2 从客户端读取Cookie

4.3 Cookie的生命周期

4.4 Cookie的编码和解码

4.5 优缺点

五、记录上次登录的时间(案例)

六、Cookie 获取范围有多大?


一、现有问题

HTTP协议是无状态的,不能保存每次提交的信息,如果用户发来一个新请求,服务器无法知道它是否与上次的请求有联系。那么服务器将如何建立、维护与客户端的会话呢?

因此对于需要客户端和服务器端多次交互的网络应用,则必须记住客户端状态,如:网上的购物车,用户登录。

二、简介

客户端状态管理技术:将状态保存在客户端,代表性的是:Cookie技术。

Cookie,其实就是储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息,类型为“小型文本文件”。

  • Cookie是在浏览器访问Web服务器的某个资源时, 由Web服务器在HTTP响应消息头中附带传送给浏览器的一小段数据。
  • 一旦Web浏览器保存了某个Cookie, 那么它在以后每次访问该Web服务器时, 都应在HTTP请求头中将这个Cookie回传给Web服务器。
  • Cookie是一段不超过4KB的小型文本数据,由一个名称(Name)、一个值(Value)和其它几个用于控制Cookie有效期、安全性、使用范围的可选属性组成。

三、Cookie原理

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


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


注意:

  • 一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称name和设置值value。
  • 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个大小限制为4kb。 

四、Cookie应用

4.1 创建并向客户端发送Cookie

调用Cookie的构造方法,给出Cookie的名称和Cookie的值,二者都是字符串

Cookie c = new Cookie("userName" , "a1234")

将Cookie放入到HTTP响应中(如没有这一步,将不会有任何Cookie被发送到浏览器)

response.addCookie(c)

4.2 从客户端读取Cookie

调用request.getCookies,得到Cookie对象组成的数组。循环数组,调用每个对象的getName找到想要的cookie。

Cookie[] cookies = request.getCookies();
if (cookies != null) {
    for (Cookie cookie : cookies) {
        if ("username".equals(cookie.getName())) {
            System.out.println(cookie.getValue());
        }
    }
}

getName():读取Cookie的名称。不存在setName()方法。

getValue()/setValue():读取/设置与Cookie关联的值,如果重新设置了某Cookie的值,需要用addCookie()方法将其发送回去

4.3 Cookie的生命周期

  • 默认情况下,Cookie存储在浏览器内存中,当浏览器关闭时内存释放,Cookie销毁
  • 设置Cookie存活时间:setMaxAge(int seconds)
    1. 零:删除对应 Cookie
    2. 负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,Cookie立即销毁
    3. 正数:将Cookie 写入浏览器所在电脑硬盘的文件中,持久化存储。超时自动删除。
设置一周(7天的有效时间)
cookie.setMaxAge(60*60*24*7);

4.4 Cookie的编码和解码

Cookie默认不支持中文,只能包含ASCII字符,所以Cookie需要对Unicode字符进行编码, 否则会出现乱码。

  • 编码可以使用 java.net .URLEncoder类的encode(Stringstringencoding)方法
  • 解码使用 java.net .URLDecoder类的decode(Stringstr,Stringencoding)方法
// 编码
Cookie cookie = new Cookie(
        URLEncoder.encode("键名", "utf-8"),
        URLEncoder.encode("键值", "utf-8")
);
response.addCookie(cookie);

// 解码
String keyStr = URLDecoder.decode(cookie.getName(), "utf-8");

4.5 优缺点

优点:
● 可配置到期规则
● 简单性:基于文本的轻量结构,简单键值对
● 数据持久性:虽然Cookie可被客户端浏览器的过期处理和干预,但Cookie通常也是客户端上持续时间最长的数据保留形式。

缺点
● 大小受到限制:大多数浏览器的Cookie只有4kb大小的限制
● 用户配置禁用:有些用户禁用了浏览器或客服端接收Cookie的能力,限制了该功能
● 潜在安全风险:用户可能会操纵篡改浏览器上的Cookie,会造成Cookie应用程序执行失败的问题

五、记录上次登录的时间(案例)

  1. 需求:
    1. 访问 LoginServlet ,如果是第一次访问,提示:您好,欢迎首次访问
    2. 如果不是第一次访问,则提示:欢迎回来,您上次访问的时间为:上次访问时间
@WebServlet(name = "work",value = "/work")
public class HelloServlet extends HttpServlet {
    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //告诉服务器以哪种方式解析乱码(中文)
        request.setCharacterEncoding("UTF-8");
        //设置客服端和服务端编码一致且支持中文
        response.setContentType("text/html;charset=utf-8");

        PrintWriter writer = response.getWriter();
        Cookie[] cookies = request.getCookies();
        boolean isFirstVisit = true;
        String lastVisitTime = null;
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                if ("lastVisitTime".equals(name)) {
                    isFirstVisit = false;
                    String value = cookie.getValue();
                    lastVisitTime = URLDecoder.decode(value, "UTF-8");
                    break;
                }
            }
        }
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        String format = simpleDateFormat.format(date);
        String encode_format = URLEncoder.encode(format, "UTF-8");
        Cookie lastvisitCookie = new Cookie("lastVisitTime", encode_format);//同名会被覆盖
        lastvisitCookie.setMaxAge(60*60*24);
        response.addCookie(lastvisitCookie);
        if (isFirstVisit) {
            writer.println("您好,欢迎首次访问");
        } else {
            writer.println("欢迎回来,您上次访问的时间为:" + lastVisitTime);
        }
        writer.close();
    }
}

六、Cookie 获取范围有多大?

假设在同一 tomcat 服务器中,部署多个web项目(比如本机tomcat/webapp下面有两个应用:webapp_a和webapp_b),那么多个项目中 Cookie 能不能共享数据?

● 默认 Cookie 不能共享数据(正常的cookie只能在一个应用中共享,即一个cookie只能由创建它的应用获得。)

● 但可以用 setPath(String path) 设置Cookie路径来实现共享

  • 若在webapp_a下面设置cookie的时候,增加一条cookie.setPath("/");或者cookie.setPath("/webapp_b/"); 就可以在webapp_b下面获取到webapp_a设置的cookie了。
  • 最简单还是设置 cookie.setPath("/")(解释:此处的参数,是相对于应用服务器存放应用的文件夹的根目录而言的(比如tomcat下面的webapp),因此cookie.setPath("/");之后,可以在webapp文件夹下的所有应用共享cookie)

不同 tomcat 服务器间,如何共享 Cookie 数据?

  • 使用 setDomain(String path) 设置一级域名相同,即可共享
  • 使用实例:setDomain(".baiud.com")

以上内容了解即可,如果感兴趣可以多搜搜其他博客看看~ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/581378.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python —— 模块、包

一、模块和包 1. 模块module 模块是 Python 程序架构的一个核心概念。Python中模块就是一个.py文件,模块中可以定义函数,变量,类。模块可以被其他模块引用 1.1. 创建模块文件 创建文件:utils.py # 定义变量 name 张三# 定义函…

Qt绘图与图形视图之场景、视图架构的简单介绍

往期回顾 Qt绘图与图形视图之绘图技术知识点的简单介绍-CSDN博客 Qt绘图与图形视图之常见图形、路径、文字、图片的绘制介绍-CSDN博客 Qt绘图与图形视图之移动鼠标手动绘制任意多边形的简单介绍-CSDN博客 Qt绘图与图形视图之场景、视图架构的简单介绍 一、GraphicsView 1、存…

项目部署总结

1、安装jdk 第一步:上传jdk压缩安装包到服务器 第二步:将压缩安装包解压 tar -xvf jdk-8uXXX-linux-x64.tar.gz 第三步:配置环境变量 编辑/etc/profile文件,在文件末尾添加以下内容: export JAVA_HOME/path/to/j…

12:HAL----I2C

目录 一:I2C通信协议 1:I2C简历 2:硬件电路 3:I2C时序基本单元 A : 开/ 终条件 2:发送一个字节 3:接收一个字节 4:应答机制 4:I2C时序 1:指定地址写 2:当前地址读 3: 指定地址读 二:HAL库 A:轮询方式 B:中断方式 三:案例 A:轮询方式-…

代码随想录算法训练营第12天:滑动窗口和前缀和

代码随想录算法训练营第12天:滑动窗口和前缀和 这里我参考了西法的博客, 467. 环绕字符串中唯一的子字符串(中等)795. 区间子数组个数(中等)904. 水果成篮(中等)992. K 个不同整数的子数组(困难)1109. 航班预订统计(中等) 前四…

第G9周:ACGAN理论与实战

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 由于ACGAN的原理在上一篇文章中已经很详细的解释过了,这次我们直接上代码 一、代码解读 import argparse import os import numpy as npimport t…

视频批量下载工具

1、功能演示 该工具实现了某个人主页视频批量下载,最多支持一次下载50个视频,这50个选取的是最新发布的50个视频,视频为高清的1080p,并直接将视频保存到本地。 2、软件使用介绍 2.1 解压 拿到工具软件后,首先是对软件…

什么是外汇爆仓?怎样避免?

外汇爆仓是指当交易者的保证金低于特定比例时,经纪商会自动平仓一个或所有的开仓头寸。避免外汇爆仓的关键在于合理配置资金、设置止损、适度交易、顺势而为以及调整心态。 外汇爆仓是外汇交易中的一种风险控制机制。当交易者的账户净值低于已用保证金的特定比例时&…

AI图书推荐:《企业AI转型:如何在企业中部署ChatGPT?》

Jay R. Enterprise AI in the Cloud. A Practical Guide...ChatGPT Solutions (《企业AI转型:如何在企业中部署ChatGPT?》)是一本由Rabi Jay撰写、于2024年由John Wiley & Sons出版的书籍,主要为企业提供实施AI转型…

【网络安全】00后程序员,找 Bug 赚了 6,700,000元!他是怎么做到的?

1. 漏洞赏金计划(Bug Bounty Programs) 2. 安全咨询服务 3. 安全培训和教育 4. 写作和发表研究 5. 参与安全竞赛(CTFs) 6. 开发和销售安全工具 在网络安全领域,通过合法的方式利用漏洞赚钱主要涉及以下几种方法。…

【服务器部署篇】Linux下Tomcat安装和配置

作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是,产…

记录一次 vue3 + ele pls 改写 饿了么主题色实践

一、改写 element 主题色 在 main.ts 中引入需要改写的 scss 文件 main.ts: import ./styles/element-plus.scss在自定义的 element-plus.scss 文件中改写 ele pls 的变量 element-plus.scss: /** * 更改主题色 */ :root {--el-color-primary: #285fbb; // 主…

python使用opencv对图像的基本操作(3)

17.颜色空间的转换 17.1.rgb图像转gray图像 from skimage import io,color img io.imread(lbxx.jpg) img_gray color.rgb2gray(img) #将rgb图像转换成gray图像 io.imshow(img_gray)运行结果: 17.2.rgb图像转hsv图像 from skimage import io,color img io.im…

网红大佬的面子,高阶智驾的里子 | 2024北京车展

相关阅读:2023北京车展 《没有争奇斗艳的车模,只有往死里卷的智能汽车》。 文|刘俊宏 李想、李斌绑定“车圈新顶流”雷军互相抬轿子,红衣大叔周鸿祎高情商点评各家汽车新品...... 为了流量,今年车企大佬们比任何时候…

volatile的相关知识点

volatitle这个关键字,不管是在Java还是在C中都有使用到,但是在两种语言中,由于编译器的原因,他们存在一点点区别。 C中的volatile关键字 在C中volatile主要用于告诉编译器,这个变量的值可能会意外改变 ,例如被硬件或者…

力扣刷题 62.不同路径

题干 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径? …

HertzBeat:一款开源实时监控告警系统,简直太好用了!

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

训练营第三十六天动态规划(基础题part2)

训练营第三十六天动态规划(基础题part2) 62.不同路径 力扣题目链接 题目 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&am…

企业计算机服务器中了rmallox勒索病毒怎么办,rmallox勒索病毒解密流程

对于众多的企业来说,通过网络开展各项工作业务已经成为常态,网络为企业的生产运营提供了极大便利,也大大加快了企业发展的步伐,但众多企业越来越重视企业发展中的核心数据安全问题。近期,云天数据恢复中心接到众多企业…

Linux的学习之路:21、线程(1)

摘要: 本章说一下线程 目录 摘要: 一、回忆一下 二、如何理解线程 三、命令行看线程 四、利用函数进行使用 五、本章总结 1、线程的优点 2、线程的缺点 3、线程的异常 4、线程的用途 一、回忆一下 1、exe就是一个文件 2、我们的可执行程序…