00:00
我们来学习绘画与状态管理。首先呢,我们来看一个问题。有一个前提呢,是说HTP协议是一个无状态的协议。什么叫无状态的协议呢?Web服务器本身不能够识别出哪些请求是由同一个浏览器发出的,浏览器的每一次请求都是完全孤立的。浏览器发了一个请求啊,再发一个请求,我服务器无法识别出,这两个请求是由同一个浏览器发出的。这是一个前提,那现在的话呢,就是出现问题了是吧,我们如何去实现购物车呢?购物车我们都在网上买过东西,买东西的时候怎么了啊?我买一个东西放到我的购物车里边,我再买一个,你还得放我这个车里边儿吧,你不能放别,你不能放别人的车里边儿,那我如何实现对用户的跟踪呢?
01:14
所以说我们要求就是作为外部服务器,必须能够采取一种机制来唯一的识别一个用户,并且记录该用户的状态。情况是,HTP协议是无状态的协议。服务器无法识别出哪些请求是由同一个浏览器发出的。要求是必须识别,所以说我们需要采取一些额外的方案,这个方案的话呢,就是我们讲到的这个,呃。绘画与状态管理。会话与会话状态web应用中的会话指的是一个客户端浏览器跟web服务器之间连续发生的一系列的请求和响应过程,这就叫一次会话,就是我登录到那个网站,然后直到哎,我点这个嗯,关闭,把浏览器关了,整个这一个过程称之为一个会话,就好像我们说把电话拿起来一直到挂断是一次会话一样。
02:32
外部应用的会话状态指的是web服务器跟浏览器在会话过程中产生的状态信息。借助于这个会话状态,外部服务器能够把属于同一会话中的一系列请求跟响应关联起来,我们靠什么呀?我们要靠这个会话状态把同一个绘画里边的一系列请求和响应给它关联起来。那具体实现的方式有几种呢?有两种,一种叫cookie,一种叫session。在so规范里边,我们可以用两种方式来实现规划分钟,一个叫cookie,一个叫session。
03:13
那我们来看一个概述吧,说呀。Web服务器要从大量的请求里边区分出哪些请求属于同一个会话。我外部服务器的话呢,我在同一个时刻可以接收若干个请求,我如何才能够识别出啊?你的这个请求是由你的浏览器发出的呢?我如何识别?当然我需要在这个请求的后边加上一个标识,这个标识号我们称之为绘画ID,也叫session ID。就这样识别。比如说我再发一个请求的时候,我要看。嗯。你的这个绘画ID是多少?如果绘画ID要是一样的话,OK,来自于同一个浏览器,如果绘画ID不一样的话,就来自另外的浏览器,都这个意思。那两种方案一种叫cookie,一种叫session,我们先说说这个cookie机制,Cookie翻译过来啥意思啊?
04:21
Cookie叫点心。Cookie是什么呢?Cookie是服务器送给浏览器的一个典型。叫cookie cookie机制采用的是在客户端保持HTP状态信息的方案。cookie是在浏览器访问外部服务器的某个资源时,由外部服务器在aptb响应口里边附带的送给浏览器的一个小的文本文件,这个文本文件的话呢,我们一会儿我们能看见。他是。服务器给浏览器的一个小版本文件,怎么给的呢?并不是下载哈,而是显像头里边附带的,那一旦外部服务器保存了某个cookie,那下次怎么样,我给你的话不是白给的啊,相当于相当是一个相当于是一个间隙,我下一次再请求的时候,我就会自动的把它给带回来。
05:24
再说一遍,我web服务器给过浏览器,如果浏览器没禁用cookie的话,下一次再发的时候就把这个cookie给传回来,那如此就可以保持啊,一来一往的过程。底层直线原理,我们实际上是在显显像头里边有一个set cookie显像头,然后呢,请求里有一个cookie,请求头一会儿我们会看见这个set cookie跟cookie,那cookie只能标示一种信息,因为这cookie啊,Cookie不是map map只有很多个键值,对cookie只有一个name和一个value。
06:09
我们来看这样的一个图,Cookie存储区,浏览器,外网服务器,我发一个请求。第一次发的时候。在我们的这个,嗯,浏览器的这个储存区里边没有cookie,所以说第一次访问不带cookie,然后的话呢,我服务器第一次的时候什么呢?我给你一个cookie,因为我给到他了,然后呢,我就把这个文本文件呢,写到这个cookie的存储区里边,它有可能是在内存里边,也有可能真的是一个文本文件,我下一次再发请求的时候怎么了,我就把它带上了。这就是一来一榜的这个过程,就是我第一次请求的时候啊,没有cookie啊,直接过来空的,然后呢,服务器给了浏览器一个cookie,然后我接收了,我就放到这个储存区了,是吧,第二次再访问的时候,我就自动的给他带上了,所以说呀,没有什么,没有免费的午餐是吧,我给你一个东西,它一定是有原因和意义的。
07:28
那我们看看吧。新建一个JSP cookie JSP。这账号web里边的话呢,我们使用什么来表cookie啊,我们就是用cookie代表说cookie这话有点有点烂啊。带拉。怪罪传中。使用cookie这个位来代表cookie好了,下面怎么办呢?下面我实际上就是用这个来进行编程就可以了,那我们首先不骤分。
08:18
第一个步骤,要创建一个。对,大家看啊,大家干什么呢。我在这块创建这个cookie的话,我目前我是JSP吧,JSP是客户端呢还是服务端呢。JSPJSP是部署到服务器上的吧,只有你访问的时候,我这个JSPJSP才会运行吧,我这里边放的是一些Java代码吧,所以说这个是服务端出现一个cookie,第二步呢说哎,调用啊,Response的一个方法啊。
09:07
传给客户,对,就是这个流程,我们可以通过工具看到整个这个流程,那我首先呢,我为了不让那个session里边又一个cookie哈,那个打扰我们的话呢,我让这个session等于false,就是说我不创建session这项,因为我跟踪这个session呢,用的也是cookie。好了,你看它有一个cookie。Cookie等于cookie。他需要一个什么呀,创建cookie的时候的话呢,我需要一个剑指,对,就是那个名。喂。
10:00
啊。变个名好了,我们写一个来。Name,你就写个name吧,值。写好写好之后的话呢,我说我把这个cookie啊给你传回去,那我一定知道response的一个方法,Response点。爱的我加一个对吧?写完这么简单,好了,我们来访问一下。复制我们看这个啊。这个呢也有一个工具。
11:01
开发者工具等一下。网络开支不惑。cookie.m。大家看这是一个什么呀,这是一个get请求,我们看响应。请求里边大家看请求里边的话呢,第一次请求怎么样,是没有cookie的吧,没有很响应。是不是有个cookie啊?那自个写的吧,叫晒cookie剪像头名叫name,值是爱飞骨吧。好了,注意,我第二次发请求。这是第一次的哈,这是第一次的,我第二次发请求看着。第二次发请求生书,是不是会把这个cookie带过来呀?哎,这就是cookie的核心机制。
12:02
核心机制呢,在这儿呢,这个图呢,再看一遍,再看一遍,说我有一个酷比储存区,在我第一次访问服务器的时候,我酷比储储存区里边啥也没有,所以说我就一个。空的就过去了是吧,然后呢,服务器给我一个cookie,第二次我会把这个cookie带回去,就是cookie的机制。好,我们刚才我们通过这个,呃,浏览器,通过IE的这个开发者工具的话呢,我们也看到了这个流程,那我下一次我每一次访问他都会来带这个cookie,因为这个cookie你已经接收了,我复制再看一遍。
13:03
网络开始补货过来。大家看这个时候的话呢,请求里边并没有那个cookie,那个请求头,好了,我请求现在这个页面的话呢,已经给我响应了,看响应里边有一个cookie叫set cookie给到我了,给到我之后我再一次访问的话。我将把这个cookie给带回去。这就是。最最核心的一个机制,只要你给我下一次,我就会自动的把它带回去,OK,我们看一下cookie的这些APIAPI呢提供了一个cookie类来封成cookie信息,它含有生成cookie信息和提取cookie信息的各种属性和方法,构造器获取名字设置value max age get markx edge,这个pass的话呢,我们一会儿我们再说,然后呢绿response有一个方法就ADD cookie可以把它。
14:10
嗯,发送给浏览器。当然我们是怎么样,是通过增加一个set cookie显像头的方式,然后request有一个方法请求嘛,我可以来获取cookie,然后呢,从请求里边得到这个cookie信息,OK,那现在我不但能够嗯往回送,我还可以来获取,而且把这个cookie给它打印出来,那我们看一下。来。是另外的了哈,叫获取库品。获取怎么获取呢?request.get。Cookies cookies,我只能够获取所有的cookie,然后从这里边找到我感兴趣那个,我没有办法去获取某一个cookie来。
15:06
Cookies等于cookies。宿主。好,我if做一个判断,说if cookies。不等于,那而且cookies。点认大于一,那我就给他一个一个打一下。Cookie。不,IE与奥prince。cookie.get name加cookie.get value好了,然后的话呢,再打一个边。
16:07
这个刚才我们看到了,表示先出掉了。奥点第二。保存完了行了,那如果如果要是没有cookie呢,那我就创建一个cookie给你返回去,CTRLXR为dot alt点说诶。没有一个cookie。没有一个cookie正在创建并返回行。看吧,是创建,这是传给客户端,这个呢是获取cookie,然后的话呢,获取cookie的名字和value,二获取。
17:12
Cookie的name和value写完IE啊,里边只有一个名和一个值,好了,我这样写完之后,它是个什么情况呢?我们还是来访问这个页面复制,我还是来这个来说事。我刚才有一个了是吧。复制删掉。网络开始捕货。大家看是没有第一次问一下。
18:03
快第二次怎么还没有?我不说给他一个吗?嗯。我。大于零是吧,就错了,保存。啊,就是啊,这个值的话,我们可以获取到了,第二次就可以获取到啊,啊这个时候就可以获取了,这就是我们整个库的这个最简单的API。好,那就是如何来进行这个回送一个cookie,如何来获取cookie,而且打印name和value。嗯。Cookie的发送。默认情况下的话呢,它是一个会话级别的cookie,就是什么呀,这个时候这个cookie呢,会保存在浏览器的内存里边,用户退出浏览器之后就被删除了,那现在我们就是这个情况,你看当我。
19:12
复制关掉以后就没有了。再开。那就不看了哈。没有,我再刷新一次才有。哎,默认它是一个绘画级别的,我关掉之后的话呢,它就没有了,那我们怎么办,我们现在的话呢,我们希望他他有。就是说它是一个持久化的cookie,而不是一个绘画级别的cookie。一会儿我们会到下一页,我们会来说这个事啊,这块我们说完。说如果希望cookie存在这个磁盘上呢?我们需要来调这个max age,方法就是那这个cookie存活多长时间?给出一个以秒为单位的时间,将最大时效设为零的话,则是让浏览器立即删除该cookie。这块平上有一个方法,Cookie set mark age。
20:20
在这呢,哎,整个这个参数是什么意思的话呢,这块有比较清楚的这个介绍,这不是吗?如果要是接的话,表示立即被。删除,如果要是一个正数的话,说明什么呀?就是在呃这个呃,Cookie。存在的这个秒数是负数的话,表示这个cookie永远也不会被储存。好,先回来你看它哈,说发生cookie呢,我们需要调用类response,的as cookie方法,将cookie插入到一个size cookie显示头里边,这个我们已经看到了。嗯。来,我们来看一下这个,呃,叫持久化,那绘画cookie呢。
21:08
只会在内存里边,浏览器一关就没了,如果你希望这个cookie能够保存到硬盘上,就是说再往下一次。打开浏览器的时候还能够获取到,还能获取到它的话,我们怎么样得让他设置一个最大的有效时间,我写一个大家看一下啊。哎,后点s max以秒为单位,我存在30秒。保存。当然这里边儿的话呢,有一个信息需要我们设哪个。Internet选项退出时删除记录,这个不能再挑上了啊,确定。
22:03
回来我首先的话呢,这条我们去掉,我们还是看我们以前这个信息这个样子回来没有。这个有了。关掉会话结束,开心的。还是没有再刷一次,有了好了,我希望什么呢?我希望诶,我设一个max再看。关掉再开。没有刷新有了,好了,这个时候怎么了?是故最大时间是不是30秒啊,这个时候我把它关掉,我再开它就会存活30秒。
23:09
是不是有了呀,这不是缓存哈,一刷就有了,因为怎么样,这个时候的话呢,它有一个最大的一个时效,哎,它可以离最后一次访问时间的这个,嗯,活动时间是30秒,这个时候你刷的话。反正过期了啊啊啊,好了,这个时候你复制再看。嗯。可以有。这是有的哈,好了,你等过30秒之后,你再访问它就没有了,好回来,这就是什么?这就是我们所谓的叫持久化cookie,那持久化cookie的话什么呢?你只要设置一个set mark age就可以了,我们来说一下这个方法。
24:02
将set maxage设置cookie的最大。实小,然后什么以秒为单位说,若为零。注意哈,如果为零的话,表示。立即删除back cooking。在。洛维。复数表示不存储。该cookie落落为正数。
25:10
表示该。Cookie的存储时间以秒为单位,哎,这就是我们的set markage方法,那好了,那cookie最核心的API的话呢,都在这。都有什么呀,创建一个cookie啊,把一个cookie回传给客户端浏览器,然后呢,设置cookie的最大时效,以及如何来获取cookie这块的话,我们还讲到了一个哈,说如果把这个cookie这个最大时效设为零的话,表示表示立即删除这个cookie。回来。读取,我们刚才已经看到了读取这个唯一让我们比较遗憾的是什么呀?我们只能对数组进行便利循环,通过这样的方式找到我们感兴趣的那个cook。
26:07
这是让我们感觉有点不方便的地方。
我来说两句