>  기사  >  Java  >  Java는 인증 코드 SMS를 보내는 기능을 구현합니다.

Java는 인증 코드 SMS를 보내는 기능을 구현합니다.

王林
王林앞으로
2021-01-20 09:52:533007검색

Java는 인증 코드 SMS를 보내는 기능을 구현합니다.

기능 요구 사항:

(학습 동영상 공유: java 동영상 튜토리얼)

1. 백그라운드에서 무작위로 4자를 생성합니다.

2. 1분 이내에 인증 코드는 1개만 전송됩니다. 1분이 넘었지만 5분 이내에 전송된 인증 코드는 여전히 처음 생성된 인증 코드 문자입니다

4. 5분 이상이 지나면 새로운 인증 코드가 생성됩니다

어떤 프레임워크인지는 중요하지 않습니다. 프론트엔드에서 사용

구성에 따라 다름

SMS는 Redis에 인증번호와 휴대폰 번호가 저장되어 있기 때문에 패키지 Redis 구성에 따라 다릅니다.

SMS 플랫폼에서 사용하는 네트워크 SMS인 http://www. smschinese.cn/은 5가지 테스트로 무료로 사용할 수 있습니다

참고: 구성 인터페이스의 계정 이름과 키는 사람마다 다르므로 복사한 후 변경하는 것을 잊지 마세요

SMS 종속성 패키지

 <!--短信jar包-->
        <dependency>
            <groupId>commons-httpclient</groupId>
            <artifactId>commons-httpclient</artifactId>
            <version>3.1</version>
        </dependency>

redis jar 패키지

<!--redis jar 包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

redis를 사용하기 전에 먼저 연결을 구성하고 application.properties에서 구성해야 합니다.

# redis 属性信息
## redis数据库索引(默认为0)
spring.redis.database=0
## redis服务器地址
spring.redis.host=localhost
## redis服务器连接端口
spring.redis.port=6379
## redis服务器连接密码(默认为空)
## spring.redis.password=123456
## 连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=8
## 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=8
## 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=-1ms
## 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0

도구 클래스 만들기 StrUtils.getComplexRandomString() // 임의의 문자 수를 가져와 직접 입력하세요

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * @author yaohuaipeng
 * @date 2018/10/26-16:16
 */
public class StrUtils {
    /**
     * 把逗号分隔的字符串转换字符串数组
     *
     * @param str
     * @return
     */
    public static String[] splitStr2StrArr(String str,String split) {
        if (str != null && !str.equals("")) {
            return str.split(split);
        }
        return null;
    }


    /**
     * 把逗号分隔字符串转换List的Long
     *
     * @param str
     * @return
     */
    public static List<Long> splitStr2LongArr(String str) {
        String[] strings = splitStr2StrArr(str,",");
        if (strings == null) return null;

        List<Long> result = new ArrayList<>();
        for (String string : strings) {
            result.add(Long.parseLong(string));
        }

        return result;
    }
    /**
     * 把逗号分隔字符串转换List的Long
     *
     * @param str
     * @return
     */
    public static List<Long> splitStr2LongArr(String str,String split) {
        String[] strings = splitStr2StrArr(str,split);
        if (strings == null) return null;

        List<Long> result = new ArrayList<>();
        for (String string : strings) {
            result.add(Long.parseLong(string));
        }

        return result;
    }

    public static String getRandomString(int length) {
        String str = "0123456789";
        Random random = new Random();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < length; i++) {
            int number = random.nextInt(10);
            sb.append(str.charAt(number));
        }
        return sb.toString();

    }

    public static String getComplexRandomString(int length) {
        String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        Random random = new Random();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < length; i++) {
            int number = random.nextInt(62);
            sb.append(str.charAt(number));
        }
        return sb.toString();
    }

    public static String convertPropertiesToHtml(String properties){
        //1:容量:6:32GB_4:样式:12:塑料壳
        StringBuilder sBuilder = new StringBuilder();
        String[] propArr = properties.split("_");
        for (String props : propArr) {
            String[] valueArr = props.split(":");
            sBuilder.append(valueArr[1]).append(":").append(valueArr[3]).append("<br>");
        }
        return sBuilder.toString();
    }

}

SMS 전송 클래스 만들기 다른 클래스는 이 클래스의 send 메소드를 호출하여 휴대폰 번호를 전달하고 내용을 보낼 수 있습니다

import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;

import java.io.IOException;

public class SendMsgUtils {
    private static final String UID = "amazingwest";//这是建网SMS 上的登陆账号
    private static final String KEY = "d41d8cd98f00b204e980"; //这是密钥

    /**
     * 手机发送短信
     * @param phone  手机号码
     * @param context  发送短信内容
     */
    public static void send(String phone, String context) {

        PostMethod post = null;
        try {
            //创建Http客户端
            HttpClient client = new HttpClient();
            //创建一个post方法
            post = new PostMethod("http://utf8.api.smschinese.cn");
            //添加请求头信息
            post.addRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf8");//在头文件中设置转码

            NameValuePair[] data = {new NameValuePair("Uid", UID),
                    new NameValuePair("Key", KEY),
                    new NameValuePair("smsMob", phone),
                    new NameValuePair("smsText", context)};
            //设置请求体
            post.setRequestBody(data);
            //执行post方法
            client.executeMethod(post);

            //获取响应头信息
            Header[] headers = post.getResponseHeaders();
            //获取状态码
            int statusCode = post.getStatusCode();
            System.out.println("statusCode:" + statusCode);
            //循环打印头信息
            for (Header h : headers) {
                System.out.println(h.toString());
            }
            //获取相应体
            String result = new String(post.getResponseBodyAsString().getBytes("utf8"));
            System.out.println(result); //打印返回消息状态

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (post != null) {
                //关闭资源
                post.releaseConnection();
            }
        }
    }


}

등록 상수 클래스를 생성합니다. 주로 등록, 로그인 또는 비밀번호에 인증 코드가 사용되는지 구별하는 데 사용됩니다. 검색

/**
 * 验证码常量
 */
public class VerificationConstant {

    //用户注册常量
    public static final String USER_REG = "user_reg";
}

프런트 데스크에서 인증 코드를 보내려면 클릭하세요. 먼저 여러 사용자의 동시 등록을 고려하고 키 값을 하드 코딩할 수 없습니다

먼저 휴대폰 번호에 따라 등록 ID(KEY)를 추가하세요. Redis에 값이 존재하는지 확인하고, 존재하지 않는 경우 키를 생성합니다. 키는 휴대폰 번호 + 등록 ID입니다.

시간, 즉 Redis 키-값 쌍을 생성할 때 현재 타임스탬프가 생성됩니다. 생성된 시간이 값으로 나누어집니다. 현재 타임스탬프에서 첫 번째 생성의 타임스탬프를 빼면 특정 시간이 생성됩니다. 키의 생존시간은 5분 300초이며, 휴대폰번호는 프론트엔드에서 전송되며, 여기서는 휴대폰번호 등록 여부를 판단할 필요가 없습니다. redisTemplate을 사용하려면 redis jar 패키지

StrUtils.getComplexRandomString(4)을 도입해야 합니다. 위에서 생성한 도구 클래스입니다. 4자리 난수를 생성하는 방법 중 하나인
StringUtils.isEmpty는 import org.springframework입니다. util.StringUtils 오해하지 마세요

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.concurrent.TimeUnit;

@Service
public class VerificationCodeServiceImpl implements IVerificationCodeService {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 发送注册验证码
     * 验证码需求:
     *      1.后台随机产生4个字符
     *      2.1分钟以内只能发送1次验证码
     *      3.超过1分钟,但在5分钟以内,发送的验证码依然是第一次产生的验证码字符
     *      4.超过了5分钟以后,产生全新的验证码
     * @return
     */
    @Override
    public void sendRegisterVerificationCode(String phone) throws CustomException {
        //随机产生4个字符
        String value = StrUtils.getComplexRandomString(4);
        //在redis中通过key获取对应的值        value:时间戳
        String valueCode = (String) redisTemplate.opsForValue().get(phone + ":" + VerificationConstant.USER_REG);
        //如果不为空,就意味着验证码没有过期,依然是在5分钟以内
        if(!StringUtils.isEmpty(valueCode)){
            //开始时间戳
            String beginTimer = valueCode.split(":")[1];

            if(System.currentTimeMillis()-Long.valueOf(beginTimer)<=60*1000){
               //自定义异常,自己创建一个就可以了
                throw new CustomException("亲!一分钟以内不能发送多次验证码!!");
            }
            //证明是超过了1分钟,但依然在5分钟以内,还是用之前的验证码
            value = valueCode.split(":")[0];
        }
        //存储redis中,设置有效期是5分钟  k=phone:USER_REG  v= value:时间戳
//        RedisUtil.set(phone:USER_REG,  value:System.currentTimeMillis(),  5MIN);
        redisTemplate.opsForValue().set(phone + ":" + VerificationConstant.USER_REG,
                value + ":" + System.currentTimeMillis(), 5, TimeUnit.MINUTES);
        //发送手机验证码
        String context = "尊敬的用户,您的验证码为:" + value + ",请您在5分钟以内完成注册!!";
        //发送短信
//        SendMsgUtils.send(phone, context);
        System.out.println(context);


    }
}

complete.

관련 권장 사항:

Java 입문 튜토리얼

위 내용은 Java는 인증 코드 SMS를 보내는 기능을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제