Spring Boot 实战篇(四):实现用户登录与注册功能

ops/2025/3/3 19:18:25/

目录

Spring Boot 实战篇(四):实现用户登录与注册功能

一、用户注册功能

(一)前端页面设计(简要提及)

(二)后端实现

二、用户登录功能

(一)前端页面设计(简要提及)

(二)后端实现


在构建 Web 应用程序时,用户登录与注册功能是常见且重要的部分。以下将详细介绍在 Spring Boot 项目中实现用户登录与注册功能的步骤,并附上相应的代码示例。

一、用户注册功能

(一)前端页面设计(简要提及)
  1. 创建注册页面

    • 使用 HTML、CSS 和 JavaScript 等前端技术创建一个用户注册页面。页面应包含输入框用于输入用户名、密码、确认密码、邮箱等信息,以及一个提交按钮。
    • 例如,在 HTML 中创建一个表单:
    注册页面



  2. 前端数据校验(可选)

    • 在前端 JavaScript 代码(如register.js)中,可以添加一些基本的数据校验逻辑,如检查用户名是否为空、密码长度是否符合要求、两次密码是否一致等。
    • 代码示例(简单的密码一致性校验):

    document.getElementById(‘registerForm’).addEventListener(‘submit’, function (e) {
    e.preventDefault();
    const password = document.getElementById(‘password’).value;
    const confirmPassword = document.getElementById(‘confirmPassword’).value;
    if (password!== confirmPassword) {
    alert(‘两次密码不一致’);
    return;
    }
    // 后续可添加更多校验和提交数据到后端的逻辑
    });

(二)后端实现
  1. 在服务层添加注册方法

    • UserService接口中添加registerUser方法,用于处理用户注册逻辑。
    • 代码示例:

    package com.example.myproject.service;

    import com.example.myproject.entity.User;
    import java.util.List;

    public interface UserService {
    List getAllUsers();
    User getUserById(Long id);
    boolean registerUser(User user);
    }

  2. 在服务层实现类中实现注册方法

    • UserServiceImpl类中实现registerUser方法,步骤如下:
      • 对用户输入的密码进行加密(使用合适的加密算法,如 BCryptPasswordEncoder)。
      • 检查用户名是否已存在(调用UserDao的方法查询数据库)。
      • 如果用户名不存在,将用户信息插入数据库(调用UserDaoinsert方法)。
    • 代码示例:

    package com.example.myproject.service.impl;

    import com.example.myproject.dao.UserDao;
    import com.example.myproject.entity.User;
    import com.example.myproject.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
    import org.springframework.stereotype.Service;
    import java.util.List;

    @Service
    public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;
    private BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();

    @Override
    public List<User> getAllUsers() {return userDao.findAll();
    }@Override
    public User getUserById(Long id) {return userDao.findById(id);
    }@Override
    public boolean registerUser(User user) {// 加密密码user.setPassword(passwordEncoder.encode(user.getPassword()));// 检查用户名是否已存在User existingUser = userDao.findByUsername(user.getUsername());if (existingUser!= null) {return false;}// 插入用户信息userDao.insert(user);return true;
    }
    

    }

  • 这里假设UserDao中已经有findByUsername方法用于根据用户名查询用户。
  1. 在控制器中添加注册接口

    • UserController中添加一个处理注册请求的方法,使用@PostMapping注解标识该方法处理 HTTP POST 请求,请求路径为/register
    • 在方法中接收前端传来的用户注册信息(通过@RequestBody注解将 JSON 数据转换为User对象),调用服务层的registerUser方法处理注册逻辑,并根据结果返回相应的响应给前端。
    • 代码示例:

    package com.example.myproject.controller;

    import com.example.myproject.entity.User;
    import com.example.myproject.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.ResponseEntity;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RestController;

    @RestController
    public class UserController {
    @Autowired
    private UserService userService;

    @PostMapping("/register")
    public ResponseEntity<String> registerUser(@RequestBody User user) {boolean success = userService.registerUser(user);if (success) {return new ResponseEntity<>("注册成功", HttpStatus.CREATED);} else {return new ResponseEntity<>("用户名已存在", HttpStatus.BAD_REQUEST);}
    }
    

    }

二、用户登录功能

(一)前端页面设计(简要提及)
  1. 创建登录页面

    • 类似注册页面,使用前端技术创建一个登录页面,包含用户名和密码输入框以及登录按钮。
    • 例如:
    登录页面

  2. 前端交互逻辑(可选)

    • login.js中,可以添加一些交互逻辑,如点击登录按钮时发送登录请求到后端,以及处理登录成功或失败的提示信息。
(二)后端实现
  1. 在服务层添加登录方法

    • UserService接口中添加loginUser方法,用于处理用户登录逻辑。
    • 代码示例:

    package com.example.myproject.service;

    import com.example.myproject.entity.User;
    import java.util.List;

    public interface UserService {
    List getAllUsers();
    User getUserById(Long id);
    boolean registerUser(User user);
    boolean loginUser(String username, String password);
    }

  2. 在服务层实现类中实现登录方法

    • UserServiceImpl类中实现loginUser方法,步骤如下:
      • 根据用户名查询用户信息(调用UserDaofindByUsername方法)。
      • 如果用户存在,使用密码编码器验证输入的密码是否与数据库中存储的密码匹配。
      • 如果密码匹配,登录成功,可根据需求返回一些信息(如用户信息或 Token 等,这里简单返回true表示登录成功)。
    • 代码示例:

    @Override
    public boolean loginUser(String username, String password) {
    User user = userDao.findByUsername(username);
    if (user!= null) {
    return passwordEncoder.matches(password, user.getPassword());
    }
    return false;
    }

  3. 在控制器中添加登录接口

    • UserController中添加一个处理登录请求的方法,使用@PostMapping注解,请求路径为/login
    • 在方法中接收前端传来的用户名和密码,调用服务层的loginUser方法进行登录验证,并根据结果返回相应的响应给前端。
    • 代码示例:

    @PostMapping(“/login”)
    public ResponseEntity loginUser(@RequestBody UserLoginRequest request) {
    boolean success = userService.loginUser(request.getUsername(), request.getPassword());
    if (success) {
    return new ResponseEntity<>(“登录成功”, HttpStatus.OK);
    } else {
    return new ResponseEntity<>(“用户名或密码错误”, HttpStatus.UNAUTHORIZED);
    }
    }

  • 这里假设UserLoginRequest是一个包含用户名和密码属性的请求类,用于接收前端登录请求的数据。

通过以上步骤,我们实现了用户登录与注册功能。在实际应用中,还可以进一步优化,如添加更多的安全措施(如防止暴力破解密码、使用 Token 进行身份验证等)、完善用户信息验证规则、处理登录状态管理等。同时,确保密码加密的安全性和数据库操作的可靠性也是非常重要的方面。


http://www.ppmy.cn/ops/162843.html

相关文章

etcd部署硬件资源推荐

etcd部署硬件资源推荐 原文&#xff1a;https://etcd.io/docs/v3.5/op-guide/hardware/ etcd 通常在开发或测试环境中运行良好&#xff0c;即使资源有限&#xff1b;在笔记本电脑或廉价云服务器上开发时&#xff0c;使用 etcd 也很常见。然而&#xff0c;在生产环境中运行 etcd…

Powershell和BTEQ工具实现带多组参数和标签的Teradata数据库批量数据导出程序

设计一个基于多个带标签SQL模板作为配置文件和多组参数的Powershell代码程序和BTEQ工具&#xff0c;实现根据不同的输入参数&#xff0c;自动批量地将Teradata数据库的数据导出为CSV文件到指定目录上&#xff0c;标签和多个参数&#xff08;以“_”分割&#xff09;为组成导出数…

Hive基础

1.概述 Hive是一款apache旗下的基于MapReduce的分布式SQL计算工具&#xff0c;其功能是&#xff1a; 将SQL语句翻译成MapReduce程序运行 Hive组件 元数据管理(Matastore服务)SQL解析器(Driver驱动程序)用户接口 2.Hive在VMware虚拟机中部署 hive是单机运行的&#xff0c;…

8.Dashboard的导入导出

分享自己的Dashboard 1. 在Dashboard settings中选择 JSON Model 2. 导入 后续请参考第三篇导入光放Dashboard&#xff0c;相近

Redis的持久化-RDBAOF

文章目录 一、 RDB1. 触发机制2. 流程说明3. RDB 文件的处理4. RDB 的优缺点 二、AOF1. 使用 AOF2. 命令写⼊3. 文件同步4. 重写机制5 启动时数据恢复 一、 RDB RDB 持久化是把当前进程数据生成快照保存到硬盘的过程&#xff0c;触发 RDB 持久化过程分为手动触发和自动触发。 …

CSS 系列之:基础知识

块级元素和内联元素 块级元素行内元素块级元素是指在页面上以块的形式显示的元素内联元素&#xff08;又称行内元素&#xff09;以行的形式显示它们会独占一行&#xff0c;并且默认情况下会占满其父元素的宽度不独占一行<div>、<p>、<h1>至<h6>、<…

【网络】TCP vs UDP详解( 含python代码实现)

【网络】TCP vs UDP详解 1. 基本概念2. 主要特性对比3. 工作原理TCP 的工作原理UDP 的工作原理 4. 优缺点对比5. 适用场景6. 代码示例TCP 服务器TCP 客户端UDP 服务器UDP 客户端 7. 总结 TCP&#xff08;传输控制协议&#xff09;和 UDP&#xff08;用户数据报协议&#xff09;…

系统架构设计师—计算机基础篇—计算机网络

文章目录 网络互联模型网络协议与标准应用层协议FTP协议TFTP协议 HTTP协议HTTPS协议 DHCP动态主机配置协议DNS协议迭代查询递归查询 传输层协议网络层协议IPV4协议IPV6协议IPV6数据报的目的地址IPV4到IPV6的过渡技术 网络设计分层设计接入层汇聚层核心层 网络布线综合布线系统工…