Spring Boot项目必备三大组件:跨域、JWT拦截器、统一响应
一、CorsConfigConfiguration public class CorsConfig { Bean public CorsFilter corsFilter() { CorsConfiguration config new CorsConfiguration(); config.addAllowedOrigin(http://localhost:5173); config.addAllowedHeader(*); config.addAllowedMethod(*); config.setAllowCredentials(true); config.setMaxAge(3600L); UrlBasedCorsConfigurationSource source new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration(/**, config); return new CorsFilter(source); } }解释一下这个代码Configuration告诉Spring这是一个配置类启动时就会加载。CorsFilter这是一个过滤器比拦截器还靠前在请求还没到Spring MVC核心之前就执行专门用来在响应头里添加Access-Control-Allow-Origin等字段。addAllowedOrigin(http://localhost:5173)只允许这个地址的网页访问我的后端。如果你写*那就是允许所有但是这样可能会被恶意访问。addAllowedHeader(*)允许前端请求携带任何请求头比如Authorization、Content-Type。addAllowedMethod(*)允许所有HTTP方法GET、POST、PUT、DELETE等。setAllowCredentials(true)允许前端发请求时带上Cookie。这是个大坑点一旦设为trueaddAllowedOrigin就不能用*必须指定具体域名否则浏览器直接报错。setMaxAge(3600L)预检请求OPTIONS的缓存时间单位秒。前端在发“复杂请求”如带自定义头的JSON请求之前会先发一个OPTIONS探路设置3600秒后同一请求1小时内不再发预检性能提升明显。没有它你用Vue的axios请求后端接口浏览器控制台直接报红No Access-Control-Allow-Origin header is present。有了它后端默默给响应头加上了白名单浏览器放行联调顺利。面试高频追问问答什么是跨域为什么会有跨域浏览器的“同源策略”规定协议、域名、端口必须完全一致才能自由访问。前后端端口不一样5173 vs 8080所以被拦截。这是浏览器安全机制不是后端的问题。除了CorsFilter还有哪些方式解决跨域①CrossOrigin注解加在Controller或方法上②实现WebMvcConfigurer重写addCorsMappings③Nginx反向代理前端请求同源地址由Nginx转发到后端。我推荐用CorsFilter因为它全局生效且优先级高。setAllowCredentials(true)和addAllowedOrigin(*)为什么不能同时用因为浏览器规范强制要求如果允许携带凭证Cookie那么Origin必须明确指定不能用通配符。否则浏览器觉得不安全直接拒绝。这是面试必杀坑一定要说出来。生产环境怎么配绝对不能写*必须写具体的前端域名如https://www.myapp.com。如果有多环境建议把域名抽到配置文件用Value注入做到环境隔离。有什么改进建议多源支持用config.setAllowedOriginPatterns()Spring Boot 2.4替代addAllowedOrigin支持*通配符但又能兼容allowCredentialstrue更灵活。放行特定路径如果只需要给/api/**开跨域别写/**缩小范围。二、JwtInterceptorComponent public class JwtInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String uri request.getRequestURI(); if (/admin/login.equals(uri)) { return true; } String authHeader request.getHeader(Authorization); if (authHeader null || !authHeader.startsWith(Bearer )) { response.setStatus(401); response.setContentType(application/json;charsetUTF-8); response.getWriter().write({\code\:401,\message\:\Token缺失或格式错误\}); return false; } String token authHeader.substring(7); try { JwtUtil.parseToken(token); return true; } catch (Exception e) { response.setStatus(401); response.setContentType(application/json;charsetUTF-8); response.getWriter().write({\code\:401,\message\:\Token无效或已过期\}); return false; } } }实现HandlerInterceptor这是Spring MVC的拦截器在请求进入Controller之前执行是鉴权的绝佳时机。白名单放行如果请求是/admin/login直接放行登录还没Token呢。提取Authorization头前端必须把Token放在Authorization: Bearer xxx里这是全球通用的JWT传输标准。校验如果头没有或格式不对直接返回401并手动写一个JSON错误信息再也不往下执行了。解析Token调用工具类JwtUtil.parseToken如果抛异常过期、篡改同样返回401。在项目里它是整个系统的安全闸口。除了登录所有接口比如查询订单、修改个人信息都必须经过它。一旦Token无效请求连Controller的门都摸不到极大节省了服务器资源不用再查数据库验证身份了。问答拦截器(Interceptor)和过滤器(Filter)有什么区别Filter是Servlet规范更底层在请求进入DispatcherServlet之前执行依赖Web容器Interceptor是Spring提供的在DispatcherServlet之后、Controller之前执行能拿到Spring容器里的Bean比如JwtUtil这是最大区别。你的白名单只写了/admin/login如果前端请求/admin/login/带斜杠或/admin/login?xxx会怎样会被拦截因为equals是精确匹配。改进用request.getServletPath()或Spring的AntPathMatcher做模糊匹配或者把白名单放到配置里支持/admin/**通配。为什么不用ControllerAdvice统一处理Token异常而是直接在拦截器里写response.getWriter().write()因为拦截器里抛出的异常默认不会进入全局异常处理器。手动写流是“应急”做法但不规范。更好做法是抛出自定义异常如TokenInvalidException然后在ControllerAdvice中统一捕获并返回Result.error这样错误格式全局一致。Token验证通过后怎么让后续接口知道当前是哪个用户在操作解析Token后把用户ID放入request.setAttribute(userId, userId)或者存入ThreadLocal推荐这样Service层能随时拿到当前用户信息避免重复解析Token。Token过期了你们怎么处理需要刷新机制吗可以配合Redis存刷新令牌Refresh Token过期后返回特定状态码如401前端用刷新令牌换新Token。简单点的话直接跳转登录页。三、Resultpublic class ResultT { private String code; private T data; private String msg; public static T ResultT success() { ... } public static T ResultT success(T data) { ... } public static T ResultT error(String msg) { ... } public static T ResultT error(String code, String msg) { ... } // getter/setter }泛型Tdata字段可以是任何类型比如ResultUser、ResultListOrder编译期就确定类型不用强制转换。静态工厂方法提供success()、success(data)、error(msg)、error(code, msg)调用方便。核心字段code状态码200成功500系统错误401未授权等。msg人类可读的提示信息。data业务数据查询结果。项目中没有它你的Controller可能会返回查询成功 → 直接返回User对象查询失败 → 返回Map带error字段删除成功 → 返回success字符串前端得写无数个if判断解析不同类型。而统一成Result后前端只需要判断result.code 200然后取result.data其他情况统一走错误提示。问答为什么要统一封装直接返回对象不好吗①前后端需要固定契约方便前端全局拦截器处理②包含code和msg可以把业务异常也以正常JSON返回而不是抛出500白页③后期如果需要加timestamp、path等字段只要改这个类所有接口自动生效。这里的T有什么好处类型安全。如果data是Object取出来还得强转容易强转异常。用泛型后ResultUser直接getData()就是User不用手动(User)。状态码用String还是int用String更灵活可以支持A001这种业务码但项目中如果只用数字建议用Integer或枚举比如ResultCode.SUCCESS.getCode()防止手残把200写成200 带空格。success()和success(T data)为什么不合并成一个方法重载让调用意图更清晰。如果合并传null时无法区分是“没数据”还是“业务数据就是null”分开写语义明确。如果我要返回分页数据含total怎么封装可以再写一个PageResultT继承Result或者直接在data里放PageInfoT把total、pageNum、list都塞进data的字段里。四、三者如何协同构成项目骨架组件作用时机产出CorsConfig请求刚到达服务器还没进Spring MVC在响应头添加CORS信息让浏览器放行JwtInterceptor请求进入Spring MVC但在Controller之前校验Token无效则直接返回401 JSONResultController返回数据时将所有返回统一包装成{code,msg,data}格式一条请求的生命周期浏览器发请求 → CorsFilter 检查跨域放行。请求到DispatcherServlet → JwtInterceptor 检查Token登录接口除外。Token有效进入Controller业务处理返回Result.success(data)。Spring MVC将Result转成JSON返回前端。

相关新闻

DDR1内存运行Win11:硬件考古与市场启示

DDR1内存运行Win11:硬件考古与市场启示

1. 项目背景:当DDR1遇上Win11的荒诞与必然 最近在Reddit硬件社区看到一位ID为Omores的发烧友,用二十年前的DDR1内存成功运行Windows 11的案例,这个看似行为艺术的实验背后其实藏着当前硬件市场的残酷现实。我拆开自己的备用机箱,翻…

2026/7/23 15:59:37 阅读更多 →
视觉分析工具部署与性能优化指南:从环境配置到合规实践

视觉分析工具部署与性能优化指南:从环境配置到合规实践

这次我们来看一个名为"视奸expert26"的项目,从名称来看似乎涉及某种视觉分析或监控能力。不过需要明确的是,任何涉及隐私侵犯的技术都应该在法律和道德边界内使用。 1. 核心能力速览 能力项 说明 项目类型 视觉分析工具(基于名…

2026/7/23 15:59:37 阅读更多 →
专科论文AI写作工具测评:9款主流工具实战对比

专科论文AI写作工具测评:9款主流工具实战对比

1. 项目概述:AI论文写作工具测评的必要性去年指导专科生毕业论文时,我发现超过80%的学生在文献综述环节卡壳超过两周。直到有位学生用AI工具三天完成了初稿框架,才意识到这类工具已经能实质性提升写作效率。这次测评源于实际教学需求&#xf…

2026/7/23 15:59:37 阅读更多 →

最新新闻

泛二次元占领定律:文化生态相变与话语权垄断的结构性机制

泛二次元占领定律:文化生态相变与话语权垄断的结构性机制

泛二次元占领定律:文化生态相变与话语权垄断的结构性机制 ——基于参与式观察的案例研究 摘要 本研究基于对“四九拟说动物体验社”读者社群(n≈100)的参与式观察——研究者本人以“科普-漫画二轴性”为中性入口进入该社群,亲历了…

2026/7/23 16:08:39 阅读更多 →
Django计算机毕设之基于 Django 的宠物服务预约平台 宠物寄养信息发布与智能匹配系统(完整前后端 代码+说明文档+LW,调试定制等)

Django计算机毕设之基于 Django 的宠物服务预约平台 宠物寄养信息发布与智能匹配系统(完整前后端 代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/23 16:08:39 阅读更多 →
Python计算机毕设之基于 Python 的大学生求职适配与职业方向推荐系统 智能化高校就业指导与岗位推荐系统(完整前后端代码+说明文档+LW,调试定制等)

Python计算机毕设之基于 Python 的大学生求职适配与职业方向推荐系统 智能化高校就业指导与岗位推荐系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/23 16:08:39 阅读更多 →
视频美颜SDK选型与优化实战指南

视频美颜SDK选型与优化实战指南

1. 视频美颜SDK的核心价值与选型逻辑在直播与短视频APP开发中,美颜功能早已从"加分项"变为"必选项"。根据实测数据,集成优质美颜SDK的应用用户留存率可提升40%以上,平均观看时长增加2.3倍。但市面上从开源方案到商业SDK选…

2026/7/23 16:08:39 阅读更多 →
OpenClaw(龙虾 AI)全解|定位、功能、落地领域、与 Ollama 本质区别、在智能体架构中的角色 + 实战部署

OpenClaw(龙虾 AI)全解|定位、功能、落地领域、与 Ollama 本质区别、在智能体架构中的角色 + 实战部署

专栏定位:中高级 AI 开发者 / 智能体从业者付费深度文章;适合想搭建私有化本地智能体、本地大模型自动化工作流、企业 AI 助理的技术人群 所有定义、架构、对比内容均参考官方 GitHub、docs.openclaw.ai、openclaw.ai,可溯源;实战配置代码经过社区通用方案验证,不保证所有…

2026/7/23 16:08:39 阅读更多 →
制造业CRM选型指南:避开三大陷阱与实战方案

制造业CRM选型指南:避开三大陷阱与实战方案

1. 项目概述:制造业CRM选型的核心痛点中小型制造工厂在数字化转型过程中,CRM系统选型往往面临"三高"困境:高试错成本、高适配门槛和高决策风险。我走访过37家产值在2000万-2亿之间的机加工、注塑和装配企业,发现83%的采…

2026/7/23 16:07:39 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻