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日

相关文章

  • java实现输出任意整数的每一位

    下面是java实现输出任意整数的每一位的完整攻略。 步骤一:将整数转成字符串 我们知道,字符串中每个字符都可以通过下标访问。所以,我们只需要将整数转换成字符串,就可以通过下标依次访问每个数字了。 int num = 123456; String numStr = String.valueOf(num); // 将整数转换成字符串 步骤二:遍历字符串,输出每一…

    Java 2023年5月26日
    00
  • spring-boot-starter-parent的作用详解

    “spring-boot-starter-parent”是一个Maven父项目,为Spring Boot应用程序的制作提供了标准化的模式和结构。它本身不提供任何功能,而是通过定义版本来简化Maven项目配置。 根据Spring Boot文档,使用“spring-boot-starter-parent”可以获得以下好处: 提供了默认的Maven设置,无需进行繁…

    Java 2023年5月20日
    00
  • ActiveMQ结合Spring收发消息的示例代码

    ActiveMQ是目前非常流行的一种消息中间件,而Spring框架则是目前最为流行的Java企业应用开发框架之一。它们可以结合使用,为我们带来高效可靠的消息传递。 下面,我将详细讲解如何在Spring中使用ActiveMQ进行消息的发送与接收。 环境准备 在开始使用之前,需要先准备好以下环境。 安装ActiveMQ。 创建一个Maven项目,添加Active…

    Java 2023年5月30日
    00
  • 使用Jackson反序列化遇到的问题及解决

    使用Jackson进行反序列化过程中可能会出现一些问题,比如: 1.无法处理嵌套的JSON对象 2.无法处理JSON数组 3.无法处理格式不一致的JSON数据 下面将介绍如何解决这些问题。 问题1:无法处理嵌套的JSON对象 当JSON对象中包含嵌套的子对象时,我们可以通过创建一个新的Java类来表示该子对象,然后将它作为主类的成员变量。 示例代码如下: {…

    Java 2023年5月26日
    00
  • jsp+Servlet编程实现验证码的方法

    下面我来详细讲解“jsp+Servlet编程实现验证码的方法”的完整攻略。 什么是验证码? 验证码(CAPTCHA)是指计算机应用程序为区分用户是真实用户还是计算机程序而推出的一种测试。常见的验证码类型包括数字、字母、滑块等形式,用户需要正确地填写系统生成的图形码信息才能进行下一步操作。 实现验证码的原理 验证码的实现原理是利用了Web开发中的Session…

    Java 2023年6月15日
    00
  • 总结Java常用的时间相关转化

    转化为Date类型 String str = "2021-09-15 13:30:00"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime dateTime = LocalDa…

    Java 2023年5月20日
    00
  • asp的程序能实现伪静态化的方法

    ASP是一种动态网页开发技术,通常需要通过服务器端动态生成HTML代码。对于某些站点,如果开启了伪静态,可以有效地提升网站的SEO表现,提高流量。本文将详细讲解ASP程序如何实现伪静态化,包含以下内容: 了解伪静态化的原理 伪静态化是指将动态生成的页面URL转化为静态的HTML文档。例如将”index.asp?id=1″转化为”index_1.html”。当…

    Java 2023年6月15日
    00
  • 如何在 Java 中利用 redis 实现 LBS 服务

    讲解“如何在 Java 中利用 redis 实现 LBS 服务”的完整攻略,主要包括以下几个步骤: 安装 Redis 和 Java Redis 客户端 首先需要安装 Redis 和 Java Redis 客户端,可以通过如下命令进行安装: # 安装 Redis sudo apt-get install redis-server # 安装 Java Redis…

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