从 Token 拦截器到 Web 配置
在平常的开发工作中,Token 拦截器、跨域配置,是我们系统开发中必须配置实现的。那么,应该如何定义一个 Token 拦截器呢?如何配置跨域?加了 Token 拦截器,如果有接口需要放行,又该如何配置呢?今天来总结一下 Token 拦截器定义及WebConfig配置。
一:Token 拦截器
1:主要作用:身份验证、权限控制、请求过滤。
2:示例:
/*** Token 拦截器:负责接口的 Token 校验、用户信息传递、非法请求拦截*/public class TokenInterceptor implements HandlerInterceptor {private static final Logger log = LoggerFactory.getLogger(TokenInterceptor.class);private static final String TOKEN_PREFIX = "Bearer ";@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 排除非控制器请求(如静态资源、OPTIONS 预检请求)if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {log.info("拦截到OPTIONS预检请求,放行", request.getRequestURI());return true;}String url = request.getRequestURI();// 如访问静态资源、Swagger 文档等排除掉if (url.contains("/swagger") || url.contains("/api-docs") || url.contains("login")) {return true;}String token = null;String authHeader = request.getHeader("Authorization");if (authHeader != null && authHeader.startsWith(TOKEN_PREFIX)) {token = authHeader.substring(TOKEN_PREFIX.length()).trim();}if (token == null || token.isEmpty()) {return sendErrorResponse(response, 401, "Token 不能为空,请先登录");}try {boolean isTokenValid = TokenUtil.verify(token);if (!isTokenValid) {return sendErrorResponse(response, 401, "Token 无效,请重新登录");}} catch (Exception e) {log.error("Token 校验异常", e);return sendErrorResponse(response, 400, "Token 格式错误,请检查请求头");}try {String userId = TokenUtil.getUserId(token);request.setAttribute("currentUserId", userId);} catch (Exception e) {// 捕获用户信息提取异常(如 Token 结构异常)log.error("解析 token 信息异常", e);return sendErrorResponse(response, 500, "用户服务异常,请联系管理员");}return true;}
}
二:WebConfig 配置类
1:主要作用:注册拦截器、跨域配置、资源映射、扩展 web 功能。
2:示例:
/*** Web应用配置类* 用于配置跨域、拦截器、静态资源、消息转换器等Web相关组件*/@Configurationpublic class WebConfig implements WebMvcConfigurer {@Resourceprivate TokenInterceptor tokenInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 注册拦截器registry.addInterceptor(tokenInterceptor).addPathPatterns("/api/**") // 拦截所有/api/**路径.excludePathPatterns( // 排除不需要拦截的路径"/api/login","/api/register","/api/verify-code");}/*** 配置跨域资源共享(CORS)*/@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/api/**") // 对所有/api/**路径的请求允许跨域.allowedOriginPatterns("*") // 允许所有来源,生产环境建议指定具体域名.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 允许的HTTP方法.allowedHeaders("*") // 允许的请求头.exposedHeaders("Authorization") // 允许前端获取的响应头.allowCredentials(true) // 允许携带Cookie.maxAge(3600); // 预检请求的缓存时间(秒)}/*** 配置静态资源映射* * 让浏览器能通过 HTTP 请求访问服务器本地的上传文件(/upload/** → 本地uploads目录)。* 项目内静态资源的访问路径(/static/** → 项目resources/static目录)。*/@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {// 配置本地文件上传路径映射registry.addResourceHandler("/upload/**").addResourceLocations("file:./uploads/"); // 映射到项目根目录下的uploads文件夹// 配置静态资源访问路径,覆盖默认配置registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");}}
三:总结
TokenInterceptor(令牌拦截器)的核心作用是实现统一身份认证,它在请求到达Controller前自动拦截,负责验证JWT令牌的有效性、解析用户信息并绑定到请求上下文,从而保障API安全。WebConfig(Web配置类)则作为调度中心,通过注册拦截器并定义其拦截与排除的URL路径,使得TokenInterceptor能够在特定规则下生效,同时它也常用于配置全局跨域等MVC相关设置。两者协同工作,将认证逻辑从业务代码中解耦,实现了安全控制的集中化管理。