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日

相关文章

  • Apache log4j2-RCE 漏洞复现及修复建议(CVE-2021-44228)

    首先我们来简单介绍一下这个漏洞。 Apache log4j2是一款Java日志框架,它可以帮助开发者进行应用程序日志的记录和管理。CVE-2021-44228是Apache log4j2存在的一种远程代码执行漏洞,攻击者通过恶意构造log4j格式的请求,可以在服务器上执行任意代码,从而造成严重后果。 下面我们来具体讲解一下如何复现这个漏洞,并提供修复建议。 …

    Java 2023年6月2日
    00
  • Java中Session的详解

    下面我为您详细讲解Java中Session的用法。 什么是Session? Session是一种在Web应用程序中存储用户信息的方式。在使用Session前,需要先创建一个Session对象,然后将需要存储的信息存放在Session中,这些信息会被保存在服务器上。 Session的使用方法 创建Session 在Java中,可以使用HttpSession接口…

    Java 2023年5月26日
    00
  • java基于servlet的文件异步上传

    Java基于Servlet的文件异步上传是一种常见的Web开发技术,本文将详细讲解其完整攻略,包括前台页面设计、后端代码编写及实现文件上传效果的示例代码。 1. 前台页面设计 在前台设计中,需要使用HTML、JavaScript和CSS完成文件上传页面。其中,HTML中主要包括file组件、上传按钮、进度条等,JavaScript控制上传进度和上传结果,CS…

    Java 2023年5月19日
    00
  • Java复制(拷贝)数组的4种方法:arraycopy()方法、clone() 方法、copyOf()和copyOfRan

    当我们需要在Java中复制(拷贝)数组时,有四种主要的方法可供选择: 使用arraycopy()方法 使用clone()方法 使用copyOf()方法 使用copyOfRange()方法 下面,我们将详细讲解这四种方法。 1. 使用arraycopy()方法 public static void arraycopy(Object src, int srcPo…

    Java 2023年5月26日
    00
  • Java中Range函数的简单介绍

    Java中Range函数的简单介绍 在Java中,Range函数是一个非常重要和常用的函数,它可以对一定范围内的值进行处理和操作。在本文中,我们将向大家详细介绍Java中Range函数的基本用法和示例。 Range函数的基本用法 Java中的Range函数是指可以对一个范围内的值进行处理和操作的函数。范围可以是数字范围,也可以是其他类型的范围,如字符范围或时…

    Java 2023年5月26日
    00
  • Java实现优先队列式广度优先搜索算法的示例代码

    实现优先队列式广度优先搜索(Priority Queue-based BFS)算法需要遵循以下几个步骤: Step 1:初始化 首先,我们需要初始化一个待访问节点的优先队列priority queue、一个已访问节点的哈希表visited map、以及图的邻接表adjacent list。将源节点加入到priority queue中,并将visited ma…

    Java 2023年5月19日
    00
  • javaSE中异常如何处理举例详解

    JavaSE中的异常处理是一项重要的技能,它可以使我们更好地处理程序出现的错误,并及时解决问题,避免程序崩溃或者异常退出,给用户带来不必要的麻烦。下面我们来详细讲解JavaSE中异常处理的攻略,并通过两个具体的示例来说明。 异常的概念 在Java中,异常是一种事件,它会在程序执行期间导致出现未经处理的错误或异常情况。Java提供了一套API来处理运行时异常和…

    Java 2023年5月26日
    00
  • SpringMVC中的Model对象用法说明

    下面是关于“SpringMVC中的Model对象用法说明”的完整攻略,包含两个示例说明。 SpringMVC中的Model对象用法说明 在SpringMVC中,Model对象是一个接口,它用于在控制器和视图之间传递数据。本文将介绍如何使用Model对象来传递数据,并提供两个示例说明。 步骤一:创建SpringMVC项目 首先,我们需要创建一个SpringMV…

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