您的位置:

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 的核心特性和使用方式。