一、Token 拦截的整体流程
1.客户端发起请求:用户在前端登录后,服务端返回一个 Token,后续请求需携带该 Token。
2.请求到达服务端:请求首先经过拦截器或过滤器。
3.拦截器验证 Token:
解析 Token 内容(如是否过期、签名是否合法)。
验证用户身份(如从 Token 中提取用户 ID 并查询数据库)。
4.放行或拒绝请求:
如果 Token 合法,将用户信息存入上下文(如自定义 ThreadLocal),继续执行业务逻辑。
如果 Token 不合法或缺失,直接返回错误响应(如 401 )。
二、使用拦截器拦截请求
@Component public class TokenValidationInterceptor implements HandlerInterceptor { @Autowired private IAdminUserService adminUserService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 获取请求头中的Token String token = request.getHeader("Authorization"); if (token != null && !token.isEmpty()) { // 校验管理员token if (isValidToken(token)) { // 继续处理请求 return true; } else { response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 阻止请求继续 return false; } } else { response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 阻止请求继续 return false; } } private boolean isValidToken(String token) { // 查询数据库检查Token是否存在且有效 AdminUser user = adminUserService.findByToken(token); if (ObjectUtil.isNotEmpty(user)) { return true; } return false; } }
@Configuration public class WebInterceptorConfig implements WebMvcConfigurer { @Autowired private TokenValidationInterceptor tokenValidationInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { // 指定需要拦截的URL模式 registry.addInterceptor(tokenValidationInterceptor) .addPathPatterns("/adminUser/**") // 排除不需要拦截的路径 .excludePathPatterns("/user/**", "/adminUser/loginAndRegister", "/answer/**", "/question/**"); } }
三、Token拦截的关键步骤
// 获取请求头中的Token
String token = request.getHeader("Authorization");
拿到token以后就可以对它进行校验是否过期、无效,验证失败就返回401
// int SC_UNAUTHORIZED = 401;
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);