1. 项目概述
在Java Web开发中,登录认证是一个基础但至关重要的功能模块。这次我们要实现的是一个基于JWT令牌和Filter的完整认证方案,这也是目前企业级应用中最常见的认证方式之一。不同于传统的Session认证,JWT(JSON Web Token)是一种无状态的认证机制,特别适合分布式系统和前后端分离架构。
我在实际项目中多次使用过这种方案,发现它既能解决跨域认证问题,又能减轻服务器存储压力。但同时也遇到过不少坑,比如令牌刷新、安全性处理等问题。下面就把这套方案的完整实现过程和经验总结分享给大家。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心组件解析
2.1 JWT令牌机制
JWT由三部分组成:Header(头部)、Payload(负载)和Signature(签名)。它的工作原理是这样的:
- 用户登录成功后,服务器生成一个包含用户信息的JWT
- 客户端保存这个JWT(通常放在localStorage或cookie中)
- 后续请求都在Authorization头中携带这个JWT
- 服务器验证JWT的有效性并处理请求
生成JWT的典型代码示例:
java复制public String generateToken(User user) {
// 设置过期时间
Date expireDate = new Date(System.currentTimeMillis() + EXPIRE_TIME);
return Jwts.builder()
.setHeaderParam("typ", "JWT") // 设置头部
.setSubject(user.getId()) // 设置主体
.setIssuedAt(new Date()) // 签发时间
.setExpiration(expireDate) // 过期时间
.claim("role", user.getRole()) // 自定义声明
.signWith(SignatureAlgorithm.HS512, SECRET_KEY) // 签名算法和密钥
.compact();
}
注意:SECRET_KEY一定要足够复杂且妥善保管,这是保证JWT安全的关键
2.2 Filter过滤器的作用
Filter是Java Web中的拦截器,可以在请求到达Servlet前进行预处理。在认证流程中,我们主要用它来做:
- 拦截需要认证的请求
- 从请求头中提取JWT
- 验证JWT的有效性
- 将用户信息存入请求上下文
Filter的执行顺序可以通过web.xml中的
3. 完整实现步骤
3.1 环境准备
首先确保你的项目包含以下依赖(Maven配置):
xml复制<!-- JWT支持 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>j
