00:00
接下来我们再来编写购物车功能,首先我们购物车的所有数据我们最终都存在red里边,那么就先连通red,那么在这个cut里边,我们来先引入red相关的依赖,好我们来写一个dependency,我们现在是data red的start,我们先把它引进来,然后呢,我们来再来配一下我们redis的地址,其实在线上以后,我们专门应该有一个red来负责购物车,不应该跟缓存的那些red混合起来,好我们现在呢,就先配上一个,那们现在整一个spring red host,我们现在都用一个是19216 8.56.10,好,那red配好以后呢,接下来我们准备一个购物车的service,那们还是面向接口编程好,我们现在整一个service,那先来写一个car service,那所有购物车的功能我们全部放在这个接口里边,然后呢,我们再来写一个购物车service的实现类,好,我们来创建一个实现类,我们在这个service的employment。
01:00
啊,包下来我是在这个service包下点的右键,好点一个ran包下有一个cut service cut我们service的实现类,然后呢,这个实现类它主要来实现我们的这个service employment,我们的car service,好,我们现在购物车服务,我们将它放到容器中,然后我们可能要用到日志cell附键。好接下来我们要做的第一个功能,首先它里边我们来注入string red completet,因为我们要操作red,我们把它呢就先来注入进来,走接下来我们要做的这个操作,好我们来看购物车要做什么操作,首先我们来分析我们这个购物车,来点我们的京东首页购物车的第一个功能就是获取我们的这个购物车,而且大家现在要注意的就是我们获取的这个购物车,如果没登录的情况下,是我们的临时购物车,而且如果登录了是我们用户真正。
02:00
登录以后的购物车,我们现在要做的第一件事情就是我们要区分用户有没有登录,实际上呢,我们自己写的服务,如果我们登录成功,我们以前的author服务,我们登录成功呢,会给session里边放我们这个登录后的用户。比如我们这个session里边登录成功就叫session log user,我放一个它,然后呢,而且我们这个session的整个作用域,我们配spring session的时候也非常大,我们整个古ma呢都能用,所以呢,我们登录不登录,其实在任何服务,你只需要去session里边获取我们这个login user,看能不能获取来就行了,但是我们要获取session里边的数据,所以我们还要整合spring session来跟其他人一样,把spring session的依赖我们也拿过来,我们spring session来找一下,是spring data RA复制过来,我们使用red来做session的统一存储,来到购物车服务以后的所有服务都要这么来做,好,来到购物车服务里边,我们拿过来以后,我们接下来将session的配置也搬家过来,我们session的配置呢,主要是这一块叫古mail session con,好,我们将这个配置我也搬家过来,我们来写一个config,我们自己的配置包,我们先来整合我们的spring来做我们。
03:18
的session管理好,我们在这呢,也自动的来开启enable red htv session,我们以后所有的session呢都这么来做,那接下来我们只要判断有没有登录,我们只需要呢,从session中获取当前登录用户就行了。好,我们来准备一个controller controller的第一个功能,我们就叫car controller,那第一个功能呢,就是获取我们购物车里边的所有数据,我先来艾一个controller,我先写一个controller,因为我们可能要页面跳转,好我们现在来看我们的京东的第一个功能,首先呢,我们在这一块来鼠标放在这儿,这儿获取我们的购物车数据,然后呢,另外一个我们来点一下,也是获取我们的购物车数据,只不过呢,一个是跳转页面的方式,一个呢大家看到这个页面不动是AJS方式,所以我们专门来提供上两个接口请求,Public string,第一个呢,是我们跳转到我们这个购物车列表页car list配置啊。
04:18
好,我们跳转到这个列表页,这个列表页呢,是在我们以前这里边有一个cut list,这是我们购物车的列表页,好,我们把这个列表页呢跳到这儿,我们来处理请求,如果给我们来发送,那类似于京东一样,我们这个京东呢是如果们来点一个,它会发送cut.action,而我们现在呢,就叫cut.ht门,如果给我们发送这个请求,就跳到我们购物车的列表页,我们就叫car list。然后呢,这是去购物车页面的这个请求,而且我们要判断有没有登录,我们可以直接拿到session进行判断就行了,Http session session,它一个session,然后呢,我们在这只需要判断session,点一个我们这个get atribute,我们also server这个constant里边有一个login user,从session里边获取到它,如果它我们来判断,如果attribute等等,Now,如果等等,那那就说明没登录,这是没登录,那如果登录了,否则呢,那就是登录了,所以登录了呢,那就获取用户自己登录后的购物车,没登录那就是没登录,要获取临时购物车数据,然后呢,那登录以后就是获取登录了的购物车,好,我们先把这个伪代码写在这儿,但是呢,现在又有一个问题,但是呢,现在又有一个问题,我们现在得考虑我们这个京东呢,是这么来做的,我们来。
05:50
先来看一下我们京东的效果,那么即使浏览器关了,我们来看以前购物车里边我们有几件商品,浏览器关了,我们再来打开我们这个购物车里边的商品呢,还在像浏览器关了,京东都知道我们是哪个用户,虽然我们没登录,它是怎么知道呢?我们F12看一下控制台,在这个控制台里边,我们来主要看cookie,在京东里边呢,有一个cookie,我们这个cookie呢,我们来往下翻,这个cookie呢,有一个叫user key,这个user key呢,它是一串我们类似于UUID的东西,那如果我们把这个user key我来删掉,我们来看一下,我把它删掉,来看一下我们的购物车,我来鼠标放在这,诶我发现呢就没有了,我们现在呢,没有,以后我们再来看,他又会给我们一个userk,所以我们会发现京东是怎么标识我们这个用户临时用户的信息,它呢,相当于给我们一个用户的身份,一个临时身份UUID,而且这个身份大家注意什么时候才过期,在3月4号,我们现在呢。
06:50
它是我们的时间是2月3号,所以呢我们一个月后才过期,所以呢我们临时用户相当于有一个月的时间,只要一个月后我们再来打开浏览器,浏览器会自动将这个用户删掉,所以呢,我们京东是通过一个cookie,因为我们每次发请求,无论发什么请求,好,我们把这个去掉,我们论发什么请求,我们来看们获取迷你购物车的,我们发请求的时候呢,我们都会带上这个cookie,这个cookie里边呢,其中就有一个userk,来找一下有没有对应的userk信息,因为这个userk呢,就是代表我们用户的身份,那我们发现它在后边呢,带了userzk,所以每一个请求呢,其实带了userzk,那带了uzk,那这就是临时用户,但即使登录以后,大家来看,如果我来进行登录,我们即使呢,在京东上登录以后,我们来登录京东,我们看当我们登录以后,我们的这个user k还在不在,好,我们来看一下我们的user k userk呢是八九。
07:50
C74,我们这个UZK呢,还是3月4号过期的那个uzk连变都没变,所以呢,我们登录以后的这个UZK也在,包括我们发请求的时候呢,User key一直都是要发出去的,所以京东的做法就是呢来注意就是cookie里边cookie里边cookie呢在浏览器保存着这个cookie呢,浏览器的cookie,浏览器有一个咱们这个cookie,这个cookie呢就叫user key,它呢是一个叫user key,它来标识用户的身份,标识用户身份,而且呢,这个身份是一个月一个月后过期,另外呢,大家注意,如果我把这个浏览器关掉,好我来打开浏览器,我再来看一下我们的整个效果,因为关掉现当于我们就退出京东了,来F12看不到控制台,现在我们将京东的所有东西都清空掉,我们就来看购物车,如果我们来获取购物车和鼠标放在这儿,那我们发现我们第一次就算没有UK,京东呢,都会为我们分配一个。
08:50
U,以后有了这个UK,我们在任何时候发请求都会带上这个UK,而且我们这个UK呢,只要有了,我们这一个月内叫一亿五亿,我们即使登录了还叫一亿五亿,所以呢,我们现在京东的每一个请求都有这个用户身份标识,而且如果第一次访问京东,如果第一次使用京东的购物车功能,京东的我们这个购物车功能。
09:16
车功能,那都会给一个临时用户身份,都会给一个临时的用户身份,就是我们这个userk,这个身份呢,我们浏览器以后保存每次访问都带,浏览器以后保存每次访问都会带上,所以我们识别用户身份,我们也可以这么做,而现在最重要的问题就是我们购物车里边的每一处操作,无论是我们给购物车里边添加商品也好,来查询购物车的所有数据也好,我们删除购物车里边的某一项商品也好,我们现在呢,相当于都要知道我们这个人呢,是登录还是没登录,那也就是我们是这么来标识的,如果登录了,那就session里边有登录,那就是session里边自然有,Session有,然后呢,如果没登录,没登录我们就按照按照我们这个cookie里边,Cookie里边带来的user key user key。
10:16
来做,而且呢,大家还注意的就是,如果我们第一次使用京东啊,类似于我们这个商城网站,我们什么都没有的情况下,假设电脑刚装好新系统,我们什么都没有,我第一次使用京东,我们就要使用购物车,我点点一下购物车,所以第一次使用呢,没有临时用户,还要帮他创建一个临时用户,以后呢,我们就使用这个临户,临时用户好我们这个第一次,第一次呢,我们要如果没有临时用户,如果没有临时用户,没有临时用户我们还要呢,帮忙创建一个,创建一个咱们这个临时用户,然后呢,我们再来做剩下的事情,而且每一个请求,我们可能都要检查这个用户登录没登录,因为我们要看获取他什么样的购物车数据,所以呢,我们就可以来写一个拦截器来执行这个功能,我们再来目标方法放行之前,我们先让拦截器先来获取一下我们当前用户的这。
11:16
一个登录与不登录的状态信息,如果用户没登录,而且cookie里边还没临时用户,我们还可以让他创建一个临时用户,我们以后来用这个。所以呢,为了方便起见,我在购物车里边,我们来专栏写一个拦截器,好,比如呢,我就叫intercept,然后呢,我们现在就叫我们这个cut购物车的intercept,那我么这个拦截器的这个功能就是在执行目标方法之前,在执行目标方法,目标方法就是我们ctrler的这些请求方法之前,然后呢,先来判断用户的登录状态,登录状态是临时用户还是什么用户,而且把临时用户还是登录用户的这些信息我们封装好,判断用户登录状态并封装,因为我们后来呢,每一个方法都要用到用户的这个状态信息,它是登录的还是没登录的,包括临时用户是多少,登录后的用户是多少,我们就要把这些信息呢封装传递给给我们的这个ctrler目标请求,所以呢,我们如果用spring mvc的这个拦截器,首先拦截器是一个组件,我们先来标上。
12:27
拦截器呢,必须实现spring MC有一个叫handler intercept这个接口,那实现了拦截器这个接口以后呢,我们就来添加拦截器接口的,我们这几个方法实现,首先关键的第一个方法叫pre handle pre handle呢就是拦截器执行之前,这个执行之前指的是我们目标方法执行之前,好,我们先来重写它的pre handled。我们就叫pre handle,这个呢会在目标方法执行之前拦截,那在目标方法执行之前,执行之前,那执行之前我们有什么好拦截的,我们这么来拦截,当然我们只要1RETURN true,那就是放行我们这个目标方法了,Return false,那就是不放行了,所以我们这么来拦截,我们呢要看当前用户有没有登录,我们从request里边们直接get session,而且这个request是用session包装后的东西,所以我们get来的session操作,Session的读取都是从red里边读取的,所以我们从session里边我先来获取当前登录的用户author,我们的这个sor constant,那么当前登录的用户呢,比如就叫login user,好,那么这个login user呢,由于我们这个当前登录用户,我们封装的时候,我们封装的是什么类型,我们可以给大家来看一下我们登录的这个用户,我们log跟controller,我们封装以后,只要登录成功,我们封装的是。
13:52
Member response VO是我们这个common包的这个VO,所以我们在这个购物车里边,如果我们在这拦截器来获取,它应该获取到的是member response VO这个数据,只要能获取到,那就是这个数据,而且我们得判断,如果member response VO,那就是我们的这个member response为那么就叫member吧,好,如果我们这个member等等,那说明这个用户呢,没登录,用户没登录,用户没登录我们一定让他登录吗?不一定,因为我们这个购物车可以在不登录的情况下操作,然后呢,否则那就是用户登录的,但不管用户登录没登录,我们呢,为了方便,期间我们给ctrler在执行目标方法的时候,我们都给他封装好一个数据,交给他们封装什么数据呢?我来写一个VO,这VO呢,我们就将user info VO info VO这个VO里边呢。
14:52
两个数据,第一个数据是如果我们登录了,会有用户的ID比我们的user ID,第二个如果我们没登录,会有一个用户的临时降user key,我们来生成它的get set方法,那做这个有什么用?我们就可以在目标方案执行之前,用每一个方法都要获取我们这个用户信息,判断他登录没登录还是怎么着,所以我们把这一块的所有逻辑我们全部提取出来,这一块的session也不要了,我们直接在来到目标方法之前,我们在它的拦截器里边做拦截器呢,先来判断用户登录没登录好,那现在来有一个user ino VO,我们把这个VO,我们现在这个呢,应该不叫VO了,我们是传输对象,我们给页面呢,不放我们传输给下一个人的,好们可以把它叫to,好,我们就叫user info to,我们这个to里边呢,其实就两个数据,登录了就会有用户的ID,没登录就会有用户的K。
15:52
所以我们现在呢就来封装,如果用户没登录和用户登录了,所以我们在这儿来判断member不等于,那说明用户登录了,用户登录了以后呢,我们将user info里边,我们给它里边放一个东西,就将set user ID,我们将用户的ID拿来放过去,Member点一个get ID,然后呢,我们同时还可以从request,因为每次发请求我们识别临时用户是从cookie里边识别的,所以呢,我们每次请求来,我们可以获取cookie里边的数据,我们有一个get cookie,但是我们呢是获取所有的cookies,好,我们拿到cookies,我们现在要获取指定的cookies,我们要进行遍历,当然编之前先判断我们这个cookie有没有,如果这个cookie不等于,那cookie呢是有东西的,并且cookie的这个长度是有东西的,那我们就来遍历,并且cookies点一个lengths大于零。
16:52
那我们怎么遍历呢?好,那现在使用一个增强for,我们来遍利每一个cookie,然后呢,我们把每一个cookie的名字拿来,现在呢,这是cookie的名字,我们假设呢,我们系统里边也有一个cookie,假设我们自己的用户登录了,我们也有一个cookie叫user key,所以我们来获取这个名字,当然我们把这个常量我们也写过来,那这个呢,都是一个常量,那这个常量呢,放在我们这个常量里边,我们是购物车的这个常亮,购物车的constant常亮,好,这个常量里边呢,第一个是cookie的这个名字public。
17:31
我们这个final string,我们就叫用户的PI,我们零时用户零食user,它的这个cookie,这个标识的名字,这个名字呢,我们就叫user key,好我们也准备这么来做,那接下来我们就在拦截器里边,我们每次请求过来,我们就看他有没有带这个cookie,有带了我们也给它封装上,我现在也没有做啥实际的业务逻辑就是把提数据提前抽取封装一下,好我们这个cookie,我们拿到cookie的这个名字,我们来判断,如果当前的这个名字点一个equals。
18:09
等于我们定的cut constant,等于我们指定的这个cookie的名字,这个里边有一个叫我们来看一下这个cookie的名字,现在叫一个temp user,好,我们就应该是public static,那现在就拿到这个cookie的名字,等于点一个它,如果我们有这个名字的cookie,哎,那说明我们拿到这个cookie了,那user info这个to里边的这个值set user key,那就应该是我们cookie对应的值,点一个get。白,所以我们在这儿就放好,我们最终呢,全部是return true。就是呢,全部放行,只要来到目标方法我们都放行,放行以后我们希望目标方法能最快速的方式,能快速的得到,快速得到,得到什么呢?我们这个用户信息登录了,有用户ID没登录,有user key,我们能快速得到,怎么快速得到?我们可以使用JDK给我们提供的一项功能,将thread local thread local的作用就是在同一个线程共享数据,同一个线程共享数据在我们这个场景呢,会会非常适用线程叫共享数据。比如那现在想要做的事情就是大家都知道每一个请求我们进来,Tomcad会开一个线程给我们处理,从拦截器的执行到调用controller service deo,一直到请求结束给浏览器响应,从始至终都是同一个线程,所以我们在同一个线程期间,上一个人放的数据有可能是我们的其他service或者其他人放的数据。在下一个里边要共。
19:47
强,那么就可以使用thread local thread local的核心原理其实就是一个map,这个map的K呢是thread,相当于当前线程,每一个线程有拥有它自己的K,然后呢值,那就是当前线程我们要共享的这个数据,想然只要线程不一样,我们map里边K不一样,它自然能取的值就不一样,所以每一个线程的互不干扰,所以我们现在可以使用TH的local,这个原理好,我们现在呢就来到我们的这个拦截器里边,拦截器我们想要共享数据,我们给拦截器里边写一个静态的公共变量,这个变量呢,我们就叫TH的local。
20:26
这个thread local里边,由于我们保存的是user info这个to数据,好它的泛型就叫user ino to,我们就叫thread local,等于我们用一个,我们把它呢先得创建出来,好,那创建出来以后呢,接下来我们在目标方法执行之前,Return,在放行之前,Return处之前,那就是目标方法执行之前,咱我们这个目标方法执行之前,我们把这个信息呢都封装好了,封装好以后呢,我们可以放到thread local里边,所我们thread local呢,可以调用一个方法叫set,把我们这个信息呢放进去,放进去以后呢,来到我们这个目标方法,我们的这个目标方法,那就是我们的controlrler,因为我们所有请求执行之前,我们先得过拦截器,拦截器来了以后就来到controlrler controlrler想要获取用户信息很简单,拦截器给我们共享了一个thread local,好,我们拿到拦截器的thread local,它里边的这个thread local我们只需要。
21:27
盗用一个get方法,那就能把它给我们共享的user info这个信息我们就能拿到,不止在controller能拿到,任何人想要拿都在这儿可以拿到,所以呢,这是我们RI local的使用,好,我们现在debug断点来测试一下们能不能拿到,那就叫user info to,我们发送一个请求叫car特HTML,我们现在来启动我们的这个服务,我们将网关商品服务以及我们认证服务器,包括我们会员服务,我们想要登录以及我们的商品服务,以及我们的检索服务,我们可以都来启动一下,好,我们来启动,来测试一下我们的这个流程,那现在主要呢,就想测试一下我们这个拦截器给我们提前共享的这个数据,那controller能不能用到,Controller只要能用到,别人都能用到,以后呢,我们在crler层想要用用户数据一步就到位了,不用我们自己每一次都来获取封装了,好,我们现在等待我们的服务都启动成功啊,这。
22:27
这块呢,我们全部启动成功没问题,我们主要在购物车服务,我们看能不能打印我们的这个user info信息,这user info呢,来给它加上它的to string方法来重启一下购物车服务,然后我们来测试们先来登录,那我们先来访问我们这个古励me.com我们的商品服务,那先让我们进行我们的登录流程,好,我们先来点击我们这个欢迎登录,我们先使用社交登录,我们先来登录上来,那只要一登录成功,我们的这个session里边就保存了当天登录的用户,当然这个第一次是访问这个超时,那我们就重新来一次刷新,好们来重新登录一次。
23:04
好,只要登录成功,我们session里边就保存了,当然用户信息大家注意主要呢,是我们这个cookie里边有一个相当于解session ID,我们的这个session信息,那现在我们来访问购物车,如果我们来访问购物车服务,我们访问购物车服务呢,无论是访问什么请求,那先来看一下,只要是访问我们这购物车服务,我们都会带上我们的这个解session ID,我们这个session信息,我们先来看一下我们的这个session信息,这一块还没有来看一下我们的购物车,好session,那session呢肯定会带,但是呢,我们现在没有用户信息,比如我们现在来访问我们购物车的这个cut list页面,我们看能不能打印出我们拦截器为我们封装的用户信息,好,我们来尝试一下来访问购物车的hot HTML回车,好,那现在来看控制台的打印,我们看到呢,这一块打印none none的原因呢,我们也不用想,肯定都是我们这个intercept,我们没有给它放到数据,只要我们给thad local里边放了这个数据,我们肯定都有。
24:04
没放到数据的原因就是我们这个没工作,我们的这个拦截器不能只把它at component放在容器中,那么拦截器要拦哪个请求是需要配置的,所以呢,我们可以给我们这一块呢,添加一个我们web的配置,我们spring boot呢,所有要给web里边添加拦截器,我们可以这样写spring。Boot,我们来先来填一个我们的web配置,这个配置呢,我们必须实现一个,我们之前呢,在also sor里边我们用过,我们想给里边添加我们WEB1的一些定制化配置,我们要实现这个web mvc config,好,我们现在呢就来实现它来实现web mvc config,在这个config里边,好,我们现在来给它按configuration来给它加进来,在这个里边呢,它有一个这样的方法,来F12看一下它的整个方法列表,其中呢就有一个叫an intercepts,将来添加拦截器,所以我们到底要填哪些拦截器,我们必须还在这手动添一下,我们就叫and intercepts。好,我们填拦截器呢,主要是给拦截器的这个注册列表里边填,在这个注册列表里边,好,我们来填一个拦截器,这拦截器是什么?我们就可以new一个,它new一个cut intercept,好,我们直接创建一个,那创建的话我们也不用给容器中放。
25:24
好,然后呢,我们现在我们拿到的这个拦截器,它要拦截哪些请求,我们还要写在这儿,有一个添加一个我们这个路径的pattern,我们要拦截的是什么请求,所有请求杠双星,如我们当前购物车的所有请求,我们都要让这个拦截器工作,来先器工作呢,它之前先把用户信息整好,给能放进去,然后呢,它是无条件放行,只要放进去以后呢,来到我们ctrler,我们ctrller就应该获取到,好我们现在还以debug给它启动起来,那现在来测试一下,首先要测试拦截器工作,那给这呢打一个断点,拦截器工作了以后,只要给thad的local放的数据,那么CTRLL呢就直接能用,那以后我们就方便多了。好我们先把这一块呢给大家调解通,来测试一下我们的页面结果,我们现在再来访问一下我们的cut htm Mr,我们现在呢,都已经登录了,好,我来刷新一下,然后我们来看。
26:19
我们的这个debug断点先来到我们这个拦截器,拦截器呢,给我们封装user info的这个to信息,只要我们登录了,会将登录的用户ID封装里边,然后包括我们去cookie里边找数据,Cookie里边呢,我们有数据了封装没数据了就算了,那现在直接放行,只要封装成功就会来到controller controller呢,我们直接可以从thread local里边,好,我们能拿到这个数据,就是我们的这个userz ino们来打印一下,那现在呢,登录的用户ID16没问题,包括我们想要获取userk,我们也能获取到,假设呢,我们有封装这个userk,我们呢,自己手工的给我们这一块来添一个,好,那手工的添一个我们叫什么呢?就叫user key,如果我们临时用户有一个零时件,好,我们随便填好,我们就叫它,然后我们现在再来获取一下,那现在整个放行这个结束,我们再来获取一下,我们再来刷新,此次刷新呢,会带一个临时用户的介样信息,好,我们直接来放行吧,我们也不看它封装了,那现在发现。
27:19
的user ID user key我们就都有了,所以呢,我们有了这个拦截器,我们以后的业务想要用用户信息就非常方便,我们就提前封装好了,但现在呢,还有一大问题,就是如果是我们第一次使用购物车的话,我们连临时用户也没有,登录用户也没有,所以我们一定要给他创建一个临时用户,而且呢,还要让他保存起来,就像京东一样,我把这一块全部清空,那第一次使用购物车走,那一定要让购物车再保存一个临时用户,怎么让它保存一个临时用户,我们就可以这么来做,我来判断一下,我先来判断,如果呢,用户登录了没临时用户也行,但如果用户在没登录还没临时用户,那就很糟糕,但我们不管怎么样,我们都给他分配一个临时用户,所以我来判断一下,如果user info里边这个临时用户它是一个空的,我们来给他判断一下,我们来。
28:19
String us,他临时用户呢,是一个空的走,说明呢,他这个没临时用户,没临时用户我们一定给他自定义一个临时用户,怎么自定义,我们就给他一个UUID好,我们自己呢,生成一个UUID,你有一个我们使用UUID,我们整一个random u ID to string,好,这就是我们这个临时用户信息,然后呢,我们给user info to封装上,点一个set user key封装上,但是呢,我们现在封装上了以后,业务逻辑都能用到我们用户的临时价格啊,我们在这儿有一个判断,如果没有临时用户,没有临时用户一定分配一个临时用户,这个临时用户呢,我们一用以后,业务逻辑就能使用了,但现在更大的问题就是,那既然给你分配了一个临时用户浏览器呢,还得保存起来,而且要命令浏览器以cookie的方式保存起来。
29:19
临时用户的作用欲也挺大的,浏览器一保存起来以后呢,以后还访问要带,而且我们这个cookie呢,要一个月过期,所以我们为了方便起间,我们没有临时用户给你分配了一个,然后呢,你在以后的业务里边,你不用担心用户有没有的问题,你都会得到,但是呢,你的业务执行完了,你给这个临时用户里边都保存好数据了,我们的浏览器呢,就得知道这件事儿,所以我们把临时用户信息还得发给浏览器,所以普handle呢是在业务执行之前,我们可以在业务执行之后,那再来一个方法叫post handle,这是在我们业务执行之后,业务执行之后干什么?业务执行之后,我们业务执行之后呢,我们就让浏览器保存一个cookie,这个cookie呢,就一个月的时间,所以我们在这来response,我们就来命令浏览器response点,我们让浏览器保存一个cookie,这个cookie是什么,我们来创建一个cookie,又一个我就叫cookie那。
30:19
IE的K我们都指定了,是我们cut,我们的constant们找到我们的购物车的常量,常量里边我们cookie的key就叫user key cookie的值是什么?是我们上一次给他分配的这个临时用户的UID,我们直接可以从thread local里边拿到,好我thread local点一个get,把它的这个数据呢,我来拿到,拿到以后呢,我再来在这儿点一个get我们的userk信息,好我们临时用户呢,这个userk我们就以cookie的方式发下去了,怎么发呢?我们就让他response and cookie,但是同样的我们cookie呢,得有一个过期时间,好我们cookie点一个set,我们SET2个东西,第一个是作用欲,作用欲呢是整个在我们鼓励ma里边呢都有效,然后呢再来cookie.set我们的过期时间max h,这是它的最大时间,最大时间,我们来看一下这个时间是以什么为单位的,好我们看到呢,现在我们这个。
31:19
时间它呢是以秒为单位的,那现在相当于一个月以后才过期,所以我们在这一块,我们的这个cookie一个月以后过期,那到底过期时间有多久,我们也可以在这儿来配置一下啊,配置一下,那现在呢,就是一个过期时间,我们来看是什么类型的,是一个int,那么就来配一个int类型的,那么这个临时use cookie的过期时间,这是cookie的名字,还有它的time out,它的这个过期时间呢,我们来配上一个月,因为它是以秒为单位,60,这是一分钟,一分钟乘以我们61个小时,再乘以24,这是一整天,再乘以30,我们一个月,好,那接下来呢,我们就让它cookie的过期时间好,我们来调整一下,点一个我们过期时间呢,就有这么多,当然,我们是永远都要来设置这个cookie吗?不是的,如果我们这个user info里边,特别是我们当前的这个请求里边,人家cookie早都有这个数据了,那我们就没必要设。
32:19
置了,所以呢,我们最好来判断一下,那请求的所有cookie拿来看他是不是有这个userk,相当于我们发请求的时候带了这个我们就没必要设置了,如果没带我们才有必要设置,如果没这个判断,那每次请求过来,我们都会把它的这个cookie给他重新设置一个过期时间,不断的延长过期时间,但京东是不是这么做的,我们可以来看一下,每次使用购物车走走,京东呢,并没有延长我们的这个cookie的过期时间,只延长到他购物车的这两个过期时间,每一次呢都是新的,我们在这一块呢,可判断也可不判断,不判断的话呢,我们就相当于我们持续的持续的延长我们这个临时用户的过期时间,延长临时用户的过期时间,所以为了方便呢,我们还是在这儿判断一下,大家判断我们再要这么来获取挺麻烦的,只要有一次获取过,赛过,我们就给它给一个标识位,比如我们这个标识位就有一个布尔,那么这个布尔。
33:19
背型的keep user,我们的零时用户,如果我们cookie里边有零时用户,我们就给它置为true,否则呢就是false,那默认都是false,我们在拦截器里边,我们就来判断,只要我们这个cookie set成功,那把它里边的这个临时用户我们就变成true,点一个set PI user变一个处,相当于呢,我们获取到了临时用户信息,那临时用户信息我们在这就得判断,如果你默认是有这个临时用户信息,我们就没必要了,点一个我们来get一个,我们现在呢,有一个临时用户,那就叫it TIM user,如果是临时用户信息,我就没必要给他再来放cookie了,否则我们再来给他放cookie,好,我们放到这儿,这是我们来命令他添加cookie,那我们来看一下我们最终的效果,我们还是给posts handle,我们也打一个断点,如果我以debug模式启动我们的这个购物车项目,就是我们第一次访问购物车,我们自己没有这个临时用户这个件的时候。
34:19
我F12,那们现在呢,登录是登录了,但临时用户这个件我们假设没有,没有的话呢,我们就会命令浏览器自己来保存一个,我先来看我们登录里有没有还刷新一下,由于我们刚才清了session,所以这一块呢没有了,我们来重新登录一下,好,我们开始社交登录,登录过呢,它会重新向回来,我们现在登录了,现在登录了以后呢,我来刷新一下,好,有我们这个session session呢是我们用户已经登录了,但是没有临时用户信息,如果我们来第一次使用购物车,我来刷新,来看一下我们的整个请求,好,我们断电走到这,先走到拦截器,拦截器的这个pre handle断电我已经取掉了,那直接来到我们的POS handle POS handle,我们先来获取我们的临时用户,这个临时用户信息,诶,我们发现我们分配了一个临时用户,但是呢,这个不是在cookie里边带的,所以这是false,如果这个一旦是force,那它就进来,它就要求浏览器必须保存一个cookie,这个cookie的过期时间什么都有,我们直接来放行来看一下。
35:19
自响应,我们如果来访问cut htm Mr的时候,我们的响应在这呢,就会有一个set cookie,这个set cookie就命令浏览器保存一个userk,我们来看一下我们的效果,浏览器呢,以后就会保存一个userk,这个userk是我们给他分配的,然后呢,这有一个过期时间,那下一次请求再进来,好,我们在普handle这来打一个断点吧,下次我们请求再进来,我来刷新一下,随便我们使用哪个购物车请求,我们在目标方案执行之前,我们在这儿会来分析你当前登录没登录,只要登录了,把你登录的当前用户信息给你封装起来,你登录了会有userz的ID给你放到这儿,而且如果你还带了临时用户信息,临时用户的信息也会封装起来,只要一封装PI user就是true的,然后呢,我们直接放行,放行目标方法执行完以后来到POS handle,我们拦截器的目标方法执行完以后的,然后呢,我们在这一块还是拿到它之前的用户信息。
36:19
这个用户信息呢,判断是不是临时用户,因为我们之前呢,在发请求的时候已经带了临时用户信息了,所以是临时用户,是临时用户我们就无需给你再放cookie了,就是说你相当于有这个临时用户的假,我就给你。不放了,没有那就放,那我们这个逻辑就做好了,以后我们任意请求过来,如果你没有临时用户,我们都会给你分配一个,如果你有,那就用我们这个临时用户,所以我们的这个POS handle主要就是分配我们这个临时用户,让浏览器保存,让让浏览器保存,这样以后我们无论调用我们购物车的什么方法,我们都可以很方便的获取到用户信息,在用户信息里边,如果封装了userz ID,那说明用户登录了,如果没封装,那肯定都会有一个临时用户,所以这个临时用户那是一定有的,那这个一定封装了,因为没封装呢,我们还命令浏览器在这儿封装,我们的拦截器在这做了一件事,就是呢,如果没有临时用户,如果一定要保存一个临时用户,如果没有临时用户,一定保存。
37:32
一个这个临时用户,好,我们先打通这一块的逻辑,保证我们购物车所有请求一进来,我们先能获取到用户信息,无论是临时的还是不临时的,我们是通过拦截器机制,Thread local线程呢,共享了一下这个数据,那下一节课我们再来编写真正的购物车的一些增删改查逻辑。
我来说两句