一、 操作流程
- 用户输入手机号,点击发送验证码按钮
- 前端将手机号发送给后端
- 后端生成一个6位的随机数通过短信发送给用户,之后手机号为key,随机数为value,存入缓存中,最后将短信发送是否成功的结果返回给前端。
- 当用户收到短信后,输入验证码,点击登录或者注册。
- 前端将手机号与验证码,发送给后端
- 后端通过缓存验证用户的验证码是否正确,再将结果返回给前端
- 用户的验证码登录流程结束
二、实现流程
- 阿里云短信服务
- 购买短信服务(以前有100条免费的短信,现在不知道)
- 添加签名与模板
- 选择左侧的国内消息
- 签名管理中选择添加签名(签名就是发送短信时的程序名或公司名)
- 模板管理添加模板(也就是发送短信的内容)
- 选择左侧的国内消息
- 获取自己的阿里云私匙
- 左侧点击概览
- 选择AccessKey(获得私匙)
- 左侧点击概览
- 获取发送短信的代码
- 选择 OpenAPI(每个框的后面的问号是解释,填完框后将代码粘贴到idea中)
- 选择 OpenAPI(每个框的后面的问号是解释,填完框后将代码粘贴到idea中)
- 购买短信服务(以前有100条免费的短信,现在不知道)
- 书写idea里的代码
- 添加pom.xml文件
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.0.0</version>
</dependency>
- 添加阿里云短信服务(自行修改4处*****位置的值)
package com.example.shop_three.util;
@Component
public class Message {
@Autowired
RedisUtils redisUtils;
public static void messagePost(String u_phone, String message){
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "***************", "********************");
IAcsClient client = new DefaultAcsClient(profile);
CommonRequest request = new CommonRequest();
request.setSysMethod(MethodType.POST);
request.setSysDomain("dysmsapi.aliyuncs.com");
request.setSysVersion("2017-05-25");
request.setSysAction("SendSms");
request.putQueryParameter("RegionId", "cn-hangzhou");
request.putQueryParameter("PhoneNumbers",u_phone);
request.putQueryParameter("SignName", "********");
request.putQueryParameter("TemplateCode", "**********");
request.putQueryParameter("TemplateParam", "{\"code\":"+message+"}");
try {
CommonResponse response = client.getCommonResponse(request);
System.out.println(response.getData());
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
}
}
- 服务器布置redis(之前已经安装好redis的,或者本机有reids的跳过本步骤)
链接: 服务器redis的快速布置 - 添加redis工具类
package com.example.huaweiyun.util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
@Component
public class RedisUtils {
@Autowired
private RedisTemplate<String, String> redisTemplate;
/**
* 读取缓存
*
* @param key
* @return
*/
public String get(final String key) {
return redisTemplate.opsForValue().get(key);
}
/**
* 写入缓存
*/
public boolean set(final String key, String value) {
boolean result = false;
try {
redisTemplate.opsForValue().set(key, value);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 更新缓存
*/
public boolean getAndSet(final String key, String value) {
boolean result = false;
try {
redisTemplate.opsForValue().getAndSet(key, value);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 删除缓存
*/
public boolean delete(final String key) {
boolean result = false;
try {
redisTemplate.delete(key);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
- application文件添加
spring.redis.host= redis服务器地址
spring.redis.port=6379
spring.redis.password=redis密码
- service层代码
- 获取验证码
public String authcode_get(String u_phone) {
String authcode = "1"+RandomStringUtils.randomNumeric(5);//生成随机数,我发现生成5位随机数时,如果开头为0,发送的短信只有4位,这里开头加个1,保证短信的正确性
redisUtils.set(u_phone,authcode);//将验证码存入缓存
Message.messagePost(u_phone,authcode);//发送短息
return "发送成功"+authcode);
}
2. 验证码登录
public String authcode_login(String u_phone, String authcode) {
if(redisUtils.get(u_phone).equals(authcode)){
return "登录成功";
}else {
return "登录失败";
}
三、实现图片
- 请求验证码
2.验证码登录
有问题请评论区留言