00:00
我们继续来编写注册,那前面呢,我们调通了这个验证码功能,那接下来我们来点击发送验证码,那就应该发送请求帮我们来发送验证码,好,那我们要能发送验证码,我们先来在这写一个CTRL了,我们先来提供一个发送验证码的请求功能,好我们在这来就来写一个SMS send controller,那么主要呢,进行短信发送的controller,那在这个controller里边,好先来标上rest controller,我们要返回接算数据,再标一个基准路径request map,凡是短信功能呢,都以SMS开头,那我们之前的这个对象存储,那它是以咱们这个oss开头的。好,那们接下来写第一个请求,那统一呢,还是返回R对象,我们就叫send code来发送验证码,那这个发送验证码呢,首先我们需要给我们传来一个手机号,然后呢,还。
01:01
需要你要发什么验证码,但实际上呢,我们在这要发送验证码,是让后台随机生成一个验证码,我们提交了以后呢,还是需要来进行校验的,而且呢,注意的是我们这个第三方服务呢,属于我们后台集群功能,哎我们这里呢有一些业务逻辑,我们第三方服务在后台这一块,不应该由页面直接给我们第三方服务发请求,而应该由页面呢给我们各自的服务发请求,需要用到验证码了,再给我们后台的这个验证码第三方服务来发请求,所以呢,我们这个接口,我们写的这个controller,其实呢,它是供别人来调用的,是供我们别的这些服务来调的,而不是提供给我们页面直接发请求的,所以呢,那我们就在这写的时候,我们来给它标上我们需要一个扣的,就是呢,别的服务,比如我们这个商品服务也好,会员服务也好,那发送验证码的时候呢,那给我们提交了一个code的,那我们就照着人家的要求发出去就行。
02:01
注意这个呢,是提供给别的服务来进行调用的,提供给别的服务进行调用,所以呢,我们在这设计的时候加上了我们的验证码,但这两个东西呢,来写一个request,我们要的请求参数,请求参数呢,必须给我传一个这个参数,然后呢,包括验证码,我们也需要从请求参数中获取,请求参数呢,给我们来传一个这个参数,那拿到这个以后呢,我们想要发验证码,直接调我们的这个组件服务就行了。SMS component,好,把这个component呢,我们先来写在这at一个owa你自动注入进来,然后呢,Component来直接调用它的方法,Send code按照我们这个指定的手机号和指定的验证码来发送出去就行了,那最终返回R点一个OK,那这个呢,就是我们验证码的发送。
03:01
那我们要提供给别人来调用,因为我们从这个认证服务,也就是说我们这个登录服务,我们这个里边发送的请求都会提交给我们的这个认证服务,所以呢,我们认证服务就要调用我们这个第三方服务来发送验证码,那我们接下来呢,先来看一下我们这个第三方服务有没有注册到注册中心,好这都有注册了,NAS这些也都配了,应用的名字也都配了,没问题,再加我们第三方服务,我们写好了呢,我们就放在这儿,我们把它启动好,然后呢,我们来主要来编写我们的author这个服务,Author server好我们来打开,然后呢,我们先来写第一个control的功能,以前呢,这是一个login controller,在login controller里边我们要进行登录或者注册,我们要一个验证码。所以呢,接下来我们来处理一个请求,Public string,我们就叫send code,我们要发送一个验证码,然后我先来return r点一个OK,我们这一块呢,就返回的是整个R对象,好我们来写一个get monkey来处理请求,这个请求呢,我们就叫杠s Ms send code来进行短信验证码发送,然后大家注意我们这个呢是返回接送数据,因为我们在页面这,如果我来点击发送验证码,页面是不跳转的,发一个AJS请求给我们这个also服务,我们这个author服务呢,收到Ajax请求,要发送验证码,他再去调用第三方服务去,来发送验证码,好,我们要发送验证码,只需要要一个就是我们的手机号,这时我们要发送验证码,一个request per,好,请求参数呢带上手机号就行,然后我们。
04:48
带下来要进行远程调用,那远程调用我们就得引入我们的份,我们来看一下,那以前呢,引入了份,而且也开启了我们这个远程调用功能,我们在这块看一下我们的主程序配置,诶开启了份客户端,好接下来我们想要调用什么,我们在这来写我们的接口就行了,分点一个我们就叫第三方服务的,比如我们就叫thread party,我们的phone service,好,我们第三方服务的这个份接口,而且呢,这是一个接口interface,好,我们先来用一个注解叫atl,我们来声明这是一个远程接口,远程接口调用哪个第三方服务,诶我们现在主要是调用我们这一块的,好,这是调用我们这个微服务,它是调用它的,接下来呢,我们要进行短信发送,那我们直接从微服务里边将短信发送的这个方法往过一复制就行了,好把它的完整签名呢我们拿过来。
05:47
CTRLC拿过来,而且我们前面呢,这还有一个前置路径,我们一会儿也得加上好这个方法的前面拿来,然后呢,Get map把它的完整路径来复制过来,那这一块呢,我们的get map忘了没写,那就SMS send code。
06:06
Send code好,所以我们在这复制的时候,哎,这个呢叫send code,但是它呢有一个前置路径在这呢叫SMS,好,我们把这个呢也加上,所以我们这个author服务,它就会调用我们这个第三方服务提供的接口功能,我们把这个第三方服务重启一下,那我们这块呢,是一个author服务,是一个远程调用我们来到author服务的login controller的登录处理器,好登录处理器呢,现在想要发验证码,那接下来就必须来调用我们的这个service。来看一下,我们写了一个远程的这个份接口来进行验证码来发送,好们在这来把它直接注入过来,Third,我们这个part份service,那就把第三方服务的这个份远程接口来注入进来,那我们现在要做的就是我们在这来发送验证码,那直接把它拿过来,点一个我们叫send code,我们调方法传入一个份。
07:06
我们这个是手机号好传过来,那接下来呢,我们验证码是多少,我们要随机来生成一个验证码,那这个验证码呢,来我们用最简单的方式,也不整数字验证码了,直接整一个UU id.run到u u ID to转,然后呢,Repl,我们先把这个短横线都替换掉,我们也不用替短横线了,我们就直直接截上几个字符,我们就来写一个sub string。我们从零截到五好,我们就来截这几个字符,把这几个字符呢当成我们的验证码,那把这个验证码呢,给我们来发出去就行了,这是我们来写的这个功能,那我们这个controltrler写好以后,主要就是页面,在我们这个author服务里边,我们写了controlrler,那在页面我们在这儿点击发送验证码,那其实呢,就是给他发请求,带上我们的手机号,那接下来验证码呢就发过去了。
08:01
好,我们接下来在页面里边来处理这个功能,先来到注册页。注册页在这儿,好,我们来在最后边,这就是我们这个发送验证码,我们之前在这屡预留好的,如果我们这个点了这个发送验证码,正在倒计时呢,我们什么都不用做,只要呢不是在倒计计时过程中,我们就应该在这来发送验证码,而且这个呢是一个Ajax请求,所以我们倒了几克瑞,我就直接写dollar.get那使用杰克瑞来发送一个get请求,那get请求的地址,那就是我们当前服务,所以呢,我当前服务我直接写一个杠,那就代表给我们这个当前的这个服务器路径,那就给这给它下边的什么来发请求,它下边我们有一个login controltrler SMS,就是这个好,我们给这呢发请求,但是呢,我们还会携带上我们的参数,主要呢,有一个参数就是手机号,诶我们这儿呢,会输入一个手机号,所以呢,把这个参数我们也带上带一个份,而且我们这个ctrller呢,要求参数呢,名字确实必须叫份那。
09:07
寸等于什么呢?把这个手机号拿过来,在这儿来审查一个元素。好,我们来看一下我们这个手机号,它是一个input class叫份的,我们可以给他最快的方式,要获取它的值,给他拿一个ID就行了。那我们来找一下CTRLF,它叫class,等于我们这个份的好,我们来找到它,我们来给它一个IDID呢,我们就叫phone number,这是我们的手机号,那我们现在先来获取我们的手机号,把它拿过来,来ctrl end还是在我们的最后,我们要发送验证码,首先得知道手机号,好来Dollar符小括号,我们先来按照ID来进行选择,来用选择器找到它的Y6值,这是一个input框,那这个东西呢,就是手机号来把它给我们这个路径上的一天,好,我们就呢把这个请求发出去了。
10:04
请求发出去以后呢,我们还可以感知它成功还是失败,但实际上呢,我们发一个手机验证码,我们也无需成功失败以用户收到的为准,用户这收到验证码了,那就成了,要收不到了那就败了。所以呢,我们接下来在这只需要调用一个最简单的类似于命令就行,我们都不用写这个回调函数了,那这样呢,我们相当于给这一块UI了发了一个请求,CTRLF9,我们把这个服务呢重启一下。我们来测试页面,我们来点击发送验证码,看能不能发出去,好那一会儿呢,来刷新一下,先来保证我们服务启动起来。好,我来刷新页面,我来刷新。好,现在呢,重新进入我们的这个登录页面,注册页面,好,我F12,那现在呢,准备来发一个短信验证码,来输一个手机号。好,我来点击发送验证码,好,这个验证码呢,我们来看这个network这个请求,请求呢是发给also古ma SMS send code的份,好这个呢发出去了,而且但是呢,现在有一个服500,我们这个服务器内部异常,但看起来内部异常,但是我们这个呢,Third party都已经打印了我们这个验证码的,这个发送成功了,来看我们的author server,看一下这一块内部异常是什么异常,说我们这个不能解析SMS s code的,那么这个页面模板,他说这个模板有问题,诶因为我们是返回aja数据,所以我们这没标CTR了,我们要返回JA层数据,我们就得写response body,好把它加上,然后呢来重新启动们这个author third party呢,我们也来启动一下。
11:45
那我们现在来测试我们的验证码发送,刚才我的这个手机震动也已经收到验证码了,说明这个是有效的啊,我们再来发送一下。重新启动服务,我们来测试一下,好,我们来页面来重新来发送验证码,我们把这一块呢去掉。
12:01
好,我们在这呢,来发送发送验证码,好,我们发现呢,这个请求发出去了,而200那就一切都正常,我们响应的呢,也都是OK的,那验证码发成功了,然后呢,我手机就会接到验证码来看一下,好,我现在手机的这个验证码是3E40C 3e40C,那这个验证码有什么作用呢?接下来我们要注册,会带着其他信息,当我们来点击立即注册的时候,我们先要验证我们的验证码对不对,这是第一方面,第二方面只要验证码正确了,我们就应该将这些用户的个人数据们插入到我们的数据库里边。但是呢,这一块还有一个问题,就是我们发现我们做的这个短信验证码呢,虽然倒计时是我们的60秒。但是我们在页面早都已经暴露了我们验证码发送的这个请求,我们可以看一下end。诶,我们看到呢,这一块我们确实暴露了我们验证码的整个请求路径地址,这样呢,可能就会引起一些恶意人员给我们无限调用我们的短信验证码功能来进行消耗我们的短信资源,这是第一方面,第二方面,而且页面的这个验证码的这个倒计时按钮,我们可以来看一下,既然你都把请求暴露了,我来点击发送验证码,虽然59秒以后可以再发,但是呢,我只要把这个页面一刷,然后呢,我还给这个手机号来进行发,所以呢,这是无限制的,我再来点击发送验证码还是可以发送的,所以呢,我们要解决这个问题,验证码必须在严格意义上的60秒以后才能重试发送,这是第一个。
13:41
第二个我们就算呢,给用户发出去的验证码也不是永久有效的,比如我们时间呢,是十分钟,20分钟,用户只要20分钟内带着这个验证码去来验证就没问题,所以我们现在紧要的要做两个事情,第一个接口防刷,我们要防止别人去恶意的给我们无线来发送验证码,第二个我们这个验证码呢,还要做下次的校验,好我们就在这儿来解决一下这两个问题,好,第一个问题怎么解决?
14:13
接口防刷,我们这个如果是一直是这个状态,我们的接口已经暴露在外边了,然后呢,别人拿着我们这个,我们给手机号不断的来发送验证码,这是有问题的。第二个我们要解决的问题,那就是我们验证码的再次校验,这个我们因为这个验证码发了以后,等我们点了注册,我们真正想要注册的时候,我们是需要再次校验这个验证码对不对的,好,我们先来解决一个最简单的问题,就是验证码的再次校验,这个再次校验好说为了校验我们下一次的这个验证码对不对,你把它临时存起来就行了,所以呢,我们一般选择把它存到red里边,因为我们这个数据呢。不是永久存储的,我们不需要用到持久化层。好,我们现在给also里边,我们先来引入red,同样的我们需要操作red,得引入red的starter来写上dependency,那么叫data RA,好,Spring boot starter data RA,那我们把这个RA呢引进来以后,接下来我们就来操作red,那么red引进来只需要做简单的配置,配一下我们这个red服务器的地址。
15:24
那么现在呢,叫red red点一个server,那叫host,我们主机地址呢,是192.168.56.10,就跟我们这个商品服务,我们配的这个是一样的,端口号呢,我们也都没变过,我确认一下这个地址对不对,Red的主机地址在下边,我们确定的是5610,没问题,端口号呢,6379,那我们也可以来明显的写上,防止我们哪一次改变出错,好我们在这儿呢,再来写上我们的redest portt,那现在呢是6379,就用默认的,好连上red以后,我们说spring boot已经帮我们做好了所有的自动配置,所以我们要操作red就直接操作就行了,那么在这要保存数据,我们就来直接注入一个东西,叫string red tablet,这是我们red的操作工具类,好我们把这个拿过来,然后呢们来给red里边保存数据。
16:25
嗯。我们呢,上一次的验证码是这个,然后我们发出去了,那只要发出去以后呢,下一次想要用,我们就得保存起来,但是保存大家得想清楚,那下一次该怎么用,就是我们要校验验证码,要看这个手机号带来的这个验证码对不对,所以存的时候,我们呢,K一定是要包含手机号的,我们是这个手机号值呢,就可以是我们的这个验证码的值,这样我们按照K就能找到这个验证码,再来看请求带来的验证码对不对,好,那现在呢,我们就来保存,那我们所有的这个验证码的这一块,我们得写一个前缀,好我们来写一个常量,把这个量呢,我们还是放到common里边,那么这个common里边常量,这是商品的这个常量,我们再来带上。
17:14
我们这个author的这些常常量,我们就叫author server constant,那这个常量呢,首先第一个来复制上一个,我们不要这种枚举状态的,我们就要一个public public static static的final,我们是string类型,我们就叫验证码的,我们SMS code,我们的这个red的前缀catch。X,好,我们这个验证码的缓存前缀,那我们呢,都叫这个,我们都叫SMS冒号,Code冒号,然后后边呢,自己来拼上我们的手机号之类的,好,这是我们的前缀,然后接下来那我们要给red里边存数据,我们这么来存。
18:03
我们的K呢,我们就叫成这样子的,我们的code的冒号,我们的SMSSMS,然后呢,我们以手机号一拼,比如我们的手机号,我们拼上以后呢,它是作为件的,而真正的验证码,比如这个是它是作为值的,那下一次你想要查,我继续按照这个来查就行了,好,我们先来保存起来,那string red time来调用它点一个。我们现在呢,调用option for value,我们操作这个KV,然后点一个给red release里边保存一个数据,我们就叫set,这set呢,K那就是我们指定的值,那先来整一个前缀,我们author server的constant.sms code,这个前缀加上我们以手机号拼起来,这是这个前缀,那值呢,那就是我们这一次的生成的验证码,另外呢,这个东西是有过期时间的,来点进来,我们应该调我们带了四个参数的,我来还传入过期时间,因为我们这个验证码呢,默认一般都是十几分钟有效,十几分钟呢,只要带上都没问题,所以呢,我就在这儿来指上有效时间,我来写一个十。
19:20
这时呢,我们就叫time unit,我们来写指定一个分钟叫minutes,好,那现在呢,这个验证码是十分钟有效,我们给red里边缓存了起来,来red缓存验证码,缓存验证码的目的就是为了下一次来校验,但接下来我们额外再来考虑两个问题,第一个如何防止它在60秒内这个手机号还再次发送验证码,我们看到呢,现在是这样子的,比如我点了个发送验证码,你虽然这是58秒,但是我只要页面一刷新进来,我再输我相同的手机号,我还能继续发送验证码,所以这是比较难受的,所以我们接下来要做的就是我们要真正的要防止,防止咱们这个手机号,同一个手机号同一个在咱们这个60秒内,60秒内。
20:15
再次我们发送验证码。那如何防止这个事情,我们可以这么来做,来保存验证码的时候,我们呢,不止保存一个验证码,我们再来加上当前系统的时间,只要你想要发送验证码,我按照你的份先在red里边看有没有,那如果有了,我再看一下你的这个时间,如果这个时间呢,是60秒内的,那我就告诉你。这个60秒以后再试,如果是60秒以后的我们再给你发,那有些同学说red历里面都有了,不发不行吗?那是不行的,因为我们在这虽然点了发送验证码,我们就算调用了第三方的这个验证码发送接口,但实际上第三方也不能保证我们验证码百分百能发出去,所以呢,我们在这儿就得加一个业务判断,我们现在呢就来为了防止这个我们给验证码呢,加上当前系统时间,好我们使用杠一分割,然后呢,加上我们这个当前系统时间system,点一个current Li,好加上这个系统时间,然后给red里面预存,然后我们是上来,接下来又要发验证码之前,我们先拿出这个数据,所以呢,我们要做的是red term.option for value点我们先来get,我们先看red里边有没有,而且有的这个数据有没有到时间,所以呢,我们按照这个K先去查。
21:43
查,那接下来呢,它就会查到一个我们这个string的值,这个值呢,是我们red里边保存的这个code的值,然后接下来我们要做的事情就是把它来进行分割,它点一个split。我们使用短横线,哎,这个下划线进行分割,分割的最后它是一个时间,所以呢,我来取出第二个值,然后呢,接下来我把它转成一个浪值浪点pass浪,我们把这个值呢转成我们指定的浪时间,然后呢,这个时间我们接下来拿到它和当前的系统时间来做一个比较,System。
22:25
点一个current这个time,当前时间,如果当前时间减去我们从里边转换过来的时间,如果是小于60的,说明我们不能发送,所以我们在这做一个判断。如果它小于60,当然这个是不对的,因为我们这个当前系统这个时间它是以毫秒为单位的,我们呢,现在是以秒为单位的,所以呢,我们60秒的话。那么就得给它再乘个1000,那就相当于小于我们这个6万,哎,这就是60万,那我们小于6万应该是这样,那接下来呢,相当于我们是在60秒内,这60秒内,60秒内不能再发,不能再发,所以呢,我们就直接给它return一个R,点一个file,我们应该写一个error,这errorr的这个错误状态码,我们以前呢,给定义了非常多的这些业务状态码,我们来到。com里边,我们来看一下我们的这个业务状态码,业务状态里码里边呢,游戏系统等等这些问题们来,我们现在来一个通用,好通用里边呢,接下来就是我们就叫。
23:42
SMS code。好,SMS code的,我们就叫短信这个验证码这一块的问题,好,我们呢,现在编排幺零,这是我们这个通用代码,这个001是参数校验,那么这个002,那就是短信验证码,咱们这个验证码,短信验证码。
24:07
频率太高,好,那么接下来呢,就来写上10002,好,我们就来告诉他。验证码获取频率太高,请稍后再试好,就叫验证码获取,获取频率太高,稍后再试好,这是我们这个响应们来到controller这如果说我们真的是在60秒内,我们接下来就来返回这个扣的枚举点一个我们这个验证码问题。这验证码呢,是它点一个get code,诶这是我们要返回的这个代码,然后呢,再来把它的这个错误消息,我们也顺带得以返回,点一个SMS code里边的get message,好我们呢就给系统返回一个错误就行了,那否则呢,我们才有必要往下走,只要一切验证通过,即使你是通过页面刷新了,然后呢,你下次再进来,但是呢,你是相同的手机号,60秒内就不能再刷,那接下来第二个我们这个接口防刷,这个呢,我们先放在这儿,那后边呢还要专门来讨论这个问题,好那我们现在呢,先解决了我们这个验证码60秒这个频率问题。
25:22
即使你刷新页面,我们都不会出现相应的这个错误,好,我们现在来测试一下,那接下来我们来在页面里边,我们就来修改一下页面,因为页面呢,有可能有验证码的发送失败。好,我们在页面这这一块呢,发送验证码来写一个方程来回调,如果验证码发完以后,那我们服务端会给我们返回这个数据,那这个数据呢,接下来if,如果说我们这个数据的里边它有一个code。扣到呢,如果等等零,那说明一切正常,如果它不等零,说明我们这个验证码有问题,有问题呢,我们就来提示一下。
26:03
那我们就直接写一个alert吧,我们也不引入我们前端的那些漂亮的那些提示框架了,你就直接alert将我们返回的这个数据来a letter一下,我们现在来看效果,因为我们返回的这个R对象,这R对象里边呢有code,有message。哎,那就是这样子的,包括我们失败了就会放code的message,所以呢,我们拿到message在这儿呢,打印一下,我现在来重新启动我们的这个server,那现在来看。我们在这儿来发送验证码的时候,我们能不能控制住。首先要解决我们这个页面一刷新,再进来给同一个手机号再发验证码的问题,好,那服务呢,先正常启动起来,我先来F12来打开控制台监控network,我来先发第一个验证码。好,第一个这个验证码呢,我们先来保证它发送成功,现在这是一个500,我们来看一下500是什么异常,那这个500呢,是一个空指针,要说我们在这儿分割的时候,因为我们第一次在这校验,我们这个手机从未发过验证码,所以red里边什么数据都拿不到,那既然拿不到说明我们这个手机都没发过,那就可以直接继续进行了,所以呢,我们在这儿得多加一个判断。
27:16
如果说。If,如果我们string us,如果说我们从red里边拿到的这个东西不为空,我们才需要做下边的事情,如果他不为空了,来判断一下,来切割判断一下,看需不需要再发,如果为空了,那说明以前都没发过,那就直接发就行了啊,我们来重新测试走,我们现在来页面来进行一个测试,把这一块呢清空,我来点击发送验证码,好,这一块呢响应200 OK,然后呢,我来刷新一下页面,我再来发,那现在呢,肯定没过60秒,如果我再次来发送验证码,我来输个手机号。好,我来点发送验证码,诶我们就会提示验证码频率太高,我们稍后再试好我们这个验证码功能呢就正常了,包括我们这个验证码如果真发出去,我们看red肯定里边呢有保存相关的数据来打开这个red,好我们来验证一下,在我们这个列别里边呢,如果有验证码,我们这个验证码的存活时间,我们当时是放了20分钟大概左右,好,那现在呢,现在就是一直我们这个验证码在按照我们的格式拼串,这是系统之前的时间。
28:30
然后呢,这是真正的验证码,那么中间呢,做了一个短横线。
我来说两句