Spring Boot 实现登录注册功能

发布时间:2023-05-18

Spring Boot 实现登录注册功能

一、Spring Boot 简介

Spring Boot 是基于 Spring Framework 核心的一个快速开发工具,通过自动配置、约定优于配置的方式,简化了 Spring 应用的开发和部署。Spring Boot 不仅可以帮助我们快速开发 Web 应用,还提供了很多工具和组件,比如安全认证、数据库操作、缓存操作、消息队列和邮件等等,极大地提高了我们的开发效率。

二、登录注册功能的需求分析

一般情况下,Web 应用都需要用户登录和注册功能,这些功能是基础中的基础。 具体用户需求如下:

  1. 用户需要能够注册一个新账号
  2. 用户需要能够使用已有的账号进行登录
  3. 登录成功后需要能够跳转到首页或者个人中心页面
  4. 登录失败需要给出相应的错误信息提示

三、准备工作

在开始编写代码之前,我们需要进行一些准备工作:

  1. 安装 JDK 8 或以上版本
  2. 安装 Maven
  3. 安装任意一种 IDE,比如 Eclipse、IntelliJ IDEA 等 接下来,我们就可以开始创建一个基于 Spring Boot 的 Web 项目。

四、创建 Spring Boot 项目

我们可以使用 Spring Initializr 来快速创建一个 Spring Boot 项目。

  1. 打开 https://start.spring.io/ 网站
  2. 选择项目信息
    • 选择项目语言:Java
    • 选择 Spring Boot 版本:2.3.0 或以上版本
    • 输入项目信息:GroupId、ArtifactId、Name、Description 等
    • 选择项目依赖:Web、Spring Security、MyBatis(或其他的数据库框架)等
  3. 点击 Generate 按钮下载项目模板
  4. 解压下载的项目模板到本地目录

五、实现登录注册功能

1. 数据库设计

在登录注册功能实现中,我们需要两个数据表:

CREATE TABLE user (
   user_id INT AUTO_INCREMENT PRIMARY KEY,
   username VARCHAR(20) UNIQUE NOT NULL,
   password VARCHAR(100) NOT NULL,
   email VARCHAR(50) UNIQUE NOT NULL,
   create_time datetime NOT NULL
);
CREATE TABLE user_role (
   user_id INT NOT NULL,
   role_id INT NOT NULL,
   PRIMARY KEY (user_id, role_id),
   FOREIGN KEY (user_id) REFERENCES user(user_id),
   FOREIGN KEY (role_id) REFERENCES role(role_id)
);

这里的 user 表用来存储用户注册信息,user_role 表用来存储用户角色信息。

2. 实现注册功能

注册功能主要流程:

  1. 用户填写注册表单,包括用户名、邮箱、密码等信息
  2. 后端校验用户输入的信息是否合法,如果有错误信息需要返回给前端显示
  3. 如果信息无误,将用户信息保存到数据库,注册成功后跳转到登录页面 首先,我们需要创建一个 User 实体类来映射数据库中的 user 表:
public class User {
   private Integer userId;
   private String username;
   private String password;
   private String email;
   private Date createTime;
   // getter 和 setter 省略
}

接下来,我们需要在 controller 中实现注册功能,如下所示:

@Autowired
private UserService userService;
@PostMapping("/register")
public String register(User user) {
    Result result = userService.register(user);
    if (result.getCode() == ResultEnum.SUCCESS.getCode()) {
        return "redirect:/login";
    } else {
        return "register";
    }
}

上面的代码中,我们注入了一个 UserService 对象,调用 register 方法接收用户信息,如果注册成功则跳转到登录页面,否则返回注册页面并显示错误信息。 UserService 代码如下所示:

@Autowired
private UserMapper userMapper;
public Result register(User user) {
    // 1. 校验用户名、邮箱和密码是否为空,用户名和邮箱是否已经存在
    String username = user.getUsername();
    String email = user.getEmail();
    String password = user.getPassword();
    if (StringUtils.isEmpty(username) || StringUtils.isEmpty(email) || StringUtils.isEmpty(password)) {
        return ResultUtils.error(ResultEnum.E1001);
    }
    if (userMapper.getUserByUsername(username) != null) {
        return ResultUtils.error(ResultEnum.E1002);
    }
    if (userMapper.getUserByEmail(email) != null) {
        return ResultUtils.error(ResultEnum.E1003);
    }
    // 2. 将密码使用 MD5 加密
    String md5Password = MD5Utils.encrypt(password);
    // 3. 将用户信息存储到数据库中
    user.setPassword(md5Password);
    user.setCreateTime(new Date());
    userMapper.insertUser(user);
    return ResultUtils.success();
}

UserService 中,我们首先校验了用户名、邮箱和密码是否为空,以及用户名和邮箱是否已存在。然后将密码使用 MD5 进行加密,并将用户信息插入到数据库中。 这里我们使用了一个 Result 对象来封装方法的返回结果,其代码如下所示:

public class Result {
    private int code;
    private String message;
    private Object data;
    // getter 和 setter 省略
}
public enum ResultEnum {
    SUCCESS(0, "成功"),
    E1001(1001, "参数不完整"),
    E1002(1002, "用户名已存在"),
    E1003(1003, "邮箱已存在");
    private int code;
    private String message;
    // 构造方法和 getter 省略
}
public class ResultUtils {
    public static Result success() {
        return success(null);
    }
    public static Result success(Object data) {
        Result result = new Result();
        result.setCode(ResultEnum.SUCCESS.getCode());
        result.setMessage(ResultEnum.SUCCESS.getMessage());
        result.setData(data);
        return result;
    }
    public static Result error(ResultEnum resultEnum) {
        Result result = new Result();
        result.setCode(resultEnum.getCode());
        result.setMessage(resultEnum.getMessage());
        return result;
    }
}

Result 是一个通用的返回结果封装类,包括了代码、消息和数据三个信息。ResultEnum 枚举类定义了通用的返回状态码和错误信息,ResultUtils 是一个结果工具类,定义了常用的返回方法,比如成功和失败,同时可以传入不同的数据参数。 最后,我们需要在注册页面实现注册表单,如下所示:

<form action="/register" method="post">
   <div class="form-group">
       <label for="username">用户名</label>
       <input type="text" class="form-control" id="username" name="username">
   </div>
   <div class="form-group">
       <label for="email">邮箱</label>
       <input type="email" class="form-control" id="email" name="email">
   </div>
   <div class="form-group">
       <label for="password">密码</label>
       <input type="password" class="form-control" id="password" name="password">
   </div>
   <button type="submit" class="btn btn-primary">注册</button>
</form>

3. 实现登录功能

登录功能主要流程:

  1. 用户填写登录表单,包括用户名和密码
  2. 后端校验用户输入的用户名和密码是否正确,如果有错误信息需要返回给前端显示
  3. 如果信息无误,将用户信息保存在 session 中,并跳转到首页或者个人中心页面 同样地,我们需要在 controller 中实现登录功能,如下所示:
@Autowired
private UserService userService;
@PostMapping("/login")
public String login(String username, String password, HttpSession session) {
    User user = userService.login(username, password);
    if (user != null) {
        session.setAttribute("user", user);
        return "redirect:/index";
    } else {
        return "login";
    }
}

上面的代码中,我们注入了 UserService 对象,调用 login 方法接收用户名和密码信息,如果登录成功则将用户信息存储在 session 中,跳转到首页或者个人中心页面,否则返回登录页面并显示错误信息。 UserService 代码如下所示:

@Autowired
private UserMapper userMapper;
public User login(String username, String password) {
    // 1. 根据用户名查询用户信息
    User user = userMapper.getUserByUsername(username);
    if (user == null) {
        return null;
    }
    // 2. 判断密码是否正确
    String md5Password = MD5Utils.encrypt(password);
    if (!md5Password.equals(user.getPassword())) {
        return null;
    }
    return user;
}

UserService 中,我们首先查找用户信息是否存在,然后将用户输入的密码使用 MD5 进行加密,和数据库中的密码进行比对,如果正确则返回相应的用户信息,否则返回 null。 最后,我们需要在登录页面实现登录表单,如下所示:

<form action="/login" method="post">
   <div class="form-group">
       <label for="username">用户名</label>
       <input type="text" class="form-control" id="username" name="username">
   </div>
   <div class="form-group">
       <label for="password">密码</label>
       <input type="password" class="form-control" id="password" name="password">
   </div>
   <button type="submit" class="btn btn-primary">登录</button>
</form>

六、总结

本文介绍了如何使用 Spring Boot 实现登录注册功能。具体来说,我们分析了注册和登录功能的需求,设计了相应的数据表,实现了后端的校验和数据库操作,最后在前端页面中实现了相应的表单。通过本文,相信读者可以更加深入地理解 Spring Boot 的核心特性和使用方式。