一篇文章搞懂Cookie

news2024/10/2 6:36:18

目录

1 什么是Cookie

2 创建Cookie

3 浏览器查看Cookie

3.1 浏览器查看Cookie的第一种方式

3.2 浏览器查看Cookie的第二种方式

4 获取Cookie

5 修改Cookie

6 Cookie编码与解码

6.1 创建带中文Cookie

6.2 读取带中文Cookie

6.3 获取中文Cookie请求效果

6.4 解决创建和获取中文Cookie

7 Cookie优点和缺点

7.1 Cookie优点

7.2 Cookie缺点


1 什么是Cookie

Cookie是在浏览器访问Web服务器的某个资源时,由Web服务器在HTTP响应消息头中附带传送给浏览器的一小段数据。

一旦Web浏览器保存了某个Cookie,那么它在以后每次访问该Web服务器时,都应在HTTP请求头中将这个Cookie回传给Web服务器。

一个Cookie主要有标识该信息的名称(name)和值(value)组成。

2 创建Cookie

//设置Cookie
 Cookie cookie = new Cookie("username", "zhangsan");

/*
*设置Cookie存活时间,在浏览器内存中的保存时间,单位为秒,
*   正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除
*   负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁
*   零:删除对应Cookie
*/
cookie.setMaxAge(60);

//设置Cookie的访问路径
cookie.setPath("/webProject05_war_exploded/GetCookieValueServlet01");

//发送Cookie到客户端
response.addCookie(cookie);

 

3 浏览器查看Cookie

3.1 浏览器查看Cookie的第一种方式

3.2 浏览器查看Cookie的第二种方式

 

4 获取Cookie

//获取所有Cookie
Cookie[] cookies = request.getCookies();

//遍历数组,获取所有的Cookie
for (Cookie cookie : cookies) {
    System.out.println(cookie.getName() + "-" + cookie.getValue());
}

System.out.println("----------------------------------------");

//遍历数组,获取指定的Cookie
for (Cookie cookie : cookies) {
   if (cookie.getName().equals("username")) {
      System.out.println(cookie.getName() + "-" + cookie.getValue());
   }
}

 

5 修改Cookie

只需要保证Cookie的名称和路径一致即可修改

注意:如果改变cookie的name和有效路径,会新建cookie,而改变cookie值、有效期会覆盖原有cookie

 //设置Cookie,如果改变cookie的name和有效路径,会新建cookie,而改变cookie值、有效期会覆盖原有cookie
Cookie cookie = new Cookie("username", "lisi");

/*
*设置Cookie存活时间,在浏览器内存中的保存时间,单位为秒,
*   正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除
*   负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁
*   零:删除对应Cookie
*/
cookie.setMaxAge(30);

//设置Cookie的访问路径
 cookie.setPath("/webProject09_war_exploded/GetCookieValueServlet01");

//发送Cookie到客户端
response.addCookie(cookie);

6 Cookie编码与解码

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

  • 编码可以使用java.net.URLEncoder类的encode(String str,String encoding)方法

  • 解码可以使用java.net.URLDecoder类的decode(String str,String encoding)方法

6.1 创建带中文Cookie

package com.cxyzxc.www.servlet01;

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

@WebServlet(name = "CookieServlet03", value = "/CookieServlet03")
public class CookieServlet03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求参数的编码格式,这种方式对get请求方式无效
        request.setCharacterEncoding("UTF-8");
        //设置响应编码格式为UTF-8
        response.setContentType("text/html;charset=UTF-8");

        //Cookie默认不支持中文,只能包含ASCII字符,所以Cookie需要对Unicode字符进行编码,否则会出现乱码
        Cookie cookie = new Cookie("姓名", "张三");

        //设置Cookie的访问路径
        cookie.setPath("/webProject09_war_exploded/GetCookieValueServlet03");

        //发送Cookie到客户端
        response.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

6.2 读取带中文Cookie

package com.cxyzxc.www.servlet01;

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

@WebServlet(name = "GetCookieValueServlet03", value = "/GetCookieValueServlet03")
public class GetCookieValueServlet03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求参数的编码格式,这种方式对get请求方式无效
        request.setCharacterEncoding("UTF-8");
        //设置响应编码格式为UTF-8
        response.setContentType("text/html;charset=UTF-8");

        //获取所有Cookie
        Cookie[] cookies = request.getCookies();

        //遍历数组,获取所有的Cookie
        for (Cookie cookie : cookies) {
            System.out.println(cookie.getName() + "-" + cookie.getValue());
        }

        System.out.println("----------------------------------------");

        //遍历数组,获取指定的Cookie
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals("姓名")) {
                System.out.println(cookie.getName() + "-" + cookie.getValue());
            }
        }

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

6.3 获取中文Cookie请求效果

 

6.4 解决创建和获取中文Cookie

6.4.1 创建中文Cookie

package com.cxyzxc.www.servlet01;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;

@WebServlet(name = "CookieServlet04", value = "/CookieServlet04")
public class CookieServlet04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求参数的编码格式,这种方式对get请求方式无效
        request.setCharacterEncoding("UTF-8");
        //设置响应编码格式为UTF-8
        response.setContentType("text/html;charset=UTF-8");

        //Cookie默认不支持中文,只能包含ASCII字符,所以Cookie需要对Unicode字符进行编码,否则会出现乱码
        Cookie cookie = new Cookie(URLEncoder.encode("姓名","UTF-8"),URLEncoder.encode("张三","UTF-8"));

        //设置Cookie的访问路径
        cookie.setPath("/webProject09_war_exploded/GetCookieValueServlet04");

        //发送Cookie到客户端
        response.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

 

6.4.2 获取中文Cookie

package com.cxyzxc.www.servlet01;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;

@WebServlet(name = "GetCookieValueServlet04", value = "/GetCookieValueServlet04")
public class GetCookieValueServlet04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求参数的编码格式,这种方式对get请求方式无效
        request.setCharacterEncoding("UTF-8");
        //设置响应编码格式为UTF-8
        response.setContentType("text/html;charset=UTF-8");

        //获取所有Cookie
        Cookie[] cookies = request.getCookies();

        //遍历数组,获取指定的Cookie
        for (Cookie cookie : cookies) {
            if (URLDecoder.decode(cookie.getName(),"UTF-8").equals("姓名")) {
                System.out.println(URLDecoder.decode(cookie.getName(),"UTF-8") + "-" + URLDecoder.decode(cookie.getValue(),"UTF-8"));
            }
        }

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

6.4.3 获取中文Cookie请求效果

 

7 Cookie优点和缺点

7.1 Cookie优点

  • 可配置到期规则

  • 简单性:Cookie是一种基于文本的轻量结构,包含简单的键值对

  • 数据持久性:Cookie默认在过期之前是可以一直存在客户端浏览器上的

7.2 Cookie缺点

  • 大小受到限制:大多数浏览器对Cookie的大小有4K、8K字节的限制

  • 用户配置为禁用:有些用户禁用了浏览器或客户端设备接收Cookie的能力,因此限制了这一功能

  • 潜在的安全风险:Cookie可能会被篡改。会对安全性造成潜在风险或者导致依赖于Cookie的应用程序失败

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

grafana9 使用消息模板配置发送企业微信(wecom)

一、grafana9告警设置: 1、进入告警消息模板介面 2、grafana 消息模板设置 template name : API_msg_tpl #名字随便 {{ define "myalert" }} **警报时间:** {{ .StartsAt.Format "2006-01-02 15:04:05 " }} {{ if gt (len .Labels) 0 }}**…

毕业5年,从月薪3000到年薪40w,我掌握了那些核心技能?(建议收藏)

大家好,我是静静~~是一枚一线大厂的测试开发工程师很多读者私信问我,自己时间不短了,随着工作年限的不断增长,感觉自己的技术水平与自己的工作年限严重不符。想跳槽出去换个新环境吧,又感觉自己的能力达不到心仪公司的…

Python_pytorch

python_pytorch 小土堆pytotch学习视频链接 from的是一个个的包(package) import 的是一个个的py文件(file.py) 所使用的一般是文件中的类(.class) 第一步实例化所使用的类,然后调用类中的方法(def) Dataset 数据集处理 import os from PIL impo…

本地(window)使用alist和RaiDav网盘挂载

一、背景 百度网盘的限速可能会让你转战阿里云盘,但是阿里云盘的缺点在于不能分享,网络上的资源都是通过各类网盘来分享的,这样就会让你可能同时拥有不同网盘的账号。 那么我们有没有一款工具,可以将这些网盘资源聚合一下&#xf…

RMQ--区间最值问题(在更)

RMQ(Range Minimum/Maximum Query)RMQ解决的问题ST算法 O(nlogn)线段树例题数列区间最大值最敏捷的机器人天才的记忆Frequent values总结(ST和线段树对比)RMQ解决的问题 RMQ是一个解决多个区间最值查询的算法,即区间最值查询&…

MySQL 创建数据表

在创建数据库之后,接下来就要在数据库中创建数据表。所谓创建数据表,指的是在已经创建的数据库中建立新表。 创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性(包括实体完整性、引用完整性和域完整性&#xff09…

LwIP系列--线程通信消息结构

一、目的如果有小伙伴移植过LwIP,那么你肯定知道在LwIP源码中tcp/ip协议栈是作为一个单独的线程运行的,那么就有这样一个问题,我们从mac外设上收到的以太网数据包是如何交给tcp/ip线程进行处理的,用户发送的数据又是如何经过协议栈…

不学Python迟早会被淘汰?Python真有这么好的前景?

最近几年Python编程语言在国内引起不小的轰动,有超越Java之势,本来在美国这个编程语言就是最火的,应用的非常非常的广泛,而Python的整体语言难度来讲又比Java简单的很多。尤其是在运维的应用中非常的广泛,所以之前出了…

Ubuntu20.04无线网卡驱动安装

文章目录一.未安装无线网卡驱动的Ubuntu20.04联网方式二.Ubuntu20.04无线网卡驱动安装UbuntuU盘启动盘安装好Ubuntu 20.04之后,发现没有无线网络,不过有线可以用。一.未安装无线网卡驱动的Ubuntu20.04联网方式 比较简单的就是直接拉一条网线进行连接&am…

【C语言】宏定义 结构体 枚举变量的用法

目录 一、数据类型 二、C语言宏定义 三、C语言typedef重命名 四、 #define与typedef的区别 五、结构体 六、枚举变量 补充学习一点STM32的必备基础知识 一、数据类型 二、C语言宏定义 关键字:#define 用途:用一个字符串代替一个数字,…

214 情人节来袭,电视剧 《点燃我温暖你》李峋同款 Python爱心表白代码,赶紧拿去用吧

大家好,我是徐公,六年大厂程序员经验,今天为大家带来的是动态心形代码,电视剧 《点燃我温暖你》同款的,大家赶紧看看,拿去向你心仪的对象表白吧,下面说一下灵感来源。 灵感来源 今天&#xff…

2023-02-10 - 6 聚合

当用户使用搜索引擎完成搜索后,在展示结果中需要进行进一步的筛选,而筛选的维度需要根据当前的搜索结果进行汇总,这就用到了聚合技术。聚合的需求在很多应用程序中都有所体现,例如在京东App中搜索“咸鸭蛋”,然后单击搜…

简述操作系统的系统中断

系统中断 系统中断是指 CPU 对系统发生的某个事件做出的一种反应:CPU 暂停正在执行的程序,保留现场后转去执行相应的处理程序,处理完该事件后再返回断点继续执行被打断的程序。 中断可以避免 CPU 轮询等待某条件成立,减小系统开…

2023-02-10 - 5 文本搜索

与其他需要精确匹配的数据不同,文本数据在前期的索引构建和搜索环节都需要进行额外的处理,并且在匹配环节还要进行相关性分数计算。本章将详细介绍文本搜索的相关知识。 本章首先从总体上介绍文本的索引建立过程和搜索过程,然后介绍分析器的…

离子阱量子计算机

1.新闻 2020年6月,科技制造企业霍尼韦尔(Honeywell)发布第一台离子阱量子计算机H0,它拥有64量子体积,它是IBM和谷歌同时期量子计算机的两倍。公司表示之所以能取得这一成就缘于他们2015年在一篇科学论文中展示的量子电…

Docker 容器与容器云读书笔记(一)

最近都没时间看书,闲暇之余看看书,写写笔记,记录一下这难得的时光。 docker容器的出现 2013年初, 一个名字从云计算领域横空出世,并在整个IT行业激起千层浪,这就是Docker。Docker选择容器作为核心和基础&…

与六年测试工程师促膝长谈,他分享的这些让我对软件测试工作有了全新的认知~

不知不觉已经从事软件测试六年了,2016年毕业到进入外包公司外包给微软做软件测试, 到现在加入著名的外企。六年的时间过得真快。长期的测试工作也让我对软件测试有了比较深入的认识。但是我至今还是一个底层的测试人员,我的看法都比较狭隘&am…

知识点滴 - 电源适配器接头的极性

使用各种电子设备,肯定要使用到电源适配器(adapter)。在电源适配器的标签上面一般会有几项是需要注意的。第一,是adapter的“INPUT/输入”,在中国通用的一般是AC100-240V~50-60Hz,这说明这个adapter可以在100V-240V的交流电压下面…

自动驾驶过冬,需要点燃“降本增效”的炉火

进入2023年,人们还在等待这个冬天的第一场雪,同时也在感叹暖冬已经成为了新的常态。但对自动驾驶产业而言,这个冬天似乎并没有那么暖。回顾2022年,全球自动驾驶行业裁员、倒闭、部门裁撤的消息不绝于耳。资本市场也逐渐放弃了自20…

流浪气球?ChatGPT这样回答,我惊了

近日,流浪地球电影反响热烈,“流浪气球”事件讨论热火,连人工智能ChatGPT都发表了 “自己”的看法,到底是怎么一回事呢?起因是我国一只民用气球,因技术和天气原因不小心飘到了米国上空,对方当时…