北京南站地图,长沙最近什么传染病,网络服务合同范本大全,坪山网站建设方案文章目录 一#xff0c;验证码防刷校验1#xff0c;第三方服务提供发送短信的接口2#xff0c;登录服务提供给前端的接口 二#xff0c;215-商城业务-认证服务-一步一坑的注册页环境三#xff0c;商城业务-认证服务-异常机制四#xff0c;217-商城业务-认证服务-MD5… 文章目录 一验证码防刷校验1第三方服务提供发送短信的接口2登录服务提供给前端的接口 二215-商城业务-认证服务-一步一坑的注册页环境三商城业务-认证服务-异常机制四217-商城业务-认证服务-MD5盐值BCrypt五218-商城业务-认证服务-注册完成六219-商城业务-认证服务-账号密码登录完成总结 包含
214-商城业务-认证服务-验证码防刷校验215-商城业务-认证服务-一步一坑的注册页环境216-商城业务-认证服务-异常机制217-商城业务-认证服务-MD5盐值BCrypt218-商城业务-认证服务-注册完成219-商城业务-认证服务-账号密码登录完成
一验证码防刷校验
1第三方服务提供发送短信的接口
短信服务可以给多方提供服务所以要提供一个接口接受电话号码和code调用接口将code发送给指定的电话号码。
Controller
RequestMapping(value /sms)
public class SmsSendController {Resourceprivate SmsComponent smsComponent;/*** 提供给别的服务进行调用* param phone* param code* return*/GetMapping(value /sendCode)public R sendCode(RequestParam(phone) String phone, RequestParam(code) String code) {//发送验证码smsComponent.sendCode(phone,code);return R.ok();}}2登录服务提供给前端的接口
Controller
public class LoginController {Resourceprivate ThirdPartFeignService thirdPartFeignService;Autowiredprivate StringRedisTemplate stringRedisTemplate;ResponseBodyGetMapping(value /sms/sendCode)public R sendCode(RequestParam(phone) String phone) {//1、接口防刷String redisCode stringRedisTemplate.opsForValue().get(AuthServerConstant.SMS_CODE_CACHE_PREFIX phone);if (StrUtil.isNotEmpty(redisCode)) {//活动存入redis的时间用当前时间减去存入redis的时间判断用户手机号是否在60s内发送验证码long currentTime Long.parseLong(redisCode.split(_)[1]);if (System.currentTimeMillis() - currentTime 60000) {//60s内不能再发return R.error(BizCodeEnum.SMS_CODE_EXCEPTION.getCode(),BizCodeEnum.SMS_CODE_EXCEPTION.getMessage());}}//2、验证码的再次效验 redis.存key-phone,value-codeint code (int) ((Math.random() * 9 1) * 100000);String codeNum String.valueOf(code);String redisStorage codeNum _ System.currentTimeMillis();//存入redis防止同一个手机号在60秒内再次发送验证码stringRedisTemplate.opsForValue().set(AuthServerConstant.SMS_CODE_CACHE_PREFIXphone,redisStorage,10, TimeUnit.MINUTES);thirdPartFeignService.sendCode(phone, codeNum);return R.ok();}}这段代码用于共前端调用发送短信验证码其主要作用如下 接口防刷机制首先检查Redis中是否已经为提供的手机号码phone存储了验证码。如果存在并且当前时间与存储验证码时的时间差小于60秒则认为请求过于频繁返回错误信息阻止用户在短时间内重复发送验证码。 生成验证码如果用户请求发送验证码的频率正常代码将生成一个六位数的随机验证码。 存储验证码到Redis将生成的验证码和当前时间戳拼接存储到Redis中其中键为手机号码值为验证码和时间戳的组合。这用于验证验证码的有效性并防止同一个手机号在60秒内再次发送验证码。 调用第三方服务发送验证码通过Feign服务调用第三方服务例如短信服务提供商发送验证码到用户的手机上。 返回操作结果如果验证码发送成功方法返回一个表示操作成功的响应。
关于发送验证的两个要点
1因为要验证用户输入的验证码是否正确需要后台将生成的验证码进行保存因为不需要持久化所以保存在redis中。2为了防止恶意调用所以要在后台进行验证60秒内只能调用一次超过一次的返回错误不允许重发。
二215-商城业务-认证服务-一步一坑的注册页环境
这一节的主要内容是
校验前端登录参数是否符合标准如果不符合校验规则将错误信息返回给前端由前端回显
封装前端参数的VOVO使用了JSR303校验简化代码。
Data
public class UserRegisterVo {NotEmpty(message 用户名不能为空)Length(min 6, max 19, message用户名长度在6-18字符)private String userName;NotEmpty(message 密码必须填写)Length(min 6,max 18,message 密码必须是6—18位字符)private String password;NotEmpty(message 手机号不能为空)Pattern(regexp ^[1]([3-9])[0-9]{9}$, message 手机号格式不正确)private String phone;NotEmpty(message 验证码不能为空)private String code;}这里有个小细节前端登录界面登录请求会携带参数校验不通过需要把错误信息返回给前端因为使用了了模板引擎课程中采用请求转发的方式实际上在直接返回错误信息应该也是可以的只要前端做好适配。
三商城业务-认证服务-异常机制
登录请求的参数校验通过后需要验证验证码是否正确从redis中取出存储的验证码然后校验即可。
如果验证码校验通过下一步要调用member会员服务的接口注册会员。
会员服务提供的这个接口中需要做一些校验
用户名要唯一手机号要唯一
如果校验不通过通过抛异常的方式将信息抛给controller层。
四217-商城业务-认证服务-MD5盐值BCrypt
对于用户的密码不能存储明文必须对其进行加密。
加密有两种方式
不可逆的加密不能根据密文推出明文可逆的加密可以根据密文推出密文为了防止相同的密码有相同的密文通常采用加盐的方式这样即使多个用户的密码相同存储在数据库的密文也不是一样的
课程中采用不可逆的加密在实际工作中一般也采用不可逆的加密。
MD5是常用的不可逆加密算法我们使用Spring提供的工具类BCryptPasswordEncoder 对密码进行md5加密。 BCryptPasswordEncoder bCryptPasswordEncoder new BCryptPasswordEncoder();String encode bCryptPasswordEncoder.encode(vo.getPassword());memberEntity.setPassword(encode);MD5Message Digest Algorithm 5信息摘要算法5是一种广泛使用的加密算法用于生成数据的哈希值。 压缩性无论输入数据的长度如何MD5算法都会生成一个固定长度128位即16字节的哈希值。 易于计算从原始数据计算出MD5值是一个相对简单和快速的过程。 抗修改性对原始数据进行任何微小的改动哪怕是修改一个字符都会导致生成的MD5值发生显著的变化。 强抗碰撞性找到两个不同的数据输入它们具有相同的MD5值被认为是非常困难的。但是这并不意味着MD5没有碰撞实际上MD5的抗碰撞性已经被证明是不足够的尤其是在密码学领域。 加盐Salting为了增加MD5的安全性可以通过添加一个随机生成的盐值Salt与原始数据组合然后进行MD5加密。数据库中存储加密后的MD5值和盐值。在验证数据时使用相同的盐值对输入数据进行MD5加密然后与存储的MD5值进行比较以验证正确性。
五218-商城业务-认证服务-注册完成
这一节主要调试注册服务的完成。
六219-商城业务-认证服务-账号密码登录完成
这一节生完成登录的后台接口主要的逻辑
权限认知服务接收前端页面的参数校验通过后调用会员服务的接口接口根据参数查询数据库判断用户名和密码是否正确
总结 错误处理首先检查表单验证结果result是否有错误。如果有错误将错误信息收集并存储到errors映射中然后重定向回注册页面。 验证码验证从前端获取用户输入的验证码code然后从Redis中获取存储的验证码redisCode。如果Redis中有对应的验证码并且用户输入的验证码与Redis中的验证码匹配则进行下一步。 删除验证码如果验证码匹配从Redis中删除该验证码防止重复使用。 远程服务注册调用远程服务memberFeignService.register(vos)进行用户注册。 注册结果处理 如果注册成功register.getCode() 0重定向到登录页面。如果注册失败收集错误信息存储到errors映射中然后重定向回注册页面。 验证码不匹配或不存在处理如果用户输入的验证码与Redis中的不匹配或者Redis中没有对应的验证码收集错误信息存储到errors映射中然后重定向回注册页面。
整体上这段代码实现了用户注册时的验证码验证、错误处理和注册结果反馈确保了注册流程的安全性和用户体验。