用户注册时一般采用短信验证码注册,登录也是一样,那么短信验证码是怎么发送的呢
短信验证码肯定是国内运营商发送的,但是个人或者小公司想要直接和运营商对接不太现实,所以我们可以使用第三方提供的短信发送服务
使用阿里云提供的短信服务:
前置操作:注册阿里云账号,登录账号
1:进入短信服务模块,申请签名
2:申请模板,需要关联签名
3:创建AccessKey
4:根据需求选择API
5:复制到工具类,导入依赖坐标,修改参数
6.封装成工具类
public class SendSms {
private static String AccessKeyID = "xxxx"; //输入第三步获取的AccessKey
private static String AccessKeySecret = "xxxx"; //输入secret
public static void send(String phoneNumbers, String templateParam) {
// HttpClient Configuration
// Configure Credentials authentication information, including ak, secret, token
StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder()
.accessKeyId(AccessKeyID)
.accessKeySecret(AccessKeySecret)
//.securityToken("<your-token>") // use STS token
.build());
// Configure the Client
AsyncClient client = AsyncClient.builder()
.region("cn-qingdao") // Region ID
//.httpClient(httpClient) // Use the configured HttpClient, otherwise use the default HttpClient (Apache HttpClient)
.credentialsProvider(provider)
//.serviceConfiguration(Configuration.create()) // Service-level configuration
// Client-level configuration rewrite, can set Endpoint, Http request parameters, etc.
.overrideConfiguration(
ClientOverrideConfiguration.create()
.setEndpointOverride("dysmsapi.aliyuncs.com")
//.setConnectTimeout(Duration.ofSeconds(30))
)
.build();
// Parameter settings for API request
SendSmsRequest sendSmsRequest = SendSmsRequest.builder()
.signName("XXXX")
.templateCode("XXXX")
.phoneNumbers(phoneNumbers)
.templateParam("{\"code\":\"" + templateParam + "\"}")
// Request-level configuration rewrite, can set Http request parameters, etc.
// .requestConfiguration(RequestConfiguration.create().setHttpHeaders(new HttpHeaders()))
.build();
// Asynchronously get the return value of the API request
CompletableFuture<SendSmsResponse> response = client.sendSms(sendSmsRequest);
// Synchronously get the return value of the API request
SendSmsResponse resp = null;
try {
resp = response.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println(new Gson().toJson(resp));
// Asynchronous processing of return values
// Finally, close the client
client.close();
}
}
7.业务层调用工具类
/*
* 用户登录获取验证码
* */
@RequestMapping(value = "/userLogin.action")
@ResponseBody
public String toUserLoginUI(String tel, HttpServletRequest request) {
Random random = new Random();
String templateParam = (int) (random.nextDouble() * 9000 + 1000) + "";
System.out.println(templateParam);
//SendSms.send(tel,templateParam); //调用工具类发送验证码
//将验证码和手机号添加到域对象
request.getSession().setAttribute(tel, templateParam);
request.getSession().setMaxInactiveInterval(60*5);
return "200";
}
这样用户就可以收到短信了,接下来的操作就是把用户输入的验证码和手机号与session域数据校验