00:00
刚才我们说到session和cookie之间还是有。很大的联系的。那么他们之间有什么联系呢?下面我们就来看一下session的工作原理,这是个理论性的东西,但是它很重要,面试的时候面试是比较多的。对他的面试啊是比较多的,为什么对这一个知识点的考察。就可以让你说出来。Session和cookie。这两大知识点,并且他们之间的关系你还得能说清,OK,我们来看啊,他说,在系统中。在我们服务器中啊,系统会为每一个绘画。维护一个session所谓维护一个session,就是创建一个session对象,不同的绘画对应不同的session。那么系统是如何区分?
01:03
各个session对象的呢?G,如何做到同一绘画过程中一直使用的是同一个三声对象呢?这什么意思呢?诶,我给大家演示一下啊,我们看看看看这个。大家看啊。啊。咱们这样。这是some solid,我把它也改一下,改成out。然后。在这儿我输出谁呢?Session?我把这个session输出一下。注意我这输出三啊,我这输出三烂,你注意这个print line啊,这print line,如果你上面设置了content type,这这个print line换行不换行不起作用,为什么。
02:08
设了count是test itl的话,那么它会按照itl对它进行解析。那就是说你要想换行得用那个BR,那在这儿你如果没有设置content type,那么在这这个print和print line,就是换和不换行它的区别啊,这是简单说这么一句啊,你自己可以测试一下,我在这不再多解释了,好大家看啊,看什么呢?我访问这个萨。我访问这个萨重新发布了是吧。这样关了它。也恩,不好,这样不好。还得重新输地址,输地址麻烦。
03:10
好,看着我这书,李四啊,提交。大家看我这儿提交了。记着这里四的这个啊,我把它拷贝下来。拷贝下来放哪儿呢?嗯,咱们这样,我新建一个。我新建一个啊。这是。这是我们,我们一会儿换个浏览器,换个浏览器啊,这是火狐浏览器的。这是火狐浏览器萨啊。
04:05
再来。啊,他读到了李四是吧。你看看。这两个session是同一个session,不是。是吧?这个是我们at session的实现类,由谁实现?这这个实现类我们不用管它,但是我们从这可以看到,这肯定是同一个对象对吧?好,现在我再换浏览器,换成什么呢?360。浏览器360浏览器啊。360浏览器。
05:02
走。张三,这个是张三走。看一下。你看这个和这个一样不一样。不一样嘛。这是不是两个对象对不对?为什么是两个对象,因为这是两个浏览器呀。是两个窗口,所以他这是两次绘画,这两个不同的绘画。但是大家看看啊。Other。你看看他,和他一样不一样。这是不是一样的呀。
06:02
你到底你说这个,到底想告诉我们什么呢?我想告诉大家的是。首先。绘画不一样,是不是创建的对象不一样啊?也就是这这句话。我们的服务器。服务器里边会为每个绘画维护一个session。不同的绘画对应不同的session。说明这个问题,这第一个第二个。这三呢,这在一个应用里边的。这都叫三神。那我想问的是,他为什么这儿啊?这一次,而且大家注意他访问的是不是单立的。你360浏览器访问的时候,是不是访问的这个sum对象。你火狐浏览器访问的是不是也是这个对象?
07:02
都是由这个对象创建的session。然后都是从other通过,然后从30秒读取数据,那我就有点不明白了,他为什么他不会读错了。你看我360里边。读的时候我是不是从这个soet里边读的数据,我火狐读的时候,火狐里边从三读的时候是从这个三神里边读的,他为啥不会弄串了360的读的是那个李四的。为啥他串不了呢?都叫session,它都是session。有同学说那对象不一样啊,那是啊,对象不一样。那他为什么他就读不错呢。
08:01
诶,这就是我们要讲的这个原理啊,我们要解释清楚为什么他读不错。就要解释这个问题,所以你要先明白我后边要讲什么,我讲的这个原理,塞的工作原理,讲什么东西呢?就讲他的。讲的就是我们的一个绘画。为什么他就能够一直找这一个session而找不错,因为而我们系统里边有多个session,他为什么找不错,我们要解决这个问题啊。那么三身的工作原理,我们从四点或者说四个步骤。来说。首先。第一步,写入三生列表。在这有个概念叫三生列表,什么东西?
09:02
他说,啊,当前应用中的session是以map的形式进行管理的。这样说更好,服务器对当前应用中的session是以map的形式进行管理的,这个map我们称为session列表,大家看,就这个。就是个map。这个map的key是一个32倍长度的随机串,大家看,这是一个32倍的随机串。这个随机串称为j session ID。J3JAVA3。ID啊。Value是session对象的引用。但引用说到对象的引用肯定是在是不是堆内存的对吧,它是在堆内存里边的啊he,那么。
10:08
这里边儿。这个K就是这个32位长度的。串value是session的引用。一个K。对一个value,一个K,对一个value,一个value就是一个引用。他们之间肯定是一对一的。当用户第一次提交请求的时候,服务端solid。会执行。那你第一次肯定要执行这个呀,是不是盖的三对吧,肯定是无餐的。肯定是无参,你要往里面放数据呢,对不对?会自动生成一个map entry对象,Map entry是什么?剑直队啊。是不是key,一个key一个value组合一块,就是个map的N垂对象,对吧?这是map的内部类key。
11:06
为一个根据某种算法生成的j session ID,而value则为新创建的IB session对象。诶,得先说啊,写入三神列表,就是当你请求到达的时候,我就先把这个32倍长度的随机串和新生成的。这个session对象给他写到。Session列表这个session这个map里边这第一步了啊,第二步就和CI有关系了。服务器生成并发送cookie。他说,在将session信息写入session列表以后,系统还会自动将j session ID作为name。这个32位长度的随机串作为value,以cookie的形式。
12:02
存放到响应报头中,然后并随着响应将这个cookie发送到客户端。也就是说,我们。发出这个请求以后。那个响应啊,他给我们那个响应里边是带有。Cookie,这个cookie是什么?是j session ID等于什么什么?就这一串,大家看,就这个东西。他带着这样一个东西。有吗?有这个东西吗?有没有?诶,我之前怎么没记得我们讲cookie的时候。没记得它里边有这个东西啊,那不错呀。这个东西有个前提啊,你得使用谁。Get session呢?那用这个方法,它才能生成这32倍长度的这个串,才能生成这个session对象,所以大家看我现在萨斯里有没有这个这句话呀,是不是有啊,有它就会形成这样一个响应。
13:13
那有没有,我们看一下呗。看着。I could be watch。记录。走。啊,走走。诶,我现在你注意,我现在还真不能这样。我现在还真不能这样,我得怎么样?我得把这个页面关了。得重打开。对于session啊,它的测试你需要每一次都把页面关了,否则的话它里边保存有原来的session内容啊。好。
14:01
打开。历史走。大家看。有没有?这是不是有个set cookie,这个cookie的是什么j session ID value呢?就这个串。你感兴趣可以数一下多长,32位长度,它是32位长度的一个随机的串啊。和谁绑定默认。就和他是绑定的。OK了。这就OK了,好。这我们已经看到了啊,继续说我们的理论。现在这是哪呢?我们看到这是响应的啊,是不是已经给我们发过来,把这个cookie是不是已经发过来了。发过来以后怎么用呢?第三步,客户端接收并发送cookie客户端接收并发布发送cookie,客户端接收到这个cookie后,会将其存放到浏览器缓存。
15:12
会存到浏览器缓存里边,诶你真别说,我还真想看一下这个cookie。选项对吧。找谁呢?The host。你看G3Z。你看过去时间是什么,绘画结束是吧?是不是他是绘画结束时,所以他没有写到硬盘,他在哪儿呢?浏览器缓存。对吧,它是在浏览器缓存的啊好。继续。只要客户端浏览器不关闭。浏览器缓存中这个cookie就不会消失。当用户提交第二次请求时。
16:05
会将缓存中的这个cookie伴随着请求的头部信息一块发送到服务端,什么意思呢?我现在要访问other了。看着。我访问other了。那么他会把刚才发过来那个cookie。坏了。怎么了?咱们这样重新来,我忘了给大家把那个cookie,他那机三人ID啊拷贝过了。关了,重来。关了,重来。
17:05
你走。我现在拷贝他。你看啊,这是谁的,这是响应。体中的对吧,这是响应题里边的这个R,那好我现在再发送。Other。走。看看。这一次,你看这儿有没有cookie,这一次。这是不是没有啊,但这儿有。这在哪儿呢?是在请求里边那样,请求头部我看一下啊,我们看一下这个JC30ID和我们响应里边的。
18:05
这是什么,请?请求。头中的。一样不一样,你看看。195868。195868。二三八零二三八零一样吗?是不是一模一样。哎,这就是刚才说了。会将缓存里边这个cookie伴随着请求头部信息一块儿发到。负担。好,最关键在这儿了啊第四步,从session列表中查找。那么你发过来以后,我们服务器,我们服务端会从请求中读取到客户端发来的cookie。
19:01
夫妻都取到这个苦的。并根据cookie的j session ID的值,你发过来的这个cookie的j session ID的值,从map中查找相应的key对应的value及session对象什么意思?服务器拿的这个会拿这个东西到哪儿。到它里边找。挨个找。一旦诶找到这个了,找到这个了,就意味着我就找到他了,找到他了就意味着什么。就意味着我找到这个session,我就能从这个session里面读取数据了。这什么意思啊?啊,好,我们再重新说一遍啊,看着这个图重新说一遍,当我们发出第一次请求的时候。
20:04
我们服务器会生成一个32位长度的随机串,再生成一个是不是3SH呢,然后给它放到。放到这个三神列表里边,比如说就是它就这个啊放进来了。当然了,我们的服务器还会把是不这个串儿,就这个东西。给它包装成一个cookie,是不是发送给。客户端的。客户端呢?会把这个cookie。给存到浏览器缓存。然后我们客户端又发出一次请求,这次请求发出的时候,是不是就携带有浏览器缓存中的这个32位长度的,是不是这个串啊。就把这个串又发给了服务器,服务器接收到这个串以后。会从这个里边去找,是不是不是,是不是,诶找到了,找到了大家看看。
21:07
是不是就是他呀。在你往里边放的时候,是不是你在它里边是不是已经放进去。三身属性了,现在你又找到它,是不是就可以从里面读了?这就是为什么找不乱。这个里边的找的就是这个里边的,这个里边找的是这个里边,为什么它乱不会乱套,就是因为这里边儿有个j session ID,通过j session ID来查找到相应的session。好。这就是我们说的session的工作原理。很重要。好,现在咱们模拟一下啊,怎么模拟呢?假设说我现在是面试官,我现在问你呢,好,你给我说一下。
22:00
Session是怎么工作的?Session的工作原理是什么吧?你应该怎么回答?你这样给他回答啊,挺好。当。用户。发出第一次请求的时候,当然了,首先我应该在这个so里边,我要这里边有一个solid,这个里边有一句话什么呀,Get session。我先获取到三审,获取到三审以后,我往这个三审里边。放。属性。那么底层服务器做了什么工作?底层服务器做的工作室,一看到你用了get session,它会马上生成一个32位长度的。随机字符串,然后再创建一个三对象。然后以这个32倍长度的随机字符串作为K,以新创建的session对象作为value放到session列表中,列表是一个map。
23:11
好了,这服务器的这个事儿说完了。然后。当用户第一次发出请求,请求这个的时候。那么刚才这些工作都已经执行完毕了。我们服务器把这个30Y长度的随机自串和这个session放到了30列表,同时服务器还做了一个工作。就是。把这个32位长度的随机字符串。给它包装成了一个cookie。发送给了。客户端浏览器。这个cookie的name叫做j session ID value就是这个32长度的字符串,OK。
24:07
然后我们的浏览器接收到这个cookie以后,会把这个cookie保存到客户端浏览器的缓存。当客户端再次。发送请求的时候。但这次发出请求干嘛呢?他要从想从刚才那个session里面读取数据了,他怎么做的呢?他首先会把。浏览器缓存里边的那个session。会把浏览器缓存里边的那个。Session。那个cookie啊,不是那个j session ID。给他放到请求的头部信息中。然后发送给服务器,服务器接收到这个cookie以后。
25:01
会拿到这个j session ID的值,也就是这个32位长度的字符串,然后到三列表中去进行查找。找到了这个K了。然后就找到了这个K所对应的这个value,也就是那个存放有预属性的session,然后我就可以从里边读数据了。这就是塞的工作原理,就这样给他说就行了。OK。这个就说到这里。
我来说两句