ホームページ >Java >&#&はじめる >Javaは認証コードSMSを送信する機能を実装しています

Javaは認証コードSMSを送信する機能を実装しています

王林
王林転載
2021-01-20 09:52:533052ブラウズ

Javaは認証コードSMSを送信する機能を実装しています

機能要件:

(学習ビデオ共有: java ビデオ チュートリアル)

1. ランダムに 4 つの文字を生成します。背景

2. 1 分以内に送信できる確認コードは 1 つだけです。

3. 1 分を超えて 5 分以内に送信された確認コードは、生成された確認コード文字のままです。

4. 5 分以上経過すると、新しい検証コードが生成されます

フロントエンドが使用するフレームワークに関係なく

依存関係の構成

SMS 依存関係パッケージの redis 構成。確認コードと携帯電話番号が redis に保存されるためです。

SMS プラットフォームで使用されるネットワーク構築 sms、http://www.smschinese.cn/ を使用できます。無料のテスト

注: インターフェイスを構成するためのアカウント名とキーは人によって異なります。コピーして忘れずに変更してください

SMS 依存関係パッケージ

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

redis jar package

<!--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";
}

フロント デスク クリックして認証コードを送信する場合、まず複数の認証コードの同時登録を考慮する必要があります。

まず、携帯電話番号と登録識別子(KEY)を合わせた値でredis内の値が存在するかどうかを判断し、存在しない場合はキーを作成します。キー 携帯電話番号に登録マークを追加します。
時間を決定するために、Redis のキーと値のペアを作成するときに、現在のタイムスタンプが値に追加されます。値が最初に作成された場合、値は分割されます. 値から現在のタイムスタンプを減算します。特定の時間は、1 回の作成のタイムスタンプから取得できます。
初めてキー値を作成するときは、キーの生存時間を 5 分 300 秒に設定します。
送信フロントエンドから認証コードのテキストメッセージが送信され、携帯電話番号が送信されます。ここで取引を行ってください。携帯電話番号が登録されているかどうかを論理的に判断する必要はありません。これは他のクラスの問題です。redisTemplate を使用するには、 redis jar パッケージを導入する必要があります
StrUtils.getComplexRandomString(4) これは、4 桁の文字を作成するために上記で作成されたツール クラスのメソッドです。乱数
StringUtils.isEmpty は、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);


    }
}

完了です。

関連する推奨事項: Java 入門チュートリアル

以上がJavaは認証コードSMSを送信する機能を実装していますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。