2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > java实现发送短信验证码 短信验证码防刷校验-49

java实现发送短信验证码 短信验证码防刷校验-49

时间:2023-10-07 02:27:55

相关推荐

java实现发送短信验证码 短信验证码防刷校验-49

一:认证服务环境搭建

1.新建gulimail-auth-server

2.整合相关依赖

<!--引入commom依赖--><dependency><groupId>com.sysg.gulimail</groupId><artifactId>gulimail-common</artifactId><version>0.0.1-SNAPSHOT</version><!--排除掉数据库相关依赖--><exclusions><exclusion><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId></exclusion></exclusions></dependency>

3.将gulimail-auth-server配置进nacos

1)在application.properties配置文件中配置

spring.application.name=gulimail-auth-serverspring.cloud.nacos.discovery.server-sddr=127.0.0.1:8848server.port=20000

2)在主启动类添加注解

//开启服务注册发现功能@EnableDiscoveryClient//开启服务远程调用功能@EnableFeignClients

3)开启服务

4.导入登录注册页面

将静态资源放到nginx里面,实现动静分离

5.配置网关

- id: gulimail_auth_routeuri: lb://gulimail-auth-serverpredicates:- Host=

二:springMVC映射请求到页面

1.新建config

@Configuration/*** 页面跳转控制类*/public class GulimailWebConfig implements WebMvcConfigurer {/*** 视图映射* @param registry*/@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/login.html").setViewName("login");registry.addViewController("/reg.html").setViewName("reg");}}

三:验证码倒计时

1.点击验证码,进入60秒倒计时

<a id="sendCode">发送验证码</a>

$(function () {$("#sendCode").click(function () {/*** 1.给指定手机发送验证码* 2.添加验证码倒计时功能*///判断有没有正在进行倒计时操作if($(this).hasClass("disabled")){//正在倒计时} else {//给指定的手机发送验证码let phone = $("#phoneNumber").val();$.get("/sms/controller?phone="+phone);timeoutChangeStyle();}});});let num = 60;function timeoutChangeStyle(){$("#sendCode").attr("class","disabled");if( num == 0){$("#sendCode").text("发送验证码");num = 60;$("#sendCode").attr("class","");} else {let str = num+"s 后再次发送";$("#sendCode").text(str);setTimeout("timeoutChangeStyle()",1000);}num--;}

四:阿里云配置发送短信验证码

1.登陆阿里云,购买0元五次套餐

2.短信验证码接口

调用地址:http(s)://dfsns./data/send_sms

请求方式:POST

返回类型:JSON

3.代码实现

package com.sysg.ponent;import com.sysg.gulimail.thirdparty.util.HttpUtils;import lombok.Data;import org.apache.http.HttpResponse;import org.springframework.boot.context.properties.ConfigurationProperties;import org.ponent;import java.util.HashMap;import java.util.Map;@Data@Component@ConfigurationProperties(prefix = "spring.cloud.alicloud.sms")public class SmsCpmponent {private String host;private String path;private String templateId;private String appcode;public void sendSmsCode(String phone,String code){String method = "POST";Map<String, String> headers = new HashMap<String, String>();//最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105headers.put("Authorization", "APPCODE " + appcode);//根据API的要求,定义相对应的Content-Typeheaders.put("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");Map<String, String> querys = new HashMap<String, String>();Map<String, String> bodys = new HashMap<String, String>();bodys.put("content", "code:"+code);bodys.put("phone_number", phone);bodys.put("template_id", templateId);try {HttpResponse response = HttpUtils.doPost(host, path, method, headers, querys, bodys);System.out.println(response.toString());//获取response的body//System.out.println(EntityUtils.toString(response.getEntity()));} catch (Exception e) {e.printStackTrace();}}}

host;path;templateId;appcode等参数动态配置@ConfigurationProperties(prefix = “spring.alicloud”)将配置信息绑定到配置文件

#数据源spring:cloud:#nacos地址nacos:discovery:server-addr: 127.0.0.1:8848#阿里云的子系统用户名和密码alicloud:access-key: LTAIfwfwfwewefewfoZ5dhsecret-key: disClqm4wefwefewffoss:endpoint: bucket: gulimail-sysgsms:host: https://dfsns.path: /data/send_smstemplateId: TPL_0000appcode: 712wefwefweab39a78#服务的名称,用于让nacos知道那个服务正在被调用application:name: gulimail-third-party#端口server:port: 30000

4.本地调试

1)引入httpUtil依赖

/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java

2)引入processor依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency>

3)测试成功

五:短信验证码后台接口

1.新建SmsSendController,用来处理短信验证码发送功能

@RestController@RequestMapping("/sms")public class SmsSendController {@Autowiredprivate SmsComponent smsComponent;/*** 提供给别的服务进行调用* @param phone* @param code* @return*/@GetMapping("/sendcode")public R sendCode(@RequestParam("phone") String phone, @RequestParam("code")String code){smsComponent.sendSmsCode(phone,code);return R.ok();}}

2.在auth模块远程调用短信验证码功能

1)新建ThirdPartFeignService

@FeignClient("gulimail-third-party")public interface ThirdPartFeignService {@GetMapping("/sms/sendcode")public R sendCode(@RequestParam("phone") String phone, @RequestParam("code")String code);}

2)随机生成六位随机数字

/*** 生成随机数*/public class RandomUUID {/*** 生成六位数字随机数* @return*/public static String randomSixNumber(){StringBuilder str = new StringBuilder();Random random = new Random();for (int i = 0; i < 6 ; i++) {//随机生成10以内的数字int number = random.nextInt(10);str.append(number);}return str.toString();}}

3)添加发送验证码功能

@Controllerpublic class LoginController {@Autowiredprivate ThirdPartFeignService thirdPartFeignService;@GetMapping("/sms/sendcode")public R sendCode(@RequestParam("phone") String phone){//随机生成验证码String code = RandomUUID.randomSixNumber();thirdPartFeignService.sendCode(phone,code);return R.ok();}}

注:随机生成的验证码就是发送到你手机上的验证码

3.测试发送短信验证码

//给指定的手机发送验证码let phone = $("#phoneNumber").val();$.get("/sms/sendcode?phone="+phone);

发送成功

思考:如果刷新页面后,再次获取验证码,就会重置60秒,所以验证码的60s必须是严格意义上的60s。并且需要给验证码设置超时时间。

六:验证码防刷校验,设置过期时间

1)给auth模块引入redis依赖

<!--引入redis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

2)配置redis地址

spring.redis.host=127.0.0.1spring.redis.port=6379

3)存储到redis中。key-phone,value-code

@GetMapping("/sms/sendcode")@ResponseBodypublic R sendCode(@RequestParam("phone") String phone){//1.接口防刷,防止同一个手机号60s内再次发送String redisCode = stringRedisTemplate.opsForValue().get(AuthServerConstant.SMS_CODE_CACHE_PREFIX + phone);if(!StringUtils.isEmpty(redisCode)){long redisDate = Long.parseLong(redisCode.split("_")[1]);if(System.currentTimeMillis() - redisDate < 60000){//60秒内不可以再发return R.error(BizCodeEnume.SMS_CODE_EXCEPTION.getCode(),BizCodeEnume.SMS_CODE_EXCEPTION.getMsg());}}//随机生成验证码String code = RandomUUID.randomSixNumber();String dateCode = code + "_" + System.currentTimeMillis();//2.验证码的再次校验,存储到redis中。key-phone,value-code//key——"sms:code:15648961564" value-564986//保存到redis里面,并设置10分钟超时时间stringRedisTemplate.opsForValue().set(AuthServerConstant.SMS_CODE_CACHE_PREFIX + phone,dateCode,10, TimeUnit.MINUTES);thirdPartFeignService.sendCode(phone,code);return R.ok();}

key-phone,value-codekey-“sms:code:15648961564” value-564986

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。