Maven依赖

     <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.0.6</version> <!-- 注:如提示报错,先升级基础包版,无法解决可联系技术支持 --></dependency><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-dysmsapi</artifactId><version>1.1.0</version></dependency>

1.去阿里云注册账号后创建短信模板和短信签名(在后边需要用到短信签名以及短信模板版)

2.创建AccessKeyId

3.代码实现发送短信


import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;public class SendSMSUtil {// 替换成你的AKprivate static final String accessKeyId = "*********";// 你的accessKeyIdprivate static final String accessKeySecret = "***********";// 你的accessKeySecretprivate static final String signName = "*********";// 签名private static final String templateCode = "**********";// 短信模板private static int code;/*** @Description:发送手机验证码* @Param:需要发送的手机号码* @return:OK表示成功,失败则返回失败信息*/public String senSMSUtil(String phoneNumber) {// 设置超时时间-可自行调整System.setProperty("sun.net.client.defaultConnectTimeout", "10000");System.setProperty("sun.net.client.defaultReadTimeout", "10000");// 初始化ascClient需要的几个参数final String product = "Dysmsapi";// 短信API产品名称(短信产品名固定,无需修改)final String domain = "dysmsapi.aliyuncs.com";// 短信API产品域名(接口地址固定,无需修改)// 初始化ascClient,暂时不支持多region(请勿修改)IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);try {DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);} catch (ClientException e) {e.printStackTrace();}IAcsClient acsClient = new DefaultAcsClient(profile);// 组装请求对象SendSmsRequest request = new SendSmsRequest();// 使用post提交request.setMethod(MethodType.POST);// 必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,// 验证码类型的短信推荐使用单条调用的方式;发送国际/港澳台消息时,接收号码格式为国际区号+号码,如“85200000000”request.setPhoneNumbers(phoneNumber);request.setSignName(signName);// 必填:短信模板-可在短信控制台中找到,发送国际/港澳台消息时,请使用国际/港澳台短信模版request.setTemplateCode(templateCode);//随机生成六位验证码code = (int) ((Math.random() * 9 + 1) * 100000);// 可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为// 友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败request.setTemplateParam("{code:" + code + "}");// 请求失败这里会抛ClientException异常SendSmsResponse sendSmsResponse = null;try {sendSmsResponse = acsClient.getAcsResponse(request);} catch (ClientException e) {e.printStackTrace();return "请求失败";}assert sendSmsResponse.getCode() != null;if (sendSmsResponse.getCode() == null || !sendSmsResponse.getCode().equals("OK")) {// 发送不成功return sendSmsResponse.getMessage();}// 请求成功return "OK";}public int getCode() {return code;}
}

4.完善发送短信接口


/*** @Description:发送手机验证码* @Param:手机号码* @return:1表示成功,0表示失败*/@RequestMapping(value = "/SendSMS", method = RequestMethod.POST)@ResponseBodypublic String SMSTest(String phoneNumber, HttpServletRequest request) {// 发送短信SendSMSUtil sendSMS = new SendSMSUtil();String result = sendSMS.senSMSUtil(phoneNumber);if (result == null || !result.equals("OK")) {// 发送不成功return "0";}// 获取验证码int code = sendSMS.getCode();// 将数据存入SESSIONrequest.getSession().setAttribute("checkCode", code);// 将验证码生成时间存入SESSION,若超过五分钟则不通过校验request.getSession().setAttribute("createTime", System.currentTimeMillis());return "OK";}

5.校验验证码接口

/*** @Description:校验验证码是否正确* @Param:验证码* @return:成功返回OK,验证码超时返回TimeOut,验证码错误返回CodeError*/@RequestMapping(value = "/checkSMSCode", method = RequestMethod.POST)@ResponseBodypublic String checkSMSCode(String checkSMSCode, HttpServletRequest request) {// 服务器放入的验证码String serverCheckCode = request.getSession().getAttribute("checkCode").toString();// 验证码创建时间String serverCreateTime = request.getSession().getAttribute("createTime").toString();// 当前时间long uCreateTime = Long.parseLong(String.valueOf(System.currentTimeMillis()));if (serverCheckCode == null || serverCreateTime == null || serverCheckCode.equals("") || serverCreateTime.equals("")) {return "CodeError";}if (!checkSMSCode.equals(serverCheckCode)) {// 验证码不匹配return "CodeError";}long sCreateTime = Long.parseLong(serverCreateTime);// 验证码创建时间if (uCreateTime - sCreateTime >= 300000) {// 如果时间大于五分钟return "TimeOut";}return "OK";}

6.测试


注意查看浏览器中的地址,发送与校验验证码均是返回OK,此时则为登录成功。

附上测试接口的jsp页面代码

 <%--Created by IntelliJ IDEA.User: GuiHDate: 2019-04-24Time: 11:33To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
login page
<fieldset><form action="/SendSMS" method="post">手机号:<input type="text" name="phoneNumber"><input type="submit" value="发送"></form><form action="/checkSMSCode" method="post">验证码:<input type="text" name="checkSMSCode"><input type="submit" value="提交"></form></fieldset>
</body>
</html>

到此短信验证码功能就完成了,此处使用的是使用会话中的SESSION来完成的短信验证码,还可以尝试使用ehcache缓存框架来实现。

使用Java五步实现短信验证码登录相关推荐

  1. Java开发完整的短信验证码功能

    现代互联网项目中,很多场景下都需要使用一种叫做验证码的技术,常用的有图片验证码,滑块验证码,短信验证码等,本文章描述的就是短信验证码的一个使用教程,从0开始完成一个验证码功能的开发. 版权说明 本文中 ...

  2. java 随机手机验证码_基于Java随机生成手机短信验证码的实例代码|chu

    简单版 /** * 产生4位随机数(0000-9999) * * @return 4位随机数 */ public static String getFourRandom() { return Stri ...

  3. java发送网易云短信验证码(语音和短信)

    java发送网易云短信验证码(语音和短信) 1,先拷贝架包 commons-codec commons-codec 1.10 org.apache.httpcomponents httpclient ...

  4. java+生成手机验证码_基于Java随机生成手机短信验证码的实例代码

    简单版 /** * 产生4位随机数(0000-9999) * * @return 4位随机数 */ public static String getFourRandom() { return Stri ...

  5. java antd实现登录,基于 antd pro 的短信验证码登录

    概要 整体流程 前端 页面代码 请求验证码和登录的 service (src/services/login.js) 处理登录的 model (src/models/login.js) 后端 短信验证码 ...

  6. java短信验证码登录功能设计与实现

    前言 现在不管是各类的网站,还是大小社交app,登录方式是越来越多了,其中基于短信验证码的登录可以说是各类app必不可少的方式,短信验证码登录以其高效,安全,便捷等特性受到许多用户的青睐 业务案例 如 ...

  7. SpringSecurity短信验证码登录

    短信验证码登录 时下另一种非常常见的网站登录方式为手机短信验证码登录,但Spring Security默认只提供了账号密码的登录认证逻辑,所以要实现手机短信验证码登录认证功能,我们需要模仿Spring ...

  8. 若依RuoYi整合短信验证码登录

    背景:若依默认使用账号密码进行登录,但是咱们客户需要增加一个短信登录功能,即在不更改原有账号密码登录的基础上,整合短信验证码登录. 一.自定义短信登录 token 验证 仿照 UsernamePass ...

  9. 5.Spring Security 短信验证码登录

    Spring Security 短信验证码登录 在 Spring Security 添加图形验证码一节中,我们已经实现了基于 Spring Boot + Spring Security 的账号密码登录 ...

最新文章

  1. 云计算安全:技术与应用
  2. Spring MVC报异常:org.springframework.web.util.NestedServletException: Request processing failed
  3. fatal error C1002: 在第2遍中编译器的堆空间不足
  4. odata连接现有数据库
  5. Linux常用命令--文件(夹)查找之find命令
  6. Java04异常、断言、日志和调试
  7. try catch线程问题???
  8. linux socket ip层配置,Linux下Socket通信(TCP实现)
  9. Oozie 3.3.1安装
  10. [UI界面]-UIWindow
  11. 详解Python线程对象daemon属性对线程退出的影响
  12. MIKE水动力笔记6_如何自己制作实测数据的时间序列文件dfs0
  13. [iOS] 通知详解: iOS 10 UserNotifications -- 附加包Media Attachments
  14. 计算机网络 MOOC 哈尔滨工程大学 pdf课件
  15. 山东大学软件学院2021算法导论期末试题
  16. 2020张宇高数36讲PDF
  17. 三种css样式应用方式,CSS样式三种形式
  18. spotbug常见错误心得
  19. Facebook频繁封号,如何解封?
  20. Shell按关键字删除重复行

热门文章

  1. 视频编解码——熵编码的概念
  2. [编程之美]买票找零(卡特兰数)
  3. 惠普elitebook系列电脑 安装新固态不识别处理方法
  4. hive之mapjoin
  5. [转]大家现在做J2ME工资多少啊
  6. intValue()的用法,以及与parseInt()和valueOf 的区别
  7. 一些零碎的语言,却触动到内心深处。
  8. 中国56个民族的下拉列表
  9. 计算机排位函数升序是0还是1,Excel中Rank函数排序的方法,包含相同数字按顺序排位和分段排序-excel排序...
  10. 和平精英登录为什么显示服务器暂未开放,和平精英怎么登录不了 登陆方法介绍[多图]...