谷粒商城----认证服务
一、短信验证码(阿里云短信服务)
@Data
@ConfigurationProperties(prefix = "spring.cloud.alicloud.sms")
@Component
public class SmsComponent {private String host;private String path;private String skin;private String sign;private String appCode;public String sendSmsCode(String phone, String code){String method = "GET";Map<String, String> headers = new HashMap<String, String>();//最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105headers.put("Authorization", "APPCODE " + this.appCode);Map<String, String> querys = new HashMap<String, String>();querys.put("code", code);querys.put("phone", phone);querys.put("skin", this.skin);querys.put("sign", this.sign);HttpResponse response = null;try {response = HttpUtils.doGet(this.host, this.path, method, headers, querys);//获取response的bodyif(response.getStatusLine().getStatusCode() == 200){return EntityUtils.toString(response.getEntity());}} catch (Exception e) {e.printStackTrace();}return "fail_" + response.getStatusLine().getStatusCode();}
}
二、验证码防刷校验
@Controller
@RequestMapping("/sms")
public class SmsSendController {@Autowiredprivate SmsComponent smsComponent;/*** 提供给别的服务进行调用的*/@GetMapping("/sendcode")public R sendCode(@RequestParam("phone") String phone, @RequestParam("code") String code){if(!"fail".equals(smsComponent.sendSmsCode(phone, code).split("_")[0])){return R.ok();}return R.error(BizCodeEnum.SMS_SEND_CODE_EXCEPTION.getCode(), BizCodeEnum.SMS_SEND_CODE_EXCEPTION.getMsg());}
}
🚩思路是将每一次发的验证码存在redis,并且加上存放的当前时间,下一次发验证码请求时先判断当前时间-上一次存放时间,如果小于60秒,返回错误,否则才发验证码请求
/** 接收到一个手机号,在此处生成验证码和缓存,然后转给第三方服务让他给手机发验证按* */@ResponseBody@GetMapping("/sms/sendcode")public R sendCode(@RequestParam("phone") String phone){// TODO 接口防刷(冷却时长递增),redis缓存 sms:code:电话号String redisCode = stringRedisTemplate.opsForValue().get(AuthServerConstant.SMS_CODE_CACHE_PREFIX + phone);// 如果不为空,返回错误信息if(null != redisCode && redisCode.length() > 0){long CuuTime = Long.parseLong(redisCode.split("_")[1]);if(System.currentTimeMillis() - CuuTime < 60 * 1000){ // 60sreturn R.error(BizCodeEnum.SMS_CODE_EXCEPTION.getCode(), BizCodeEnum.SMS_CODE_EXCEPTION.getMsg());}}// 生成验证码String code = UUID.randomUUID().toString().substring(0, 6);String redis_code = code + "_" + System.currentTimeMillis();// 缓存验证码stringRedisTemplate.opsForValue().set(AuthServerConstant.SMS_CODE_CACHE_PREFIX + phone, redis_code , 10, TimeUnit.MINUTES);try {// 调用第三方短信服务return thirdPartFeignService.sendCode(phone, code);} catch (Exception e) {log.warn("远程调用不知名错误 [无需解决]");}return R.ok();}
三、注册环境
@PostMapping("/register")public String register(@Valid UserRegisterVo userRegisterVo,BindingResult result,RedirectAttributes redirectAttributes){if(result.hasErrors()){// 将错误属性与错误信息一一封装Map<String, String> errors = result.getFieldErrors().stream().collect(Collectors.toMap(FieldError::getField, fieldError -> fieldError.getDefaultMessage()));// addFlashAttribute 这个数据只取一次redirectAttributes.addFlashAttribute("errors", errors);return "redirect:http://auth.gulimall.com/reg.html";}
/*** TODO 重定向携带数据,利用session原理 将数据放在sessoin中 取一次之后删掉** TODO 1. 分布式下的session问题* 校验* RedirectAttributes redirectAttributes : 模拟重定向带上数据*/@PostMapping("/register")public String register(@Valid UserRegisterVo userRegisterVo,BindingResult result,RedirectAttributes redirectAttributes){if(result.hasErrors()){// 将错误属性与错误信息一一封装Map<String, String> errors = result.getFieldErrors().stream().collect(Collectors.toMap(FieldError::getField, FieldError::getDefaultMessage));// addFlashAttribute 这个数据只取一次redirectAttributes.addFlashAttribute("errors", errors);return "redirect:http://auth.gulimall.com/reg.html";}// 开始注册 调用远程服务// 1.校验验证码String code = userRegisterVo.getCode();String redis_code = stringRedisTemplate.opsForValue().get(AuthServerConstant.SMS_CODE_CACHE_PREFIX + userRegisterVo.getPhone());if(!StringUtils.isEmpty(redis_code)){// 验证码通过if(code.equals(redis_code.split("_")[0])){// 删除验证码stringRedisTemplate.delete(AuthServerConstant.SMS_CODE_CACHE_PREFIX + userRegisterVo.getPhone());// 调用远程服务进行注册R r = memberFeignService.register(userRegisterVo);if(r.getCode() == 0){// 注册成功,去登录return "redirect:http://auth.gulimall.com/login.html";}else{Map<String, String> errors = new HashMap<>();errors.put("msg",r.getData("msg",new TypeReference<String>(){}));// 数据只需要取一次redirectAttributes.addFlashAttribute("errors",errors);return "redirect:http://auth.gulimall.com/reg.html";}}else{Map<String, String> errors = new HashMap<>();errors.put("code", "验证码错误");// addFlashAttribute 这个数据只取一次redirectAttributes.addFlashAttribute("errors", errors);return "redirect:http://auth.gulimall.com/reg.html";}}else{Map<String, String> errors = new HashMap<>();errors.put("code", "验证码错误");// addFlashAttribute 这个数据只取一次redirectAttributes.addFlashAttribute("errors", errors);return "redirect:http://auth.gulimall.com/reg.html";}}
相关文章:
谷粒商城----认证服务
一、短信验证码(阿里云短信服务) Data ConfigurationProperties(prefix "spring.cloud.alicloud.sms") Component public class SmsComponent {private String host;private String path;private String skin;private String sign;private S…...
Mediasoup源码介绍
一、Mediasoup 整体结构 整个Mediasoup库通过Nodejs管理,比如整体逻辑、worker、router、producer、consumer...都是通过JS进行管理的。 其底层的数据传输是通过C部分进行控制的,通过NodeJs来控制C部分,以实现整体的数据传输效 二、Mediasou…...
GIS入门,WKT格式详解
WKT介绍 WKT是Well-known Text的缩写,它是一种用于描述地理空间几何对象的文本格式。 WKT是一种开放的国际标准,由Open Geospatial Consortium(OGC)定义和维护。 WKT是一种标准的表示方法,可以用来描述点、线、面等地理空间对象的形状和位置。通过使用一系列的坐标点和关…...
Qt之postEvent
基本介绍 postEvent方法所属类为QCoreApplication,完整声明如下: [static] void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority Qt::NormalEventPriority) 该方法的作用是将要发送的事件推送到对应线程的事件队列中&…...
1976~2020年青藏高原典型冰川及冰湖遥感监测数据集
冰川面积是反应气候变化最直接的指标之一。在全球变暖的大背景下,对于评估冰川融化造成的生态、全球气候变化和水资源价值评价等问题十分重要。本文针对受西风和印度洋夏季风影响下的青藏高原冰川及其末端冰湖的变化特征,制作了近44年来时相相对连续的冰…...
时序预测 | MATLAB实现LSSVM最小二乘支持向量机时间序列预测未来
时序预测 | MATLAB实现LSSVM最小二乘支持向量机时间序列预测未来 目录 时序预测 | MATLAB实现LSSVM最小二乘支持向量机时间序列预测未来预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现LSSVM时间序列预测未来(最小二乘支持向量机); 2.运行环境Mat…...
windows10 使用WSL2安装原生docker
1.升级WSL2 我的 win10 wsl默认版本是1,先要升级WSL2不然不支持systemd(后台守护进程) 双击直接安装就行,安装包网上都能找到: Microsoft.WSL_1.3.17.0_x64_ARM64.msixbundle 执行 wsl --version 显示这样成功了: C:\Users\xx>wsl --version WSL …...
jupylab pandas按条件批量处理xls数据
批量处理xls表数据 引入相关包 import pandas as pd import xlrd import numpy as np# 去掉jupyleb警告 import warnings warnings.filterwarnings("ignore")from IPython.core.interactiveshell import InteractiveShell InteractiveShell.ast_node_interactivity…...
RJ45水晶头网线顺序出错排查
线序 网线水晶头RJ45常用的线序标准ANSI / TIA-568定义了T568A与T568B两种线序,一般使用T568B,水晶头8个孔对应的8条线颜色如下图: 那1至8的编号,是从水晶头哪一面为参考呢,如下图,是水晶头金手指一面&am…...
【洛谷 P1115】最大子段和 题解(贪心算法)
最大子段和 题目描述 给出一个长度为 n n n 的序列 a a a,选出其中连续且非空的一段使得这段和最大。 输入格式 第一行是一个整数,表示序列的长度 n n n。 第二行有 n n n 个整数,第 i i i 个整数表示序列的第 i i i 个数字 a i …...
uni-app--》基于小程序开发的电商平台项目实战(一)
🏍️作者简介:大家好,我是亦世凡华、渴望知识储备自己的一名在校大学生 🛵个人主页:亦世凡华、 🛺系列专栏:uni-app 🚲座右铭:人生亦可燃烧,亦可腐败…...
入门人工智能 —— 学习一门编程语言 python 基础代码编写和运算符介绍(1)
入门人工智能 —— 学习一门编程语言 python(1) 入门流程1.安装pythonwindowslinux ubuntu 代码编写打印输出结果 基本加减法介绍基本运算符 随着人工智能技术的快速发展,越来越多的年轻人开始关注这个领域。作为入门者,学习人工智…...
【java安全】CommonsBeanUtils1
文章目录 【java安全】CommonsBeanUtils1前言Apache Commons BeanutilsBeanComparator如何调用BeanComparator#compare()方法?构造POC完整POC 调用链 【java安全】CommonsBeanUtils1 前言 在之前我们学习了java.util.PriorityQueue,它是java中的一个优…...
JVM优化(OOM,内存溢出),查看线程快照,堆内存情况等问题
1:堆大小 新生代 老年代,新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ) 2:-Xmn参数总是应当小于-Xmx参数,否则就会触发OOM错误 3:jvm优化与查看gc回收情况&#x…...
git 给分支添加描述
需求:分支多了不知道当前分支的用处可以使用git br用来描述 效果: 全局安装命令 npm i -g git-br 项目内使用 git br 给f-230825-4-zhou分支备注 git config branch.f-230825-4-zhou.description 用来开发第四迭代需求 再次git br查看效果...
SpringBoot+Vue 整合websocket实现简单聊天窗口
效果图 1 输入临时名字充当账号使用 2 进入聊天窗口 3 发送消息 (复制一个页面,输入其他名字,方便展示效果) 4 其他窗口效果 代码实现 后端SpringBoot项目,自行创建 pom依赖 <dependency><groupId…...
PCB layout在布线上的设计规范有哪些?
PCB Layout是一项技术活,也是经验活,良好的PCB Layout布线可帮助工程师确保最终的电路板性能、可靠性和制造质量,因此是很多电子工程师的学习重点,下面我们来盘点下PCB Layout关于布线的规范有哪些。 1、地管的引脚接地越短越好&a…...
喜报丨迪捷软件入选浙江省2023年省级产业数字化服务商
近日,根据《关于组织开展2023年度省级产业数字化服务商申报工作的通知》要求,省经信厅公布2023年省级产业数字化服务商名单,浙江迪捷软件科技有限公司榜上有名。 省级产业数字化服务商上榜名单的评选在企业申报、地方推荐、专家评审、综合评估…...
verilog写rom,采用端口排序顺序例化
verilog写rom,采用端口排序顺序例化 1,介绍rom,以及rom与ram的区别2,RTL设计模块、门级网表以及testbench测试模块2.1 RTL设计2.2 门级网表2.3 testbench3,波形输出1,介绍rom,以及rom与ram的区别 参考文献: 1, 转载-ROM、RAM存储器原理详解以及DRAM、SRAM、SDRAM 、FLA…...
基于SSM的共享客栈管理系统的设计与实现
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…...
基于MCP协议构建AI驱动的Upwork自动化工作流:从工具化接口到安全实践
1. 项目概述:一个连接AI与自由职业平台的智能桥梁如果你是一名自由职业者,或者正在探索如何用AI来优化你的工作流程,那么你肯定对在Upwork、Fiverr这类平台上反复刷新、筛选项目、撰写提案的繁琐过程深有体会。每天花上几个小时,只…...
基于Nuxt 4与Shadcn/ui的现代化全栈仪表板模板开发指南
1. 项目概述:一个现代化的全栈仪表板起点如果你正在寻找一个能快速启动企业级后台管理、数据可视化或内容管理系统的技术栈,那么你很可能已经厌倦了从零开始配置的繁琐。每次新项目,都要重新折腾 Nuxt 的配置、UI 组件库的集成、样式工具链、…...
告别报错!保姆级教程:在PyCharm 2023.3上完美安装ManimCE(附国内镜像加速)
在PyCharm 2023.3中零失败安装ManimCE的终极指南 当数学可视化遇上Python,ManimCE无疑是当前最强大的工具之一。但对于许多开发者来说,从环境配置到成功运行第一个动画,这段旅程往往充满坎坷。本文将彻底解决安装过程中的所有痛点,…...
半导体制造模式之争:IDM与Fabless的战略选择与未来趋势
1. 半导体制造模式的世纪之争:IDM与Fabless的路线抉择“真男人就该有自己的晶圆厂。” 这句话出自AMD创始人杰里桑德斯之口,在半导体产业的早期,它像一句战斗口号,定义了那个时代顶级芯片公司的雄心——将设计与制造牢牢掌握在自己…...
Elasticsearch管理利器:es-client全方位指南与实战技巧
Elasticsearch管理利器:es-client全方位指南与实战技巧 【免费下载链接】es-client elasticsearch客户端,issue请前往码云:https://gitee.com/qiaoshengda/es-client 项目地址: https://gitcode.com/gh_mirrors/es/es-client 你是否曾…...
基于LM567的反射式红外检测电路在智能车信标检测中的实战应用与优化
1. LM567红外检测电路基础解析 第一次接触LM567芯片是在五年前的智能车竞赛备赛期间,当时为了解决传统红外检测易受环境光干扰的问题,我们团队尝试了各种方案。这款看似普通的8脚芯片,却让我们成功实现了在强光环境下稳定工作的红外检测系统。…...
3种高效方案:让Windows直接运行Android应用的全新体验手册
3种高效方案:让Windows直接运行Android应用的全新体验手册 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 想象一下这样的场景:您需要在电脑上快…...
GraphQL在后端开发中的应用与优势
在现代后端开发领域,GraphQL作为一种新兴的API查询语言,正迅速改变着开发者构建和交互数据的方式。与传统的RESTful API相比,GraphQL提供了一种更灵活、高效的数据获取机制,使前端能够精准地请求所需数据,避免了过度获…...
用Python自动化Photoshop:解锁高效图像处理的终极指南
用Python自动化Photoshop:解锁高效图像处理的终极指南 【免费下载链接】photoshop-python-api Python API for Photoshop. 项目地址: https://gitcode.com/gh_mirrors/ph/photoshop-python-api Photoshop Python API 是一款强大的工具包,让开发者…...
3分钟掌握GeoJSON.io:零代码地理数据可视化的革命性工具
3分钟掌握GeoJSON.io:零代码地理数据可视化的革命性工具 【免费下载链接】geojson.io A quick, simple tool for creating, viewing, and sharing spatial data 项目地址: https://gitcode.com/gh_mirrors/ge/geojson.io 还在为复杂的地理信息系统软件而烦恼…...
