高并发项目-用户登录基本功能

文章目录

    • 1.数据库表设计
        • 1.IDEA连接数据库
        • 2.修改application.yml中数据库的名称为seckill
        • 3.IDEA创建数据库seckill
        • 4.创建数据表 seckill_user
        • 5.密码加密分析
          • 1.传统方式(不安全)
          • 2.改进方式(两次加密加盐)
    • 2.密码加密功能实现
        • 1.pom.xml添加md5加密的依赖,刷新maven
        • 2.编写工具类MD5Util.java,完成加密
        • 3.测试
          • 1.引入jupiter 5.7.2依赖
          • 2.测试方法
    • 3.编写实体类映射表
        • 1.创建pojo目录
        • 2.User.java
    • 4.创建Mapper接口和Mapper.xml
        • 1.创建UserMapper.java
        • 2.创建UserMapper.xml
    • 5.响应信息类
        • 1.创建vo目录
        • 2.RespBeanEnum.java 响应信息枚举类
        • 3.RespBean.java 响应信息的Bean
    • 6.编写接受登录信息的vo以及手机号校验工具类
        • 1.LoginVo.java
        • 2.ValidatorUtil.java
    • 7.编写service层
        • 1.UserService.java
        • 2.UserServiceImpl.java
    • 8.编写controller层
        • 1.引入校验的依赖
        • 2.LoginController.java
        • 3.引入静态资源和模板页
        • 4.解析前端登录
          • 1.点击登录,调用login
          • 2.将密码加密加盐之后向后端 /login/doLogin 发送请求
        • 5.测试访问首页
          • 1.首先检查资源是否到了target目录,如果没到需要maven重新编译
          • 2.测试访问 http://localhost:9092/seckill/login/toLogin
        • 6.前端区分多环境
          • 1.可以看到前端请求时使用的`/`其实只是本机的服务发现,也就是http://localhost:9092/,所以需要区分多环境
          • 2.首先新增一个配置类 GlobalControllerAdvice.java 全局控制器通知,用于向前端传递全局变量
          • 3.在application.yml和application-prod.yml编写baseUrl,区分多环境
          • 4.login.html 读取baseUrl
            • 1.在script标签内添加一行代码使其能够解析Thymeleaf
            • 2.修改请求,格式为 baseUrl + 资源路径
        • 7.在数据库添加一条记录,可以模拟用户登录
          • 1.假设密码是admin,在前端输出一下第一次加密加盐的结果
          • 2.使用后端的工具类也来加密一下,比对结果,发现结果一致
          • 3.在第二次加密的时候重新设置一个不同的盐为niubi666,模拟不同用户
          • 4.将结果放到数据库中
          • 5.此时的用户名和密码
        • 8.编写登录的controller并测试
          • 1.LoginController.java
          • 2.测试,登录成功

1.数据库表设计

1.IDEA连接数据库
2.修改application.yml中数据库的名称为seckill
3.IDEA创建数据库seckill

image-20240505140758642

4.创建数据表 seckill_user
DROP TABLE IF EXISTS `seckill_user`;
CREATE TABLE `seckill_user`
(`id`              BIGINT(20)   NOT NULL COMMENT '用户 ID, 设为主键, 唯一 手机号',`nickname`        VARCHAR(255) NOT NULL DEFAULT '',`password`        VARCHAR(32)  NOT NULL DEFAULT '' COMMENT 'MD5(MD5(pass 明文+固定salt)+salt)',`slat`            VARCHAR(10)  NOT NULL DEFAULT '',`head`            VARCHAR(128) NOT NULL DEFAULT '' COMMENT '头像',`register_date`   DATETIME              DEFAULT NULL COMMENT '注册时间',`last_login_date` DATETIME              DEFAULT NULL COMMENT '最后一次登录时间',`login_count`     INT(11)               DEFAULT '0' COMMENT '登录次数',PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;
select * from seckill_user;
5.密码加密分析
1.传统方式(不安全)

image-20240505141421491

2.改进方式(两次加密加盐)

image-20240505142002927

2.密码加密功能实现

1.pom.xml添加md5加密的依赖,刷新maven
    <!--md5 依赖--><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.15</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.11</version></dependency>
2.编写工具类MD5Util.java,完成加密
package com.sxs.seckill.utils;import org.apache.commons.codec.digest.DigestUtils;/*** Description: MD5加密工具类** @Author sun* @Create 2024/5/5 14:23* @Version 1.0*/
public class MD5Util {/*** 将一个字符串转换为MD5* @param src* @return*/public static String md5(String src) {return DigestUtils.md5Hex(src);}// 固定的saltpublic static final String SALT = "dgeb2g4t";// 第一次加密加盐public static String inputPassToMidPass(String inputPass) {// 加盐String str = SALT.charAt(0) + inputPass + SALT.charAt(6);return md5(str);}/*** 第二次加密加盐* @param midPass* @param salt* @return*/public static String midPassToDBPass(String midPass, String salt) {String str = salt.charAt(0) + midPass + salt.charAt(5);return md5(str);}/*** 两次加密* @param input* @param saltDB* @return*/public static String inputPassToDBPass(String input, String saltDB) {String midPass = inputPassToMidPass(input);String dbPass = midPassToDBPass(midPass, saltDB);return dbPass;}
}
3.测试
1.引入jupiter 5.7.2依赖
    <!-- jupiter测试 --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.7.2</version><scope>compile</scope></dependency>
2.测试方法
package com.sxs.seckill.utils;/*** Description: 测试MD5加密方法** @Author sun* @Create 2024/5/5 14:47* @Version 1.0*/
public class MD5UtilTest {public static void main(String[] args) {String input = "123456";System.out.println("第一次加密:" + MD5Util.inputPassToMidPass(input));System.out.println("第二次加密:" + MD5Util.midPassToDBPass(MD5Util.inputPassToMidPass(input), MD5Util.SALT));System.out.println("两次加密:" + MD5Util.inputPassToDBPass(input, MD5Util.SALT));}
}

image-20240505145723067

3.编写实体类映射表

1.创建pojo目录

image-20240505145913793

2.User.java
package com.sxs.seckill.pojo;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;import java.io.Serializable;
import java.util.Date;/*** Description:** @Author sun* @Create 2024/5/5 14:59* @Version 1.0*/
@Data
@TableName("seckill_user") // 指定表名
public class User implements Serializable { // 实现序列化接口private static final long serialVersionUID = 1L;/*** 用户 ID是手机号码*/@TableId(value = "id", type = IdType.ASSIGN_ID) // 指定主键,IdType.ASSIGN_ID表示自己指定ID,不自增private Long id;private String nickname;/*** MD5(MD5(pass 明文+固定 salt)+salt)*/private String password;private String slat;/*** 头像*/private String head;/*** 注册时间*/private Date registerDate;/*** 最后一次登录时间*/private Date lastLoginDate;/*** 登录次数*/private Integer loginCount;
}

4.创建Mapper接口和Mapper.xml

1.创建UserMapper.java
package com.sxs.seckill.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sxs.seckill.pojo.User;/*** Description:** @Author sun* @Create 2024/5/5 15:04* @Version 1.0*/
public interface UserMapper extends BaseMapper<User> {
}
2.创建UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.sxs.seckill.mapper.UserMapper"><!-- 通用查询映射结果 --><resultMap id="BaseResultMap" type="com.sxs.seckill.pojo.User"><id column="id" property="id"/><result column="nickname" property="nickname"/><result column="password" property="password"/><result column="slat" property="slat"/><result column="head" property="head"/><result column="register_date" property="registerDate"/><result column="last_login_date" property="lastLoginDate"/><result column="login_count" property="loginCount"/></resultMap>
</mapper>

5.响应信息类

1.创建vo目录

image-20240505152351330

2.RespBeanEnum.java 响应信息枚举类
package com.sxs.seckill.vo;import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;/*** Description: 响应枚举类** @Author sun* @Create 2024/5/5 15:15* @Version 1.0*/@Getter
@AllArgsConstructor
@ToString
public enum RespBeanEnum {// 通用SUCCESS(200, "SUCCESS"),ERROR(500, "服务端异常"),//登录模块LOGIN_ERROR(500210, "用户名或者密码错误"),MOBILE_ERROR(500211, "手机号码格式不正确"), BING_ERROR(500212, "参数绑定异常"), MOBILE_NOT_EXIST(500213, "手机号码不存在"), PASSWORD_UPDATE_FAIL(500214, "更新密码失败");// 响应码和响应信息private final Integer code;private final String message;}
3.RespBean.java 响应信息的Bean
package com.sxs.seckill.vo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** Description:** @Author sun* @Create 2024/5/5 15:32* @Version 1.0*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class RespBean {private long code;private String message;private Object obj;// 成功后public static RespBean success(Object obj) {return new RespBean(RespBeanEnum.SUCCESS.getCode(), RespBeanEnum.SUCCESS.getMessage(), obj);}public static RespBean success() {return new RespBean(RespBeanEnum.SUCCESS.getCode(), RespBeanEnum.SUCCESS.getMessage(), null);}// 失败各有不同public static RespBean error(RespBeanEnum respBeanEnum) {return new RespBean(respBeanEnum.getCode(), respBeanEnum.getMessage(), null);}public static RespBean error(RespBeanEnum respBeanEnum, Object obj) {return new RespBean(respBeanEnum.getCode(), respBeanEnum.getMessage(), obj);}
}

6.编写接受登录信息的vo以及手机号校验工具类

1.LoginVo.java
package com.sxs.seckill.vo;/*** Description: 登录实体类** @Author sun* @Create 2024/5/5 15:43* @Version 1.0*/
public class LoginVo {private String mobile;private String password;
}
2.ValidatorUtil.java
package com.sxs.seckill.utils;import org.junit.jupiter.api.Test;/*** Description: 校验工具类** @Author sun* @Create 2024/5/5 15:45* @Version 1.0*/
public class ValidatorUtil {/*** 校验手机号是否有效* @param phoneNumber 手机号* @return 如果手机号有效返回 true,否则返回 false*/public static boolean isMobile(String phoneNumber) {// 中国大陆的手机号码正则表达式,要求是11位数字,以1开头,第二位是3-9,后面是任意数字共11位String regex = "^1[3-9]\\d{9}$";return phoneNumber.matches(regex);}// 测试@Testpublic void t1() {System.out.println(isMobile("12345678901"));System.out.println(isMobile("1234567890"));// 正确的System.out.println(isMobile("13604969873"));}
}

image-20240505154936629

7.编写service层

1.UserService.java
package com.sxs.seckill.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.sxs.seckill.pojo.User;
import com.sxs.seckill.vo.LoginVo;
import com.sxs.seckill.vo.RespBean;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Description:** @Author sun* @Create 2024/5/5 15:58* @Version 1.0*/
public interface UserService extends IService<User> {/*** 用户登录校验* @param loginVo* @param request* @param response* @return*/RespBean doLogin(LoginVo loginVo, HttpServletRequest request, HttpServletResponse response);
}
2.UserServiceImpl.java
package com.sxs.seckill.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sxs.seckill.mapper.UserMapper;
import com.sxs.seckill.pojo.User;
import com.sxs.seckill.service.UserService;
import com.sxs.seckill.utils.MD5Util;
import com.sxs.seckill.utils.ValidatorUtil;
import com.sxs.seckill.vo.LoginVo;
import com.sxs.seckill.vo.RespBean;
import com.sxs.seckill.vo.RespBeanEnum;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Description:** @Author sun* @Create 2024/5/5 15:59* @Version 1.0*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Resourceprivate UserMapper userMapper;@Overridepublic RespBean doLogin(LoginVo loginVo, HttpServletRequest request, HttpServletResponse response) {// 获取用户输入的手机号和密码,此时的密码已经是midPassString mobile = loginVo.getMobile();String password = loginVo.getPassword();// 判断手机号和密码是否为空if (StringUtils.isBlank(mobile) || StringUtils.isBlank(password)) {return RespBean.error(RespBeanEnum.LOGIN_ERROR);}// 校验手机号是否正确if (!ValidatorUtil.isMobile(mobile)) {return RespBean.error(RespBeanEnum.MOBILE_ERROR);}// 根据手机号查询用户User user = userMapper.selectById(mobile);// 判断用户是否为空if (null == user) {return RespBean.error(RespBeanEnum.LOGIN_ERROR);}// 判断密码是否正确if (!MD5Util.midPassToDBPass(password, user.getSlat()).equals(user.getPassword())) {return RespBean.error(RespBeanEnum.LOGIN_ERROR);}// 返回成功return RespBean.success();}
}

8.编写controller层

1.引入校验的依赖
      <!--validation 参数校验--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId><version>2.4.5</version></dependency>
2.LoginController.java
package com.sxs.seckill.controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;/*** Description:** @Author sun* @Create 2024/5/5 16:41* @Version 1.0*/
@Slf4j
@Controller
@RequestMapping("/login")
public class LoginController {/*** 访问/login/toLogin会跳转到templates/login.html* @return*/@RequestMapping("/toLogin")public String toLogin() {return "login";}}
3.引入静态资源和模板页

image-20240505164717604

4.解析前端登录
1.点击登录,调用login

image-20240505165335357

2.将密码加密加盐之后向后端 /login/doLogin 发送请求

5.测试访问首页
1.首先检查资源是否到了target目录,如果没到需要maven重新编译

image-20240505165614482

2.测试访问 http://localhost:9092/seckill/login/toLogin

image-20240505172622055

6.前端区分多环境
1.可以看到前端请求时使用的/其实只是本机的服务发现,也就是http://localhost:9092/,所以需要区分多环境

image-20240505172723292

2.首先新增一个配置类 GlobalControllerAdvice.java 全局控制器通知,用于向前端传递全局变量
package com.sxs.seckill.config;import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ModelAttribute;/*** Description: 全局控制器通知,用于向前端传递全局变量** @Author sun* @Create 2024/5/5 17:08* @Version 1.0*/
@ControllerAdvice
public class GlobalControllerAdvice {// 从配置文件中读取baseUrl,从而使前端可以区分多环境@Value("${baseurl}")private String baseurl;@ModelAttribute("baseUrl")public String baseUrl() {// 这里可以根据环境变量或其他逻辑来动态确定 URLreturn baseurl;}
}
3.在application.yml和application-prod.yml编写baseUrl,区分多环境

image-20240505190742873

4.login.html 读取baseUrl
1.在script标签内添加一行代码使其能够解析Thymeleaf
th:inline="javascript"
2.修改请求,格式为 baseUrl + 资源路径

image-20240505191155843

7.在数据库添加一条记录,可以模拟用户登录
1.假设密码是admin,在前端输出一下第一次加密加盐的结果

image-20240505193323206

image-20240505193407660

2.使用后端的工具类也来加密一下,比对结果,发现结果一致

image-20240505193456039

image-20240505193507376

3.在第二次加密的时候重新设置一个不同的盐为niubi666,模拟不同用户

image-20240505193658984

4.将结果放到数据库中

image-20240505195357038

5.此时的用户名和密码
  • 19588888888:195+八个八
  • admin
8.编写登录的controller并测试
1.LoginController.java
    @ResponseBody@RequestMapping("/doLogin")public RespBean doLogin(LoginVo loginVo, HttpServletRequest request, HttpServletResponse response) {RespBean respBean = userService.doLogin(loginVo, request, response);// 返回return respBean;}
2.测试,登录成功

image-20240505195702856

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/844600.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CI/CD(基于ESP-IDF)

主要参考资料 B站乐鑫信息科技《【乐鑫全球开发者大会】DevCon23 #15 &#xff5c;通过 CI/CD 进行流水线开发》 pytest-embedded乐鑫文档: https://docs.espressif.com/projects/pytest-embedded/en/latest/api.html 目录 CI/CD简介乐鑫内部CI/CD测试GitLab CI/CDGitHub Actio…

CSA 实现安全应用容器架构的最佳实践 课堂随笔

CSA 实现安全应用容器架构的最佳实践 编写背景 随着云计算和微服务架构的兴起&#xff0c;容器技术因其轻量级、可移植性和易于管理等优势成为现代应用部署的首选。然而&#xff0c;容器的安全性问题也随之凸显。云安全联盟&#xff08;Cloud Security Alliance, CSA&#xf…

Android基础-Kotlin语言的作用及优缺点

一、Kotlin语言的作用 Kotlin是一种由JetBrains公司开发的现代化静态类型编程语言&#xff0c;自其诞生以来&#xff0c;便在多个领域展现出了强大的应用潜力。其主要作用可以概括为以下几点&#xff1a; Android应用开发&#xff1a;Kotlin作为Android开发的官方推荐语言&am…

dockerfile关键字

参考&#xff1a;59_Dockerfile保留字简介_哔哩哔哩_bilibili FROM 作用&#xff1a;指定基础镜像&#xff0c;即在这个基础镜像上构建新镜像&#xff0c;如下所示&#xff0c;表示在ubuntu20.04镜像的基础上构建新镜像 FROM ubuntu:20.04 MAINTAINER 作用&#xff1a;镜像…

LabVIEW中实现Trio控制器的以太网通讯

在LabVIEW中实现与Trio控制器的以太网通讯&#xff0c;可以通过使用TCP/IP协议来完成。这种方法包括配置Trio控制器的网络设置、使用LabVIEW中的TCP/IP函数库进行数据传输和接收&#xff0c;以及处理通讯中的错误和数据解析。本文将详细说明实现步骤&#xff0c;包括配置、编程…

SheetJS V0.17.5 导入 Excel 异常修复 Invalid HTML:could not find<table>

导入 Excel 提示错误&#xff1a;Invalid HTML:could not find<table> 检查源代码 发现 table 属性有回车符 Overview: https://docs.sheetjs.com/docs/ Source: https://git.sheetjs.com/sheetjs/sheetjs/issues The public-facing websites of SheetJS: sheetjs.com…

网络通讯聊天工具的实现v2

在原有基础上加入文件的传输功能。 从客户端传送到服务器后&#xff0c;服务器接受文件&#xff0c;再转发给其他客户端&#xff0c;客户端接受后服务器删除文件。 涉及文件的读取与关闭。 1.原来传输的改进 1.1服务器需要区分传输的是文件还是信息。 在传输之前先传输一个…

Linux基础指令用户管理002

继Linux基础指令用户管理001我们讲述了创建用户和删除用户&#xff0c;我们讲一下如何设置用户密码以及修改用户信息。 操作系统 CentOS Stream 9 设置用户密码 我们使用passwd指令passwd name [rootlocalhost ~]# passwd wg 更改用户 wg 的密码 。 新的密码&#xff1a; …

装机必备——截图软件PixPin安装教程

装机必备——截图软件PixPin安装教程 软件下载 软件名称&#xff1a;PixPin 1.5 软件语言&#xff1a;简体中文 软件大小&#xff1a;30.1M 系统要求&#xff1a;Windows7或更高&#xff0c; 64位操作系统 硬件要求&#xff1a;CPU2GHz &#xff0c;RAM2G或更高 下载通道①迅…

通过LLM多轮对话生成单元测试用例

通过LLM多轮对话生成单元测试用例 代码 在采用 随机生成pytorch算子测试序列且保证算子参数合法 这种方法之前,曾通过本文的方法生成算子组合测试用例。目前所测LLM生成的代码均会出现BUG,且多次交互后仍不能解决.也许随着LLM的更新,这个问题会得到解决.记录备用。 代码 impo…

Inno Setup 深入浅出-文件的显示

【1】在需要打包的文件中&#xff0c;新建一个文本文件&#xff0c;如License.txt 注意&#xff1a;中文的编码格式需要GB2312&#xff0c;否则显示乱码 【2】读取、显示文本 [Code] procedure Init_ShowLicense(); var tmpFont:TFont; begin editLicense : TMemo.C…

OpenFHE 源码解析:BinFHE 部分

参考文献&#xff1a; [ABB22] Al Badawi A, Bates J, Bergamaschi F, et al. Openfhe: Open-source fully homomorphic encryption library[C]//Proceedings of the 10th Workshop on Encrypted Computing & Applied Homomorphic Cryptography. 2022: 53-63.openfheorg/o…

算法训练营day43

题目1&#xff1a;343. 整数拆分 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int integerBreak(int n) {vector<int> dp(n 1, 0);dp[2] 1;for(int i 3;i < n;i) {for(int j 1;j < i;j ) {// j * (i - j)相当于拆分成两个数// j * dp[i …

搭建YOLOv10环境 训练+推理+模型评估

文章目录 前言一、环境搭建必要环境1. 创建yolov10虚拟环境2. 下载pytorch (pytorch版本>1.8)3. 下载YOLOv10源码4. 安装所需要的依赖包 二、推理测试1. 将如下代码复制到ultralytics文件夹同级目录下并运行 即可得到推理结果2. 关键参数 三、训练及评估1. 数据结构介绍2. 配…

kotlin基础之泛型和委托

Kotlin泛型的概念及使用 泛型概念 在Kotlin中&#xff0c;泛型&#xff08;Generics&#xff09;是一种允许在类、接口和方法中使用类型参数的技术。这些类型参数在实例化类、实现接口或调用方法时会被具体的类型所替代。泛型的主要目的是提高代码的复用性、类型安全性和可读…

oracle翻页查询的小坑记录

oracle的查询&#xff0c;因为能获取到查询结果的rownum&#xff0c;就想着直接在查询条件后面做翻页&#xff0c;而且首页确实是正常查询到了。后面才发现翻页是空的。。。 这是因为rownum排序是在查询结果才分配的。所以应该把查询结果作为子查询&#xff0c;在外查询应用排序…

【深度好文】AI企业融合联盟营销,做的好就是最大赢家!

AI工具市场正在迅速发展&#xff0c;现仍有不少企业陆续涌出&#xff0c;那么如何让你的工具受到目标群体的关注呢&#xff1f;这相比是AI工具营销人员一直在思考的问题。 即使这个市场正蓬勃发展&#xff0c;也无法保证营销就能轻易成功。AI工具虽然被越来越多人认可和接受&a…

Windows配置java环境JDK

配置jdk环境非常简单&#xff0c;大概有以下几步&#xff1a; 下载jdk安装&#xff0c;然后双击进行安装配置环境变量(也不是一定非要配置环境变量&#xff0c;配置环境变量的好处就是&#xff0c;在任何位置&#xff0c;系统都可以找到安装路径&#xff0c;非常实用且方便) …

短信平台-平台群发短信

时代的进步带来了我们生活的便利&#xff0c;而其中最受欢迎和广泛应用的方式之一就是通过短信传递信息。在这个飞速发展的数字时代&#xff0c;我们需要一个高效、可靠的短信平台来满足不断增长的通讯需求。而今天&#xff0c;我要向大家推荐的正是这样一款卓越的短信平台——…

连接远程的kafka【linux】

# 连接远程的kafka【linux】 前言版权推荐连接远程的kafka【linux】一、开放防火墙端口二、本地测试是否能访问端口三、远程kafka配置四、开启远程kakfa五、本地测试能否连接远程六、SpringBoot测试连接 遇到的问题最后 前言 2024-5-14 18:45:48 以下内容源自《【linux】》 仅…