国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

讓你的Demo更安全--Spring Boot實現(xiàn)短信驗證碼

這篇具有很好參考價值的文章主要介紹了讓你的Demo更安全--Spring Boot實現(xiàn)短信驗證碼。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

隨著移動互聯(lián)網(wǎng)的普及,短信驗證碼已經(jīng)成為了很多應用的常用登錄和注冊方式之一。在傳統(tǒng)的應用中,我們一般使用第三方集成商提供的短信驗證碼服務(wù)來實現(xiàn)短信驗證碼的發(fā)送和驗證,但是這些服務(wù)有可能存在時間限制、價格過高等限制。

為了解決這些問題,我們可以使用Spring Boot來自己實現(xiàn)短信驗證碼。在本文中,我將向大家介紹如何使用Spring Boot來實現(xiàn)短信驗證碼,并提供詳細的開發(fā)流程和代碼示例。


前置條件

在實現(xiàn)短信驗證碼之前,需要配置以下環(huán)境和依賴:

  • JDK 1.8或以上版本
  • Maven 3.5或以上版本
  • Spring Boot 2.0或以上版本
  • 阿里云短信服務(wù)

短信驗證碼的實現(xiàn)思路

在實現(xiàn)短信驗證碼之前,我們需要確定實現(xiàn)短信驗證碼需要哪些步驟:

  • 客戶端向服務(wù)端發(fā)送手機號碼
  • 服務(wù)端生成隨機的驗證碼并發(fā)送到該手機號碼
  • 客戶端將驗證碼發(fā)送到服務(wù)端進行校驗

根據(jù)這個思路,我們可以通過以下幾個步驟來實現(xiàn)短信驗證碼:

  1. application.properties文件中配置阿里云短信服務(wù)的AccessKey和SecretKey:
# 阿里云短信服務(wù)的AccessKey
aliyun.sms.accessKeyId=your_accessKeyId
# 阿里云短信服務(wù)的SecretKey
aliyun.sms.accessKeySecret=your_accessKeySecret
  1. 定義短信驗證碼的請求和響應類:
public class SmsRequest {
    // 手機號碼
    private String phone;
    // 驗證碼
    private String code;
    // 發(fā)送時間
    private Long timestamp;
    // 簽名
    private String signature;
    // getter和setter方法
}

public class SmsResponse {
    // 發(fā)送狀態(tài)碼
    private String code;
    // 發(fā)送消息
    private String message;
    // getter和setter方法
}
  1. 定義短信發(fā)送接口:
public interface SmsService {
    /**
     * 發(fā)送短信驗證碼
     *
     * @param phone 手機號碼
     * @return 發(fā)送狀態(tài)
     */
    SmsResponse sendSms(String phone);
}
  1. 實現(xiàn)短信發(fā)送接口:
@Service
public class SmsServiceImpl implements SmsService {
    // 阿里云短信服務(wù)的AccessKey
    @Value("${aliyun.sms.accessKeyId}")
    private String ACCESS_KEY_ID;
    // 阿里云短信服務(wù)的SecretKey
    @Value("${aliyun.sms.accessKeySecret}")
    private String ACCESS_KEY_SECRET;
    // 驗證碼的有效時間,單位為秒
    private static final int EXPIRATION = 120;

    /**
     * 發(fā)送短信驗證碼
     *
     * @param phone 手機號碼
     * @return 發(fā)送狀態(tài)
     */
    @Override
    public SmsResponse sendSms(String phone) {
        SmsResponse response = new SmsResponse();
        try {
            DefaultProfile profile = DefaultProfile.getProfile("default", ACCESS_KEY_ID, ACCESS_KEY_SECRET);
            IAcsClient client = new DefaultAcsClient(profile);

            SendSmsRequest request = new SendSmsRequest();

            // 設(shè)置短信模板
            request.setTemplateCode("SMS_123456789");

            // 生成驗證碼
            String code = String.valueOf((int)((Math.random()*9+1)*100000));

            // 將驗證碼保存到Redis緩存中
            jedis.setex(phone, EXPIRATION, code);

            Map<String, String> map = new HashMap<>(1);
            map.put("code", code);

            // 設(shè)置短信參數(shù)
            request.setTemplateParam(new Gson().toJson(map));

            request.setPhoneNumbers(phone);

            // 發(fā)送
            SendSmsResponse smsResponse = client.getAcsResponse(request);

            if (smsResponse.getCode() != null && smsResponse.getCode().equals("OK")) {
                response.setCode("200");
                response.setMessage("驗證碼發(fā)送成功");
            } else {
                response.setCode("500");
                response.setMessage("驗證碼發(fā)送失敗,請稍后再試");
            }
        } catch (Exception e) {
            response.setCode("500");
            response.setMessage("驗證碼發(fā)送失敗,請稍后再試");
            e.printStackTrace();
        }
        return response;
    }
}

在上述示例代碼中,我們使用阿里云短信服務(wù)的SDK發(fā)送短信,首先從配置文件中獲取AccessKey和SecretKey,然后生成IAcsClient對象,并設(shè)置模板代碼,生成驗證碼并保存到Redis緩存中,最后發(fā)送短信。

  1. 創(chuàng)建接口Controller:
@RestController
@RequestMapping("/api/sms")
public class SmsController {

    private final SmsService smsService;

    public SmsController(SmsService smsService) {
        this.smsService = smsService;
    }

    /**
     * 發(fā)送短信驗證碼
     * @param phone 手機號碼
     * @return 發(fā)送狀態(tài)
     */
    @GetMapping("/send")
    public SmsResponse sendSms(@RequestParam("phone") String phone) {
        return smsService.sendSms(phone);
    }
}

在上面代碼中,我們創(chuàng)建了一個發(fā)送短信驗證碼的接口,并使用@GetMapping注解將其映射到/api/sms/send路徑上。

  1. 實現(xiàn)驗證碼校驗:
@RestController
@RequestMapping("/api/sms")
public class SmsController {

    private final SmsService smsService;

    public SmsController(SmsService smsService) {
        this.smsService = smsService;
    }

    /**
     * 發(fā)送短信驗證碼
     * @param phone 手機號碼
     * @return 發(fā)送狀態(tài)
     */
    @GetMapping("/send")
    public SmsResponse sendSms(@RequestParam("phone") String phone) {
        return smsService.sendSms(phone);
    }

    /**
     * 校驗驗證碼
     * @param request 校驗請求
     * @return 校驗結(jié)果
     */
    @PostMapping("/verify")
    public ResponseEntity<?> verifySms(@RequestBody SmsRequest request) {
        String code = jedis.get(request.getPhone());
        if (code != null && code.equals(request.getCode())) {
            jedis.del(request.getPhone());
            return ResponseEntity.ok("驗證碼校驗成功");
        } else {
            return ResponseEntity.status(HttpStatus.FORBIDDEN).body("驗證碼校驗失敗");
        }
    }
}

在上述代碼中,我們創(chuàng)建了一個校驗短信驗證碼的接口,并使用@PostMapping注解將其映射到/api/sms/verify路徑上。在接口實現(xiàn)中,我們從Redis緩存中獲取驗證碼,若驗證碼有效,則從Redis緩存中刪除驗證碼并返回成功響應,否則返回失敗響應。

  1. 使用Redis緩存:
@Configuration
public class RedisConfig {

    @Value("${spring.redis.host}")
    private String host;

    @Value("${spring.redis.port}")
    private int port;

    @Bean
    JedisConnectionFactory jedisConnectionFactory() {
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(host, port);
        return new JedisConnectionFactory(redisStandaloneConfiguration);
    }

    @Bean
    RedisTemplate<String, Object> redisTemplate() {
        final RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(jedisConnectionFactory());
        template.setValueSerializer(new GenericToStringSerializer<>(Object.class));
        return template;
    }
}

在上述代碼中,我們創(chuàng)建了一個Redis配置類,并使用@Configuration注解將其標注為配置類。在jedisConnectionFactory方法中,我們設(shè)置了Redis服務(wù)器的IP和端口,并返回一個JedisConnectionFactory對象,用于獲取Jedis實例。在redisTemplate方法中,我們創(chuàng)建了一個RedisTemplate對象,并設(shè)置了序列化器和連接工廠。

至此,我們已經(jīng)完成了短信驗證碼的實現(xiàn)。

總結(jié)

Spring Boot為我們提供了快速便捷地實現(xiàn)短信驗證碼功能的方式。在本文中,我向大家展示了使用阿里云短信服務(wù)發(fā)送短信驗證碼并實現(xiàn)驗證碼校驗的代碼示例。如果您打算實現(xiàn)短信驗證碼功能,可以參考本文提供的思路和代碼示例。

在實際開發(fā)中,我們還可以根據(jù)業(yè)務(wù)需求對短信驗證碼進行更多的優(yōu)化和改進,比如添加驗證碼圖形識別、增加短信發(fā)送次數(shù)校驗、防止惡意發(fā)送、短信的批量發(fā)送等功能。

總之,短信驗證碼是現(xiàn)在很常見的一種驗證方式,其簡單、便捷、安全的特點獲得了很多企業(yè)和應用的青睞。希望本文可以對您實現(xiàn)短信驗證碼功能有所幫助。文章來源地址http://www.zghlxwxcb.cn/news/detail-465272.html

到了這里,關(guān)于讓你的Demo更安全--Spring Boot實現(xiàn)短信驗證碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 使用Spring AI讓你的Spring Boot應用快速擁有生成式AI能力

    之前分享了關(guān)于Spring新項目 Spring AI 的介紹視頻。視頻里演示了關(guān)于使用Spring AI將Open AI的能力整合到Spring應用中的操作,但有不少讀者提到是否有博客形式的學習內(nèi)容。所以,本文就將具體介紹如何使用 Spring AI 快速讓您的Spring應用擁有生成式AI的強大能力。 第一步:使用你

    2024年02月03日
    瀏覽(26)
  • Spring Boot 如何讓你的 bean 在其他 bean 之前完成加載 ?

    Spring Boot 如何讓你的 bean 在其他 bean 之前完成加載 ?

    今天有個小伙伴給我出了一個難題:在 SpringBoot 中如何讓自己的某個指定的 Bean 在其他 Bean 前完成被 Spring 加載?我聽到這個問題的第一反應是,為什么會有這樣奇怪的需求? Talk is cheap,show me the code,這里列出了那個想做最先加載的“天選 Bean” 的代碼,我們來分析一下:

    2024年02月03日
    瀏覽(18)
  • Spring Boot |如何讓你的 bean 在其他 bean 之前完成加載

    Spring Boot |如何讓你的 bean 在其他 bean 之前完成加載

    問題 今天有個小伙伴給我出了一個難題:在 SpringBoot 中如何讓自己的某個指定的 Bean 在其他 Bean 前完成被 Spring 加載?我聽到這個問題的第一反應是,為什么會有這樣奇怪的需求? Talk is cheap,show me the code,這里列出了那個想做最先加載的“天選 Bean” 的代碼,我們來分析一

    2024年02月05日
    瀏覽(19)
  • Spring Boot進階(51):如何在Spring Boot項目中輕松集成HTML:讓你的應用更具吸引力!

    Spring Boot進階(51):如何在Spring Boot項目中輕松集成HTML:讓你的應用更具吸引力!

    ? ? ? ? 我們都知道,Spring Boot作為一款廣泛應用于企業(yè)級的開發(fā)框架,其通過簡化開發(fā)過程、提高開發(fā)效率贏得了眾多開發(fā)者的青睞。在實際項目開發(fā)中,集成 HTML作為 Web 應用程序中的一個基本需求,也是現(xiàn)在極其常見的場景之一。在此,我將為大家分享一下Spring Boot如何

    2024年02月11日
    瀏覽(24)
  • Spring Boot進階(58):輕松搞定數(shù)據(jù)存儲!Spring Boot與PostgreSQL完美集成,讓你的應用更穩(wěn)定更高效!

    Spring Boot進階(58):輕松搞定數(shù)據(jù)存儲!Spring Boot與PostgreSQL完美集成,讓你的應用更穩(wěn)定更高效!

    ????????PostgreSQL是一種廣泛使用的開源關(guān)系型數(shù)據(jù)庫,具有可靠性高、性能優(yōu)異、擁有豐富的數(shù)據(jù)類型和擴展等優(yōu)點,越來越多的企業(yè)和開發(fā)者開始使用它來存儲和管理數(shù)據(jù)。而Spring Boot是一種快速開發(fā)的框架,可以簡化開發(fā)過程并提高開發(fā)效率。本文將介紹如何使用Sp

    2024年02月10日
    瀏覽(23)
  • 提升 Spring Boot 吞吐量的 7 個神技,讓你的項目飛起來!

    實現(xiàn)方式二種: 使用異步注解 @aysnc、啟動類:添加 @EnableAsync 注解 JDK 8 本身有一個非常好用的 Future 類——CompletableFuture 在該示例中,啟動一個線程,此時 AskThread 對象還沒有拿到它需要的數(shù)據(jù),執(zhí)行到 myRe = re.get() * re.get() 會阻塞。 我們用休眠 1 秒來模擬一個長時間的計算

    2024年02月08日
    瀏覽(18)
  • 【Spring Security】讓你的項目更加安全的框架

    【Spring Security】讓你的項目更加安全的框架

    ????歡迎來到我的CSDN主頁!???? ??我是Java方文山,一個在CSDN分享筆記的博主。???? ??推薦給大家我的專欄《Spring Security》。???? ??點擊這里,就可以查看我的主頁啦!???? Java方文山的個人主頁 ??如果感覺還不錯的話請給我點贊吧!???? ??期待你的加入,一

    2024年02月04日
    瀏覽(22)
  • 如何優(yōu)雅地在Spring Boot項目啟動時初始化數(shù)據(jù),讓你的Web應用快人一步

    如何優(yōu)雅地在Spring Boot項目啟動時初始化數(shù)據(jù),讓你的Web應用快人一步

    ?? 歡迎點贊 ?? 收藏 ?留言 ?? 如有錯誤敬請指正! 大多數(shù)Java Web應用程序中,項目在啟動時都需要加載一些初始化數(shù)據(jù),例如配置文件、數(shù)據(jù)庫連接信息等。在Spring Boot中,我們可以通過將數(shù)據(jù)緩存到內(nèi)存中來提高Web應用程序的性能。本篇博客旨在通過一個實例來介紹如

    2024年02月02日
    瀏覽(30)
  • spring boot中常用的安全框架 Security框架 利用Security框架實現(xiàn)用戶登錄驗證token和用戶授權(quán)(接口權(quán)限控制)

    spring boot中常用的安全框架 Security框架 利用Security框架實現(xiàn)用戶登錄驗證token和用戶授權(quán)(接口權(quán)限控制)

    spring boot中常用的安全框架 Security 和 Shiro 框架 Security 兩大核心功能 認證 和 授權(quán) 重量級 Shiro 輕量級框架 不限于web 開發(fā) 在不使用安全框架的時候 一般我們利用過濾器和 aop自己實現(xiàn) 權(quán)限驗證 用戶登錄 Security 實現(xiàn)邏輯 輸入用戶名和密碼 提交 把提交用戶名和密碼封裝對象

    2024年02月06日
    瀏覽(31)
  • Spring Security 6.0系列【15】認證篇之實現(xiàn)短信驗證碼登錄功能

    有道無術(shù),術(shù)尚可求,有術(shù)無道,止于術(shù)。 本系列Spring Boot 版本 3.0.4 本系列Spring Security 版本 6.0.2 源碼地址:https://gitee.com/pearl-organization/study-spring-security-demo 目前大部分網(wǎng)站都支持使用 手機號+短信驗證碼 登錄,比

    2023年04月24日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包