1. 项目概述
在Java Web开发中,登录认证是一个基础但至关重要的功能模块。本文将详细介绍如何基于JWT令牌和Filter实现一个完整的登录认证系统。这个系统不仅能验证用户身份,还能在后续请求中持续保持用户的登录状态,确保只有经过认证的用户才能访问受保护的资源。
登录认证的核心在于解决两个问题:一是如何安全地验证用户身份,二是如何在用户登录后保持其认证状态。传统的会话管理方式(如Cookie和Session)存在诸多局限性,而JWT(JSON Web Token)作为一种轻量级的认证方案,能够很好地解决这些问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 登录功能实现
2.1 实体类设计
首先我们需要设计一个实体类来封装登录成功后返回给前端的数据:
java复制@Data
@NoArgsConstructor
@AllArgsConstructor
public class LoginInfo {
private Integer id; // 用户ID
private String username; // 用户名
private String name; // 用户真实姓名
private String token; // JWT令牌
}
这个实体类包含了用户的基本信息和认证令牌,使用Lombok注解简化了getter/setter等方法的编写。
2.2 控制器层实现
控制器层负责接收前端请求并返回响应:
java复制@Slf4j
@RestController
public class LoginController {
@Autowired
private EmpService empService;
@PostMapping("/login")
public Result login(@RequestBody Emp emp) {
log.info("登录请求: {}", emp);
LoginInfo loginInfo = empService.login(emp);
return loginInfo != null ?
Result.success(loginInfo) :
Result.error("用户名或密码错误!");
}
}
这里使用了@RestController注解,表示这是一个REST风格的控制器。@PostMapping指定了处理POST请求的路径。
2.3 服务层实现
服务层包含核心的业务逻辑:
java复制public interface EmpService {
LoginInfo login(Emp emp);
}
@Slf4j
@Service
public class EmpServiceImpl implements EmpService {
@Autowired
private EmpMapper empMapper;
@Override
public LoginInfo login(Emp emp) {
Emp e = empMapper.getByUsernameAndPassword(emp);
if(e != null){
log.info("登录成功:{}", e);
Map<String, Object> claims = new HashMap<>();
claims.put("id", e.getId());
claims.put("username", e.getUsername());
String jwt = JwtUtils.generateToken(claims);
return new LoginInfo(e.getId(), e.getUsername(), e.getName(), jwt);
}
return null;
}
}
服务层通过调用Mapper接口验证用户凭证,验证成功后生成JWT令牌。
2.4 数据访问层实现
数据访问层使用MyBatis实现:
java复制@Mapper
public
