今日目标
1. 完善基于前后端分用户验证码登录功能;
2. 理解验证码生成流程,并使用postman测试;
3. 理解并实现国内大盘数据展示功能;
4. 理解并实现国内板块数据展示功能;
5. 理解后端接口调试和前后端联调的概念;
1.验证码登录功能
1.1 验证码功能分析
1)前后端分离架构的session问题
单体架构session实现验证码流程:
解释:
如果前端后端都在一个工程下 统一部暑 首先访问验证码接口 将生成校验码保存在后台session下
每个session都有一个sessionid 也就是说验证码在后台保存了一份 然后将sessionid放到cookie中
响应给前端 把验证码也给前端 这样子在前端我们能够拿到验证码 也可以拿到sessionid,这样子的话 当我们输入验证码,点击登录后 就可以把sessionid和验证码带回去给后台 因为cookie来自于服务器,不存在跨域问题问题 所以服务端接收到请求之后 就可以从cookie中解析到sessionid sessionid获取到之后 根据K:V值就可以获取验证码 然后在与后台根据sessionid获取保存的验证码进行对比
但是当前我们的项目存在跨域问题 cookie不同源 前端的cookie是无法发送到服务器后端 所以后端拿不到前端的sessionid
当前我们的项目采用前后端分离的技术架构,因为前后端请求存在跨域问题,会导致请求无法携带和服务器对应的cookie,导致session失效,且后续服务端也会做集群方案部署,整体来看使用session方案带来的扩展和维护成本是比较高的!
2)验证码逻辑分析
我们可使用分布式缓存redis模拟session机制,实现验证码的生成和校验功能,核心流程如下:
解释:
第一次请求:
刚开始时 第一次 页面一加载 接口主动访问, 访问地址是api/captcha
请求经过代理之后 就来到了服务器后端 后端先生成验证码 然后把验证码保存在redis下 这样子的话 哪怕到时做集群 大家都访问的是共同的服务 都能做到共享 也就是由原来要放到session中的缓存数据 现在把他们放在公共的redis下(公共的缓存区域)
然后在把后台生成的验证码响应给前端 前端就能够得到后台随机生成的验证码 这样用户就可以存入这个验证码 之后 我们在点击登录 就可以发起了第二次请求
第二次请求
携带用户输入的验证码登录 地址是/api/login/ 这样就把前端用户输入的验证码转入后台 后台在从redis获取到验证码和前端传入的验证码进行比较 如果不是 就是销毁 如果是 就说明验证成功
思考:存储redis中验证码的key又是什么呢?
模拟sessionId ,我们可以借助工具类生成全局唯一ID;
3)验证码生成接口说明
请求路径:/api/captcha
请求参数:无
响应数据格式:
{
"code": 1,
"data": {
"code": "5411", //响应的验证码
"rkey": "1479063316897845248" //保存在redis中验证码对应的key,模拟sessioinId
}
}
1.2.redis环境集成
前后端分离后,后台session无法共享使用,所以我们可以把验证码数据存入redis中,所以接下来,backend项目中先引 入redis的依赖:
<!--redis场景依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- redis创建连接池,默认不会创建连接池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<!--apache工具包,提供验证随机码工具类-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
yml配置redis: