这部分你讲出来,面试官基本不会再追你基础。
1️⃣ 登录流程(核心)
✅ Step1:用户登录
POST /login
{
"username": "carlos",
"password": "123456"
}
✅ Step2:服务端验证
if (userService.check(username, password)) {
// 生成 token
}
✅ Step3:生成 JWT(重点)
👉 JWT = 三部分:
header.payload.signature
示例(简化)
eyJhbGciOiJIUzI1NiIs...
👉 payload里一般放:
{
"userId": 100,
"username": "carlos",
"exp": 1710000000
}
✅ Step4:返回给前端
{
"token": "xxx"
}
✅ Step5:前端保存
👉 一般放:
- localStorage ✔
- 或 cookie
2️⃣ 后续请求(无状态核心🔥)
GET /users/100
Authorization: Bearer xxx
👉 每次请求都带 token
3️⃣ 后端鉴权流程(重点🔥)
👉 使用拦截器(Spring MVC)
public class JwtInterceptor implements HandlerInterceptor { @Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) { String token = request.getHeader("Authorization"); if (token == null) {
throw new RuntimeException("未登录");
} // 校验token
Claims claims = JwtUtil.parse(token); if (claims == null) {
throw new RuntimeException("token无效");
} return true;
}
}
👉 注册拦截器
@Configuration
public class WebConfig implements WebMvcConfigurer { @Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new JwtInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/login");
}
}
👉 执行流程(面试必说🔥)
请求 → DispatcherServlet → Interceptor → Controller
👉 拦截器在 Controller 前执行
4️⃣ 为什么 JWT 适合无状态?
✅ 核心原因
👉 token里已经包含用户信息:
{
"userId": 100
}
👉 服务端:
✔ 不需要 session
✔ 不需要查数据库(可选)
5️⃣ JWT vs Session(面试高频)
| 对比 | JWT | Session |
|---|---|---|
| 状态 | 无状态 | 有状态 |
| 存储 | 客户端 | 服务端 |
| 扩展性 | 强 | 差 |
| 分布式 | 天然支持 | 需要共享 |
6️⃣ 生产级优化(你说这个直接加分🔥)
✅ 1. Token过期机制
exp: 2小时
✅ 2. Refresh Token
👉 防止频繁登录
✅ 3. Redis黑名单
👉 实现“退出登录”
✅ 4. 网关统一鉴权(微服务)
👉 不在每个服务写拦截器
三、🔥最后一段总结(你直接背)
👉
/users/100/orders/1表示用户100的订单1,是一种资源嵌套设计,用于表达资源之间的从属关系;
在实际项目中,通常结合 JWT 实现无状态认证,用户登录后获取 token,后续请求通过 Authorization 头携带,服务端通过拦截器进行统一鉴权,从而实现高并发和分布式系统的扩展性。
Comments NOTHING