Token拦截的原理

发布于:2025-07-02 ⋅ 阅读:(26) ⋅ 点赞:(0)

一、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);

 


网站公告

今日签到

点亮在社区的每一天
去签到