本文目录导读:

实现用户管理是 Java Web 开发中最常见的任务之一,一个完整的用户管理系统通常包括注册、登录、信息管理(CRUD)、权限控制等功能。
下面我会为你拆解一个标准的 Java 用户管理案例实现思路,并提供核心代码片段,这里我们假设使用目前最主流的Spring Boot + MyBatis-Plus + MySQL + Thymeleaf(模板引擎) 技术栈。
整体架构概览
- 表现层(Controller):处理HTTP请求,返回视图或JSON数据。
- 业务层(Service):处理核心业务逻辑(如密码加密、校验)。
- 持久层(Mapper/DAO):与数据库交互,执行SQL。
- 模型层(Entity/Model):对应数据库中的“用户表”。
数据库设计
创建一张最基础的用户表。
CREATE TABLE `sys_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `username` varchar(50) NOT NULL COMMENT '用户名', `password` varchar(100) NOT NULL COMMENT '加密后的密码', `real_name` varchar(50) DEFAULT NULL COMMENT '真实姓名', `email` varchar(100) DEFAULT NULL COMMENT '邮箱', `phone` varchar(20) DEFAULT NULL COMMENT '手机号', `status` tinyint(4) DEFAULT '1' COMMENT '状态:1启用,0禁用', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
核心代码实现
实体类
// User.java
@Data // Lombok 注解,自动生成getter/setter/toString等
@TableName("sys_user") // MyBatis-Plus 注解
public class User {
@TableId(type = IdType.AUTO) // 主键自增
private Long id;
private String username;
private String password; // 存储加密后的密码
private String realName;
private String email;
private String phone;
private Integer status;
private Date createTime;
private Date updateTime;
}
持久层 Mapper
使用 MyBatis-Plus,代码非常简洁:
// UserMapper.java
@Mapper // 标记为MyBatis的映射器
public interface UserMapper extends BaseMapper<User> {
// 基础CRUD方法由 BaseMapper 提供,无需自己写SQL
// userMapper.selectById(1L),userMapper.insert(user)
// 如果有复杂查询,可以在此自定义方法
}
业务层 Service
关键点:密码存储必须使用哈希加密(如 BCrypt),绝不能存明文。
// UserService.java
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
// 密码编码器,由 Spring Security 或 Spring 提供
@Autowired
private PasswordEncoder passwordEncoder;
// 用户注册
public void register(User user) {
// 1. 检查用户名是否已存在
User existingUser = userMapper.selectOne(
new LambdaQueryWrapper<User>()
.eq(User::getUsername, user.getUsername())
);
if (existingUser != null) {
throw new RuntimeException("用户名已存在");
}
// 2. 密码加密(核心安全步骤)
user.setPassword(passwordEncoder.encode(user.getPassword()));
// 3. 设置默认状态和创建时间
user.setStatus(1);
user.setCreateTime(new Date());
user.setUpdateTime(new Date());
// 4. 执行插入
userMapper.insert(user);
}
// 用户登录校验
public User login(String username, String rawPassword) {
// 1. 根据用户名查找用户
User user = userMapper.selectOne(
new LambdaQueryWrapper<User>()
.eq(User::getUsername, username)
);
if (user == null) {
throw new RuntimeException("用户不存在");
}
// 2. 校验密码(用加密后的密文和输入的明文比对)
boolean matches = passwordEncoder.matches(rawPassword, user.getPassword());
if (!matches) {
throw new RuntimeException("密码错误");
}
// 3. 检查状态
if (user.getStatus() == 0) {
throw new RuntimeException("账户已被禁用");
}
return user; // 登录成功,返回用户信息(一般不放密码)
}
// 分页查询用户列表(管理功能)
public Page<User> listUsers(int pageNum, int pageSize) {
Page<User> page = new Page<>(pageNum, pageSize);
return userMapper.selectPage(page, null);
}
// 更新用户信息
public void updateUser(User user) {
user.setUpdateTime(new Date());
// 注意:更新时通常不更新密码(有专门改密码接口)
userMapper.updateById(user);
}
// 删除/禁用用户
public void deleteUser(Long id) {
userMapper.deleteById(id); // 物理删除
// 或 逻辑删除:update user set status = 0 where id = ?
}
}
控制器 Controller
// UserController.java
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
// 跳转用户列表页
@GetMapping("/list")
public String list(Model model,
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "10") int size) {
Page<User> userPage = userService.listUsers(page, size);
model.addAttribute("page", userPage);
return "user/list"; // 模板引擎视图
}
// 跳转添加用户页面
@GetMapping("/add")
public String addUserPage() {
return "user/add";
}
// 处理添加用户的 POST 请求
@PostMapping("/add")
public String addUser(User user) {
userService.register(user);
return "redirect:/user/list"; // 重定向到列表页
}
// 处理登录请求
@PostMapping("/login")
public String login(String username, String password, HttpSession session) {
try {
User user = userService.login(username, password);
// 将用户信息存入 Session(表明已登录)
session.setAttribute("loginUser", user);
return "redirect:/index"; // 登录成功跳转首页
} catch (Exception e) {
// 失败后携带错误信息返回登录页
return "redirect:/login?error=" + e.getMessage();
}
}
// 退出登录
@GetMapping("/logout")
public String logout(HttpSession session) {
session.invalidate(); // 销毁 Session
return "redirect:/login";
}
}
前端页面示意(Thymeleaf)
src/main/resources/templates/user/list.html:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><title>用户管理</title></head>
<body>
<h2>用户列表</h2>
<a th:href="@{/user/add}">新增用户</a>
<table border="1">
<tr>
<th>ID</th>
<th>用户名</th>
<th>姓名</th>
<th>邮箱</th>
<th>状态</th>
<th>操作</th>
</tr>
<tr th:each="user : ${page.records}">
<td th:text="${user.id}"></td>
<td th:text="${user.username}"></td>
<td th:text="${user.realName}"></td>
<td th:text="${user.email}"></td>
<td th:text="${user.status == 1 ? '启用' : '禁用'}"></td>
<td>
<a th:href="@{/user/edit(id=${user.id})}">编辑</a>
<a th:href="@{/user/delete(id=${user.id})}" onclick="return confirm('确认删除?')">删除</a>
</td>
</tr>
</table>
</body>
</html>
重要的安全与规范补充
-
密码加密:务必使用
BCryptPasswordEncoder(Spring Security 提供),不要用 MD5,BCrypt 自动加盐,抗暴力破解能力强,配置如下:@Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } -
Session 管理:登录后将用户信息存入 Session,后续请求需要校验 Session 中的用户是否存在(拦截器或过滤器实现)。
-
拦截器(验证登录状态):
public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); if (session.getAttribute("loginUser") == null) { response.sendRedirect("/login"); return false; } return true; } }然后在配置类中注册,排除
/login、/user/register等路径。 -
统一异常处理(@ControllerAdvice): 捕获
RuntimeException并返回友好的错误页面或 JSON。
这个案例覆盖了用户管理的核心链路: 数据库表设计 → 实体映射 → Mapper(CRUD) → Service(业务+加密+校验) → Controller(请求分发) → 前端页面展示。
对于生产级系统,还可以往上叠加:
- 角色与权限:添加
role表和中间表,使用 Spring Security 或 Shiro。 - JWT/Token 登录:适用于前后端分离架构(Vue + Java API)。
如果你用的是纯 Servlet/JSP 年代的老项目,原理一样,只是把 Spring 那层换成手动 JDBC 和 HttpServlet,不过对于新项目,强烈建议用 Spring Boot 开始,效率高很多。