javaweb项目如何实现手机短信登录

下面我来详细讲解如何实现手机短信登录的完整攻略:

步骤一:申请短信服务

要实现手机短信登录,首先需要申请一个短信服务供应商提供的服务,通常情况下这些服务都需要扣除一定的费用,具体费用因服务供应商而异。以下是两种比较常用的短信服务供应商:

腾讯云短信服务

腾讯云短信服务提供快速、高可靠、低成本、全网覆盖的短信验证码发送服务。首先,你需要去 腾讯云官网 进行注册,然后选择相关的服务选项申请使用云短信服务,申请后可以获得相应的 AppIDAppKey 等验证信息用于调用短信服务。

阿里云短信服务

阿里云短信服务也是一款非常稳定、高效的短信验证码发送服务,有着国内较为广泛的使用。要使用阿里云短信服务,首先需要去 阿里云官网 进行注册,然后选择相关的短信服务选项,根据官网提供的操作指导即可完成申请,申请后可以获得相应的 AccessKeyIdAccessKeySecret 等验证信息用于调用该服务。

步骤二:集成短信服务

申请成功后,我们需要将相应的验证信息集成到我们的项目中,以便通过接口随时调用。下面以使用腾讯云短信服务为例,提供一个简单的 Java 工具类:

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.Base64;
import java.util.Random;

public class SmsSender {

    private static final String SDK_APP_ID = "Your SDKAppID";
    private static final String SECRET_ID = "Your SecretID";
    private static final String SECRET_KEY = "Your SecretKey";
    private static final String SIGN_NAME = "YourSignName";
    private static final String TEMPLATE_ID = "YourTemplateId";

    /**
     * 根据手机号发送验证码短信
     *
     * @param phoneNumber 手机号码
     * @return 发送结果
     */
    public static String sendVerificationCode(String phoneNumber) {
        try {
            long currTime = System.currentTimeMillis() / 1000;
            int randomNumber = new Random().nextInt(999999);
            String original = String.format(
                "apikey=%s&random=%d&time=%d&mobile=%s",
                SECRET_KEY, randomNumber, currTime, phoneNumber
            );
            String hmac = hmacSha256(original, SECRET_ID);

            String requestUrl = String.format(
                "https://yun.tim.qq.com/v5/tlssmssvr/sendsms?sdkappid=%s&random=%d",
                SDK_APP_ID, randomNumber
            );
            String requestBody = String.format(
                "{"
                    + "\"tel\": {\"mobile\": \"%s\"},"
                    + "\"sign\":\"%s\","
                    + "\"tpl_id\":\"%s\","
                    + "\"params\":[\"%d\"]"
                    + "}",
                phoneNumber, SIGN_NAME, TEMPLATE_ID, randomNumber
            );

            HttpUtils.HttpResponse response = HttpUtils.post(requestUrl, requestBody, "Content-Type", "application/json", "Authorization", hmac);
            String json = response.getContent();
            if (response.getStatus() == 200) {
                return json;
            } else {
                return String.format("{\"result\": %d, \"errmsg\": \"%s\"}", response.getStatus(), json);
            }
        } catch (Exception e) {
            return String.format("{\"result\": -1, \"errmsg\": \"%s\"}", e.getMessage());
        }
    }

    /**
     * HmacSHA256签名
     *
     * @param data       原始字符串
     * @param secret     私钥
     * @return 签名结果
     * @throws Exception 异常
     */
    private static String hmacSha256(String data, String secret) throws Exception {
        byte[] secretBytes = secret.getBytes(StandardCharsets.UTF_8);
        SecretKeySpec signingKey = new SecretKeySpec(secretBytes, "HmacSHA256");
        Mac mac = Mac.getInstance("HmacSHA256");
        mac.init(signingKey);

        byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8);
        byte[] rawHmac = mac.doFinal(dataBytes);
        byte[] signatureBytes = Base64.getEncoder().encode(rawHmac);
        return URLEncoder.encode(new String(signatureBytes, StandardCharsets.UTF_8), StandardCharsets.UTF_8.name());
    }
}

步骤三:实现手机短信登录接口

有了短信服务,我们就可以开始实现短信登录的接口了。下面提供一个参考实现:

@RestController
public class SmsLoginController {

    @Autowired
    private UserDetailsService userDetailsService;

    /**
     * 发送验证码
     *
     * @param phoneNumber 手机号码
     * @return 发送结果
     */
    @PostMapping("/login/sms/send")
    public String sendVerificationCode(@RequestParam("phoneNumber") String phoneNumber) {
        String result = SmsSender.sendVerificationCode(phoneNumber);
        if (result.contains("\"result\":0")) {
            return "{\"code\":0,\"message\":\"发送成功\"}";
        } else {
            return "{\"code\":1,\"message\":\"发送失败\"}";
        }
    }

    /**
     * 手机验证码登录
     *
     * @param phoneNumber 手机号码
     * @param code        验证码
     * @return 登录结果
     */
    @PostMapping("/login/sms")
    public String smsLogin(@RequestParam("phoneNumber") String phoneNumber, @RequestParam("code") String code) {
        UserDetails userDetails = userDetailsService.loadUserByUsername(phoneNumber);
        if (userDetails == null) {
            return "{\"code\":1,\"message\":\"该手机号未注册\"}";
        }

        // 模拟验证码与数据库中存储的值进行比较
        if (!"123456".equals(code)) {
            return "{\"code\":1,\"message\":\"验证码错误\"}";
        }

        String token = JwtTokenUtil.generateToken(userDetails);
        return "{\"code\":0,\"message\":\"登录成功\",\"data\":{\"token\":\"" + token + "\"}}";
    }
}

在这个示例中,我们通过 /login/sms/send 接口发送短信验证码,然后使用 /login/sms 接口进行登录认证。认证过程中需要验证验证码是否有效,并通过 JWT 生成一个新的令牌返回给客户端。在生产环境中,你可能需要根据实际情况调整认证方式和参数等内容。

以上就是javaweb项目如何实现手机短信登录的完整攻略,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javaweb项目如何实现手机短信登录 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • 解决SpringBoot启动过后不能访问jsp页面的问题(超详细)

    解决SpringBoot启动过后不能访问jsp页面的问题(超详细) 问题描述 SpringBoot是一个高度集成化的框架,它不需要xml和配置文件即可构建Spring应用程序。然而,当我们在使用SpringBoot构建web应用程序的过程中,有时会遇到不能访问jsp页面的问题。这是因为SpringBoot默认使用thymeleaf作为模板引擎,而不是jsp。…

    Java 2023年6月15日
    00
  • javaweb 国际化:DateFormat,NumberFormat,MessageFormat,ResourceBundle的使用

    一、概述在国际化应用中,日期格式化、数字格式化和消息格式化是常见的需求,针对这些需求,Java提供了一系列的类和工具:DateFormat、NumberFormat、MessageFormat和ResourceBundle。 二、DateFormat使用DateFormat是一个日期格式化类,它可以将Date对象格式化成指定的字符串。 使用方法如下: Dat…

    Java 2023年6月15日
    00
  • jsp中checkbox用法详解

    JSP中Checkbox用法详解 在JSP中通过Checkbox可以实现多选以及默认选中的功能,下面我们来详细讲解Checkbox的用法。 CheckBox的基本语法 Checkbox的基本语法如下: <input type="checkbox" name="checkName" value="chec…

    Java 2023年6月15日
    00
  • JSP动态生成验证码存储在session作用范围内

    JSP动态生成验证码存储在Session作用范围内的攻略可以分为以下几个步骤来进行。 步骤1:生成随机的验证码 在JSP页面中通过Java代码生成随机的验证码,一般可以使用Random类或者Math.random()的方法,并将生成的验证码存储到一个String类型的变量中。 步骤2:将验证码存储在Session作用范围内 在生成验证码的同时,将其存储在Se…

    Java 2023年6月15日
    00
  • java与JSON数据的转换实例详解

    下面是Java与JSON数据的转换实例详解的完整攻略。 什么是JSON JSON是JavaScript Object Notation的缩写,它是一种轻量级、易于读写的数据格式,可以被多种编程语言解析和生成。JSON的主要优势在于它的可读性、可解析性和可靠性,由于其原始格式为文本,因此可以通过网络传输,而且多种编程语言都提供了JSON的解析和生成支持。 JS…

    Java 2023年5月26日
    00
  • 详解java安全编码指南之可见性和原子性

    详解Java安全编码指南之可见性和原子性 可见性问题 在Java中,可见性问题主要是由于多线程之间的共享变量引起的。当一个线程修改了共享变量,这个变量的值可能会被其他线程所看到,也可能不会被看到,这就是可见性问题。Java提供了关键字volatile和synchronized来解决可见性问题。 volatile关键字 volatile关键字用于修饰共享变量,…

    Java 2023年5月20日
    00
  • Java实战之吃货联盟订餐系统

    Java实战之吃货联盟订餐系统攻略 系统需求 用户可以查看菜单列表信息 用户可以注册账号 用户可以登录进入系统 用户可以选择菜品下单 用户可以查看订单列表 用户可以修改个人信息和密码 技术选型 使用Spring Boot进行快速开发 使用MyBatis进行数据库操作 使用Thymeleaf进行前端页面渲染 使用Spring Security进行权限管理 使用…

    Java 2023年5月24日
    00
  • Java多线程 原子性操作类的使用

    Java多线程 原子性操作类的使用 在并发编程中,多个线程同时进行操作时,可能会出现线程安全问题。例如两个线程同时对同一个变量进行增加操作,结果可能不是期望的那个。Java提供了原子性操作类来解决这个问题。 原子性操作类 Java原子类是Java编程语言中的一种特殊类,它具有原子性,线程安全性和可比性,并提供了一种简单的基于锁的技术,通过这种技术实现多线程并…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部