🔥整套登录 + JWT + 鉴权 + 拦截器(大厂面试链路)

Carlos 发布于 2026-04-15 76 次阅读


这部分你讲出来,面试官基本不会再追你基础。


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(面试高频)

对比JWTSession
状态无状态有状态
存储客户端服务端
扩展性
分布式天然支持需要共享

6️⃣ 生产级优化(你说这个直接加分🔥)

✅ 1. Token过期机制

exp: 2小时

✅ 2. Refresh Token

👉 防止频繁登录


✅ 3. Redis黑名单

👉 实现“退出登录”


✅ 4. 网关统一鉴权(微服务)

👉 不在每个服务写拦截器


三、🔥最后一段总结(你直接背)

👉

/users/100/orders/1 表示用户100的订单1,是一种资源嵌套设计,用于表达资源之间的从属关系;
在实际项目中,通常结合 JWT 实现无状态认证,用户登录后获取 token,后续请求通过 Authorization 头携带,服务端通过拦截器进行统一鉴权,从而实现高并发和分布式系统的扩展性。

✨职务:华夏大地区域代理人 | 熬夜秃头项目主理人 💳黑卡:校园一卡通全球辅导版持有者 📍地点:宇宙-银河系-地球-东北蹲分部 🥂生活方式:沉迷于廉价多巴胺 | 致力于在该醒的时候睡觉 🚫拒绝:拒绝早起 | 拒绝内卷| 拒绝借钱 简介:虽然我没钱,但我有时间;虽然我没才华,但我有脾气。
最后更新于 2026-04-15