SpringBoot发送短信验证码的实例

 更新时间:2022年02月21日 14:55:44   作者:芝兰生于深谷  
第三方短信发送平台有很多种,各个平台有各自的优缺点,在选择的时候可以根据自己的具体实际情况定夺,本文主要介绍了SpringBoot发送短信验证码的实例,感兴趣的可以了解一下

1、注册短信通账号

网址:http://sms.webchinese.cn

在这里插入图片描述

在这里插入图片描述

2、导入依赖

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf-spring5</artifactId>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-java8time</artifactId>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-springsecurity5</artifactId>
        </dependency>
		<!--短信验证依赖导入-->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>commons-httpclient</groupId>
            <artifactId>commons-httpclient</artifactId>
            <version>3.0.1</version>
        </dependency>

3、随机验证码的工具类

public class CodeUtil {

    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
    
    /**
     * 随机生成6位验证码
     *
     */
    public String getRandomCode(Integer code){
        Random random = new Random();
        StringBuffer result= new StringBuffer();
        for (int i=0;i<code;i++){
            result.append(random.nextInt(10));
        }
        return result.toString();
    }
    
    //保存验证码和时间
    public Code saveCode(String code){
        Code code1=new Code();
        SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
        Calendar c = Calendar.getInstance();
        c.add(Calendar.MINUTE, 5);
        String currentTime = sf.format(c.getTime());// 生成5分钟后时间,用户校验是否过期
        //验证码加密
        String encode=passwordEncoder().encode(code);
        code1.setCode(encode);
        code1.setCurrentTime(currentTime);
        return code1;
    }
    
    /**
     * 解密处理
     * @param code 输入
     * @param code1 目标
     */
    public Boolean deciphering(String code,String code1){
        boolean matches = passwordEncoder().matches(code,code1);
        return matches;
    }


}

4、短信发送工具类

@Component
public class TelMessageUtil {
    private static final String SMS_Url = "http://sms.webchinese.cn/web_api/";

    /**
     * @param Uid SMS用户id
     * @param Key 接口秘钥:SMS登录可查(非登录密码)
     * @param sendPhoneNum 短信发送目标号码
     * @param desc 短信内容
     * @return Integer(1:成功码,其他失败,具体参见注释)
     */
    public static Integer send(String Uid,String Key,String sendPhoneNum,String desc){
    
        HttpClient client = new HttpClient();
        PostMethod post = new PostMethod(SMS_Url);
        post.addRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=gbk");// 在头文件中设置转码
    
        //设置参数
        NameValuePair[] data = {
                new NameValuePair("Uid", Uid),
                new NameValuePair("Key", Key),//秘钥
                new NameValuePair("smsMob", sendPhoneNum),
                new NameValuePair("smsText", desc)
        };
    
        post.setRequestBody(data);
    
        try {
            client.executeMethod(post);
        } catch (Exception e) {  e.printStackTrace();  }


        Header[] headers = post.getResponseHeaders();
        int statusCode = post.getStatusCode();
        System.out.println("statusCode:" + statusCode);
        for (Header h : headers) {
            System.out.println(h.toString());
        }
    
        String result ="";
        try {
            result = new String(post.getResponseBodyAsString().getBytes("gbk"));
        } catch (Exception e) {  e.printStackTrace();  }
    
        post.releaseConnection();
    
        return Integer.parseInt(result);
    }
    /**
     *  -1  没有该用户账户
     -2     接口密钥不正确 [查看密钥]不是账户登陆密码
     -21    MD5接口密钥加密不正确
     -3     短信数量不足
     -11    该用户被禁用
     -14    短信内容出现非法字符
     -4     手机号格式不正确
     -41    手机号码为空
     -42    短信内容为空
     -51    短信签名格式不正确接口签名格式为:【签名内容】
     -6     IP限制
     大于0   短信发送数量
     以上作为补充
     */
    public static String getMessage(Integer code){
        String message;
        if(code > 0 ) {
            message = "SMS-f发送成功!短信量还有" + code + "条";
        }else if(code == -1){
            message = "SMS-没有该用户账户";
        }else if(code == -2){
            message = "SMS-接口密钥不正确";
        }else if(code == -21){
            message = "SMS-MD5接口密钥加密不正确";
        }else if(code == -3){
            message = "SMS-短信数量不足";
        }else if(code == -11){
            message = "SMS-该用户被禁用";
        }else if(code == -14){
            message = "SMS-短信内容出现非法字符";
        }else if(code == -4){
            message = "SMS-手机号格式不正确";
        }else if(code == -41){
            message = "SMS-手机号码为空";
        }else if(code == -42){
            message = "SMS-短信内容为空";
        }else if(code == -51){
            message = "SMS-短信签名格式不正确接口签名格式为:【签名内容】";
        }else if(code == -6){
            message = "SMS-IP限制";
        }else{
            message = "其他错误";
        }
        return message;
    }


}

5、测试

	//前台验证手机号
    @RequestMapping("/checkTel")
    public String checkTel(@RequestParam("tel") String tel,
                           HttpSession session,
                           Model model){
        Users users=new Users();
        users.setTel(tel);
        if (loginService.CheckOnly(users)) {
            model.addAttribute("msg","没有此用户,请注册!");
            return "register";
        }else {
            model.addAttribute("info","已向你的手机号为"+tel+"发送了验证码");
            Long id = loginService.findIdByTel(tel);
            session.setAttribute("user_id",id);
            //发送验证码
            CodeUtil codeUtil=new CodeUtil();
            //获取六位验证码
            String randomCode = codeUtil.getRandomCode(6);
            //先清除session域
            session.removeAttribute("checkCode");
            //加密验证码存放session域中
            session.setAttribute("checkCode",codeUtil.passwordEncoder().encode(randomCode));
            Integer resultCode = TelMessageUtil.send("****","************",tel,
                    "【高校志愿者平台】你的验证码为【"+randomCode+"】(若不是本人操作,可忽略该条邮件)"
            );
            System.out.println("日志信息"+resultCode);
            return "updatePwd";
        }
    }

到此这篇关于SpringBoot发送短信验证码的实例的文章就介绍到这了,更多相关SpringBoot 短信验证码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java Spring拦截器案例详解

    Java Spring拦截器案例详解

    这篇文章主要介绍了Java Spring拦截器案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Springboot创建项目的图文教程(idea版本)

    Springboot创建项目的图文教程(idea版本)

    这篇文章主要介绍了Springboot创建项目的图文教程(idea版本),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • Java的Jackson库中复杂对象集合的几种简单转换

    Java的Jackson库中复杂对象集合的几种简单转换

    本文主要介绍了Java的Jackson库中复杂对象集合的几种简单转换。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • IDEA 2021配置JavaWeb项目超详细教程

    IDEA 2021配置JavaWeb项目超详细教程

    本文通过图文并茂的形式给大家介绍IDEA 2021配置JavaWeb项目的过程,内容简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-08-08
  • Springboot如何根据实体类生成数据库表

    Springboot如何根据实体类生成数据库表

    这篇文章主要介绍了Springboot如何根据实体类生成数据库表的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java中的while循环语句详细讲解

    Java中的while循环语句详细讲解

    这篇文章主要给大家介绍了关于Java中while循环语句的相关资料,while循环是一种在编程中常见的控制流语句,它允许代码在特定条件下(通常是一个布尔表达式)重复执行一段代码,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • 详解如何使用MyBatis简化JDBC开发

    详解如何使用MyBatis简化JDBC开发

    JavaEE 企业级 Java 项目中的经典三层架构为表现层,业务层和持久层.MyBatis 对 JDBC 代码进行了封装,作为一款优秀的持久层框架,专门用于简化JDBC开发.本文主要介绍一下如何使用MyBatis简化JDBC开发,需要的可以参考一下
    2023-01-01
  • ava实现一致性Hash算法

    ava实现一致性Hash算法

    本文主要详细介绍了Java如何实现一致性Hash算法,其实现原理将key映射到 2^32 - 1 的空间中,将这个数字的首尾相连,形成一个环。想了解更多的同学,可以参考本文
    2023-03-03
  • 如何基于java或js获取URL返回状态码

    如何基于java或js获取URL返回状态码

    这篇文章主要介绍了如何基于java或js获取URL返回状态码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java集合之HashMap用法详解

    Java集合之HashMap用法详解

    这篇文章主要介绍了Java集合之HashMap用法,结合实例形式分析了java map集合中HashMap定义、遍历等相关操作技巧,需要的朋友可以参考下
    2017-05-05

最新评论