让你的Demo更安全--Spring Boot实现短信验证码

这篇具有很好参考价值的文章主要介绍了让你的Demo更安全--Spring Boot实现短信验证码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

随着移动互联网的普及,短信验证码已经成为了很多应用的常用登录和注册方式之一。在传统的应用中,我们一般使用第三方集成商提供的短信验证码服务来实现短信验证码的发送和验证,但是这些服务有可能存在时间限制、价格过高等限制。

为了解决这些问题,我们可以使用Spring Boot来自己实现短信验证码。在本文中,我将向大家介绍如何使用Spring Boot来实现短信验证码,并提供详细的开发流程和代码示例。


前置条件

在实现短信验证码之前,需要配置以下环境和依赖:

  • JDK 1.8或以上版本
  • Maven 3.5或以上版本
  • Spring Boot 2.0或以上版本
  • 阿里云短信服务

短信验证码的实现思路

在实现短信验证码之前,我们需要确定实现短信验证码需要哪些步骤:

  • 客户端向服务端发送手机号码
  • 服务端生成随机的验证码并发送到该手机号码
  • 客户端将验证码发送到服务端进行校验

根据这个思路,我们可以通过以下几个步骤来实现短信验证码:

  1. application.properties文件中配置阿里云短信服务的AccessKey和SecretKey:
# 阿里云短信服务的AccessKey
aliyun.sms.accessKeyId=your_accessKeyId
# 阿里云短信服务的SecretKey
aliyun.sms.accessKeySecret=your_accessKeySecret
  1. 定义短信验证码的请求和响应类:
public class SmsRequest {
    // 手机号码
    private String phone;
    // 验证码
    private String code;
    // 发送时间
    private Long timestamp;
    // 签名
    private String signature;
    // getter和setter方法
}

public class SmsResponse {
    // 发送状态码
    private String code;
    // 发送消息
    private String message;
    // getter和setter方法
}
  1. 定义短信发送接口:
public interface SmsService {
    /**
     * 发送短信验证码
     *
     * @param phone 手机号码
     * @return 发送状态
     */
    SmsResponse sendSms(String phone);
}
  1. 实现短信发送接口:
@Service
public class SmsServiceImpl implements SmsService {
    // 阿里云短信服务的AccessKey
    @Value("${aliyun.sms.accessKeyId}")
    private String ACCESS_KEY_ID;
    // 阿里云短信服务的SecretKey
    @Value("${aliyun.sms.accessKeySecret}")
    private String ACCESS_KEY_SECRET;
    // 验证码的有效时间,单位为秒
    private static final int EXPIRATION = 120;

    /**
     * 发送短信验证码
     *
     * @param phone 手机号码
     * @return 发送状态
     */
    @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();

            // 设置短信模板
            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);

            // 设置短信参数
            request.setTemplateParam(new Gson().toJson(map));

            request.setPhoneNumbers(phone);

            // 发送
            SendSmsResponse smsResponse = client.getAcsResponse(request);

            if (smsResponse.getCode() != null && smsResponse.getCode().equals("OK")) {
                response.setCode("200");
                response.setMessage("验证码发送成功");
            } else {
                response.setCode("500");
                response.setMessage("验证码发送失败,请稍后再试");
            }
        } catch (Exception e) {
            response.setCode("500");
            response.setMessage("验证码发送失败,请稍后再试");
            e.printStackTrace();
        }
        return response;
    }
}

在上述示例代码中,我们使用阿里云短信服务的SDK发送短信,首先从配置文件中获取AccessKey和SecretKey,然后生成IAcsClient对象,并设置模板代码,生成验证码并保存到Redis缓存中,最后发送短信。

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

    private final SmsService smsService;

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

    /**
     * 发送短信验证码
     * @param phone 手机号码
     * @return 发送状态
     */
    @GetMapping("/send")
    public SmsResponse sendSms(@RequestParam("phone") String phone) {
        return smsService.sendSms(phone);
    }
}

在上面代码中,我们创建了一个发送短信验证码的接口,并使用@GetMapping注解将其映射到/api/sms/send路径上。

  1. 实现验证码校验:
@RestController
@RequestMapping("/api/sms")
public class SmsController {

    private final SmsService smsService;

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

    /**
     * 发送短信验证码
     * @param phone 手机号码
     * @return 发送状态
     */
    @GetMapping("/send")
    public SmsResponse sendSms(@RequestParam("phone") String phone) {
        return smsService.sendSms(phone);
    }

    /**
     * 校验验证码
     * @param request 校验请求
     * @return 校验结果
     */
    @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("验证码校验失败");
        }
    }
}

在上述代码中,我们创建了一个校验短信验证码的接口,并使用@PostMapping注解将其映射到/api/sms/verify路径上。在接口实现中,我们从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;
    }
}

在上述代码中,我们创建了一个Redis配置类,并使用@Configuration注解将其标注为配置类。在jedisConnectionFactory方法中,我们设置了Redis服务器的IP和端口,并返回一个JedisConnectionFactory对象,用于获取Jedis实例。在redisTemplate方法中,我们创建了一个RedisTemplate对象,并设置了序列化器和连接工厂。

至此,我们已经完成了短信验证码的实现。

总结

Spring Boot为我们提供了快速便捷地实现短信验证码功能的方式。在本文中,我向大家展示了使用阿里云短信服务发送短信验证码并实现验证码校验的代码示例。如果您打算实现短信验证码功能,可以参考本文提供的思路和代码示例。

在实际开发中,我们还可以根据业务需求对短信验证码进行更多的优化和改进,比如添加验证码图形识别、增加短信发送次数校验、防止恶意发送、短信的批量发送等功能。

总之,短信验证码是现在很常见的一种验证方式,其简单、便捷、安全的特点获得了很多企业和应用的青睐。希望本文可以对您实现短信验证码功能有所帮助。文章来源地址https://www.toymoban.com/news/detail-465272.html

到了这里,关于让你的Demo更安全--Spring Boot实现短信验证码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Spring AI让你的Spring Boot应用快速拥有生成式AI能力

    之前分享了关于Spring新项目 Spring AI 的介绍视频。视频里演示了关于使用Spring AI将Open AI的能力整合到Spring应用中的操作,但有不少读者提到是否有博客形式的学习内容。所以,本文就将具体介绍如何使用 Spring AI 快速让您的Spring应用拥有生成式AI的强大能力。 第一步:使用你

    2024年02月03日
    浏览(36)
  • Spring Boot |如何让你的 bean 在其他 bean 之前完成加载

    问题 今天有个小伙伴给我出了一个难题:在 SpringBoot 中如何让自己的某个指定的 Bean 在其他 Bean 前完成被 Spring 加载?我听到这个问题的第一反应是,为什么会有这样奇怪的需求? Talk is cheap,show me the code,这里列出了那个想做最先加载的“天选 Bean” 的代码,我们来分析一

    2024年02月05日
    浏览(57)
  • Spring Boot 如何让你的 bean 在其他 bean 之前完成加载 ?

    今天有个小伙伴给我出了一个难题:在 SpringBoot 中如何让自己的某个指定的 Bean 在其他 Bean 前完成被 Spring 加载?我听到这个问题的第一反应是,为什么会有这样奇怪的需求? Talk is cheap,show me the code,这里列出了那个想做最先加载的“天选 Bean” 的代码,我们来分析一下:

    2024年02月03日
    浏览(37)
  • Spring Boot进阶(51):如何在Spring Boot项目中轻松集成HTML:让你的应用更具吸引力!

            我们都知道,Spring Boot作为一款广泛应用于企业级的开发框架,其通过简化开发过程、提高开发效率赢得了众多开发者的青睐。在实际项目开发中,集成 HTML作为 Web 应用程序中的一个基本需求,也是现在极其常见的场景之一。在此,我将为大家分享一下Spring Boot如何

    2024年02月11日
    浏览(47)
  • Spring Boot进阶(58):轻松搞定数据存储!Spring Boot与PostgreSQL完美集成,让你的应用更稳定更高效!

            PostgreSQL是一种广泛使用的开源关系型数据库,具有可靠性高、性能优异、拥有丰富的数据类型和扩展等优点,越来越多的企业和开发者开始使用它来存储和管理数据。而Spring Boot是一种快速开发的框架,可以简化开发过程并提高开发效率。本文将介绍如何使用Sp

    2024年02月10日
    浏览(54)
  • 提升 Spring Boot 吞吐量的 7 个神技,让你的项目飞起来!

    实现方式二种: 使用异步注解 @aysnc、启动类:添加 @EnableAsync 注解 JDK 8 本身有一个非常好用的 Future 类——CompletableFuture 在该示例中,启动一个线程,此时 AskThread 对象还没有拿到它需要的数据,执行到 myRe = re.get() * re.get() 会阻塞。 我们用休眠 1 秒来模拟一个长时间的计算

    2024年02月08日
    浏览(42)
  • 【Spring Security】让你的项目更加安全的框架

    🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Spring Security》。🎯🎯 👉点击这里,就可以查看我的主页啦!👇👇 Java方文山的个人主页 🎁如果感觉还不错的话请给我点赞吧!🎁🎁 💖期待你的加入,一

    2024年02月04日
    浏览(55)
  • 如何优雅地在Spring Boot项目启动时初始化数据,让你的Web应用快人一步

    🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 大多数Java Web应用程序中,项目在启动时都需要加载一些初始化数据,例如配置文件、数据库连接信息等。在Spring Boot中,我们可以通过将数据缓存到内存中来提高Web应用程序的性能。本篇博客旨在通过一个实例来介绍如

    2024年02月02日
    浏览(53)
  • spring boot中常用的安全框架 Security框架 利用Security框架实现用户登录验证token和用户授权(接口权限控制)

    spring boot中常用的安全框架 Security 和 Shiro 框架 Security 两大核心功能 认证 和 授权 重量级 Shiro 轻量级框架 不限于web 开发 在不使用安全框架的时候 一般我们利用过滤器和 aop自己实现 权限验证 用户登录 Security 实现逻辑 输入用户名和密码 提交 把提交用户名和密码封装对象

    2024年02月06日
    浏览(52)
  • Spring Security 6.0系列【15】认证篇之实现短信验证码登录功能

    有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.0.4 本系列Spring Security 版本 6.0.2 源码地址:https://gitee.com/pearl-organization/study-spring-security-demo 目前大部分网站都支持使用 手机号+短信验证码 登录,比

    2023年04月24日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包