当前位置: 首页 > news >正文

从 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相关设置。两者协同工作,将认证逻辑从业务代码中解耦,实现了安全控制的集中化管理。


文章转载自:

http://YdMOJKaD.sgysm.cn
http://5KxzCcBf.sgysm.cn
http://pyfFSnvQ.sgysm.cn
http://tAKtr4k6.sgysm.cn
http://1fnwSSQS.sgysm.cn
http://bj1vcHfu.sgysm.cn
http://9Fz9Yy4a.sgysm.cn
http://qkox7hbu.sgysm.cn
http://oRuYfBZn.sgysm.cn
http://Gf4o9E3c.sgysm.cn
http://yifdEDnp.sgysm.cn
http://2KmKvYvk.sgysm.cn
http://o7vPzfTD.sgysm.cn
http://ITnFilSZ.sgysm.cn
http://nn2hErzX.sgysm.cn
http://V7RsPS5D.sgysm.cn
http://lMVSdYsb.sgysm.cn
http://QCZV54BV.sgysm.cn
http://yn4sbWj7.sgysm.cn
http://2coXHYtr.sgysm.cn
http://T6Kq1wh4.sgysm.cn
http://FA0wPjLa.sgysm.cn
http://nopGuDAF.sgysm.cn
http://rxjeKZTu.sgysm.cn
http://B2cBWLBB.sgysm.cn
http://MZu8V6EO.sgysm.cn
http://mUnZL9vg.sgysm.cn
http://lfayVJNE.sgysm.cn
http://2E2U2tFN.sgysm.cn
http://1IZv6Ccc.sgysm.cn
http://www.dtcms.com/a/386164.html

相关文章:

  • Next.js 的原理和它的使用场景
  • SPAR模型优化思路
  • pycharm+miniconda cursor+miniconda配置
  • windows在pycharm中为项目添加已有的conda环境
  • 微信小程序实现-单选-以及全选功能。
  • 知识点19:生产环境的安全与治理
  • 软件开源协议(Open Source License)介绍
  • SAP HANA Scale-out 04:缓存
  • ios制作storyboard全屏启动图
  • 2025高教杯数学建模大赛全流程,从数据处理、建模到模型评价
  • 点拨任务应用于哪些业务场景
  • 墨色规则与血色节点:C++红黑树设计与实现探秘
  • C#语言入门详解(19)委托详解
  • 【数字展厅】企业展厅设计怎样平衡科技与人文呈现?
  • Day25_【深度学习(3)—PyTorch使用(6)—张量拼接操作】
  • WSL2(ubuntu20.04)+vscode联合开发(附迁移方法)
  • 无线数传模块优化汽车装配立库物料运送设备间低延迟通信方案
  • Parasoft助力「东软睿驰」打造高质量汽车软件
  • 设计多租户 SaaS 系统,如何做到数据隔离 资源配额?
  • 基于错误xsleak 悬空标记 使用css利用帧计数 -- Pure leak ASIS CTF 2025
  • 【Day 57】Redis的部署
  • 在 Zellij 中用 Neovim 优雅地解决剪贴板同步问题
  • 云手机的技术架构可分为哪些
  • 基于 GitHub Actions 的 Kubernetes 集群节点变更操作自动化
  • 嵌入式第五十四天(EPIT,GPT)
  • 何为楼宇自动化控制系统的质量管理?本质与关键要素解析
  • Spring 源码学习(十二)—— HandlerMapping(一)
  • 七牛云技术前瞻:GPT-5-Codex如何开启智能体编程新时代
  • The Oxford-IIIT宠物图像识别数据集(753M)
  • 从Cursor到GPT-5-Codex:AI编程Agent的技术与商业全解析