会话技术

今日目标

2,Cookie

学习Cookie,我们主要解决下面几个问题:

2.1 Cookie的基本使用

1.概念

==Cookie==:客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问。

2.Cookie的工作流程

1629386230207

3.Cookie的基本使用

对于Cookie的使用,我们更关注的应该是后台代码如何操作Cookie,对于Cookie的操作主要分两大类,本别是==发送Cookie==和==获取Cookie==,对于上面这两块内容,分别该如何实现呢?

3.1 发送Cookie

介绍完发送Cookie对应的步骤后,接下面通过一个案例来完成Cookie的发送,具体实现步骤为:

需求:在Servlet中生成Cookie对象并存入数据,然后将数据发送给浏览器

1.创建Maven项目,项目名称为cookie-demo,并在pom.xml添加依赖

2.编写Servlet类,名称为AServlet

3.在AServlet中创建Cookie对象,存入数据,发送给前端

4.启动测试,在浏览器查看Cookie对象中的值

(1)创建Maven项目cookie-demo,并在pom.xml添加依赖

(2)编写Servlet类,名称为AServlet

(3)在Servlet中创建Cookie对象,存入数据,发送给前端

(4)启动测试,在浏览器查看Cookie对象中的值

访问http://localhost:8080/cookie-demo/aServlet

chrome浏览器查看Cookie的值,有两种方式,分布式:

方式一:

1629389317463

方式二:选中打开开发者工具或者 使用快捷键F12 或者 Ctrl+Shift+I

1629390237936

3.2 获取Cookie

介绍完获取Cookie对应的步骤后,接下面再通过一个案例来完成Cookie的获取,具体实现步骤为:

需求:在Servlet中获取前一个案例存入在Cookie对象中的数据

1.编写一个新Servlet类,名称为BServlet

2.在BServlet中使用request对象获取Cookie数组,遍历数组,从数据中获取指定名称对应的值

3.启动测试,在控制台打印出获取的值

(1)编写一个新Servlet类,名称为BServlet

(2)在BServlet中使用request对象获取Cookie数组,遍历数组,从数据中获取指定名称对应的值

(3)启动测试,在控制台打印出获取的值

访问http://localhost:8080/cookie-demo/bServlet

1629391020081

在IDEA控制台就能看到输出的结果:

1629391061140

==思考:==测试的时候

这个问题,我们会在Cookie的使用细节中讲,大家可以动手先试下。

小结

在这节中,我们主要讲解了Cookie的基本使用,包含两部分内容

介绍完Cookie的基本使用之后,那么Cookie的底层到底是如何实现一次会话两次请求之间的数据共享呢?

2.2 Cookie的原理分析

对于Cookie的实现原理是基于HTTP协议的,其中设计到HTTP协议中的两个请求头信息:

1629393289338

接下来,使用刚才的案例,把上述结论验证下:

(1)访问AServlet对应的地址http://localhost:8080/cookie-demo/aServlet

使用Chrom浏览器打开开发者工具(F12或Crtl+Shift+I)进行查看==响应头==中的数据

1629393428733

(2)访问BServlet对应的地址`http://localhost:8080/cookie-demo/bServlet

使用Chrom浏览器打开开发者工具(F12或Crtl+Shift+I)进行查看==请求头==中的数据

1629393578667

2.3 Cookie的使用细节

在这节我们主要讲解两个知识,第一个是Cookie的存活时间,第二个是Cookie如何存储中文,首先来学习下Cookie的存活时间。

2.3.1 Cookie的存活时间

前面让大家思考过一个问题:

1629423321737

(1)浏览器发送请求给AServlet,AServlet会响应一个存有usernanme=zs的Cookie对象给浏览器

(2)浏览器接收到响应数据将cookie存入到浏览器内存中

(3)当浏览器再次发送请求给BServlet,BServlet就可以使用Request对象获取到Cookie数据

(4)在发送请求到BServlet之前,如果把浏览器关闭再打开进行访问,BServlet能否获取到Cookie数据?

==注意:浏览器关闭再打开不是指打开一个新的选显卡,而且必须是先关闭再打开,顺序不能变。==

针对上面这个问题,通过演示,会发现,BServlet中无法再获取到Cookie数据,这是为什么呢?

这个结论就印证了上面的演示效果,但是如果使用这种默认情况下的Cookie,有些需求就无法实现,比如:

1629423629887

上面这个网站的登录页面上有一个记住我的功能,这个功能大家都比较熟悉

所以我们现在就遇到一个难题是如何将Cookie持久化存储?

Cookie其实已经为我们提供好了对应的API来完成这件事,这个API就是==setMaxAge==,

参数值为:

1.正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除

2.负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁

3.零:删除对应Cookie

接下来,咱们就在AServlet中去设置Cookie的存活时间。

修改完代码后,启动测试,访问http://localhost:8080/cookie-demo/aServlet

1629424844041

2.3.2 Cookie存储中文

首先,先来演示一个效果,将之前username=zs的值改成username=张三,把汉字张三存入到Cookie中,看是什么效果:

启动访问测试,访问http://localhost:8080/cookie-demo/aServlet会发现浏览器会提示错误信息

1629425945465

通过上面的案例演示,我们得到一个结论:

Cookie不能存储中文,但是如果有这方面的需求,这个时候该如何解决呢?

这个时候,我们可以使用之前学过的一个知识点叫URL编码,所以如果需要存储中文,就需要进行转码,具体的实现思路为:

1.在AServlet中对中文进行URL编码,采用URLEncoder.encode(),将编码后的值存入Cookie中

2.在BServlet中获取Cookie中的值,获取的值为URL编码后的值

3.将获取的值在进行URL解码,采用URLDecoder.decode(),就可以获取到对应的中文值

(1)在AServlet中对中文进行URL编码

(2)在BServlet中获取值,并对值进行解码

至此,我们就可以将中文存入Cookie中进行使用。

小结

Cookie的使用细节中,我们讲了Cookie的存活时间存储中文: