Web核心开发:拦截器、过滤器、跨域、统一返回
Web核心开发拦截器、过滤器、跨域、统一返回后端接口写多了就知道业务逻辑只占三成剩下七成是防呆设计——拦截没登录的、处理跨域的、统一返回格式的。这篇把Web层的基础设施一次搭好。一、SpringBoot Web开发全景1.1 DispatcherServlet流程所有请求进入SpringBoot第一站是DispatcherServlet前端控制器核心流程如下客户端请求 → DispatcherServlet → HandlerMapping找到对应的Controller方法 → HandlerInterceptor拦截器 preHandle → Controller执行业务逻辑 → HandlerInterceptor拦截器 postHandle → 视图渲染/结果处理 → HandlerInterceptor拦截器 afterCompletion → 返回响应注意过滤器Filter在DispatcherServlet之前就执行了这是拦截器和过滤器的关键区别。二、拦截器(Interceptor)2.1 HandlerInterceptor接口拦截器是Spring MVC提供的机制核心接口publicinterfaceHandlerInterceptor{// Controller执行前返回false则中断请求booleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler);// Controller执行后视图渲染前voidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView);// 整个请求完成后视图渲染后通常用于资源清理voidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex);}三个阶段的执行时机和用途方法执行时机典型用途preHandleController前登录校验、权限检查、日志记录postHandleController后统一修改返回数据afterCompletion请求结束资源清理、异常处理2.2 登录拦截器实战ComponentpublicclassLoginInterceptorimplementsHandlerInterceptor{OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{// 从请求头获取tokenStringtokenrequest.getHeader(Authorization);if(StringUtils.isBlank(token)){response.setStatus(401);response.setContentType(application/json;charsetUTF-8);response.getWriter().write({\code\:401,\message\:\未登录\});returnfalse;}// 校验token逻辑...returntrue;// 放行}}2.3 注册拦截器光写了拦截器不够得注册到Spring MVC里才能生效ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{AutowiredprivateLoginInterceptorloginInterceptor;OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(loginInterceptor).addPathPatterns(/api/**)// 拦截路径.excludePathPatterns(/api/login,// 排除登录接口/api/register,/api/captcha);// 排除验证码接口}}三、过滤器(Filter)3.1 Filter接口过滤器是Servlet规范中的机制在请求到达Spring MVC之前就执行ComponentWebFilter(urlPatterns/*,filterNamerequestLogFilter)publicclassRequestLogFilterimplementsFilter{OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{HttpServletRequestreq(HttpServletRequest)request;longstartSystem.currentTimeMillis();log.info(请求开始: {} {},req.getMethod(),req.getRequestURI());chain.doFilter(request,response);// 放行到下一个过滤器或目标资源longcostSystem.currentTimeMillis()-start;log.info(请求结束, 耗时: {}ms,cost);}}3.2 过滤链执行顺序多个Filter组成一条链按顺序执行。可以用Order注解控制顺序ComponentOrder(1)// 数字越小越先执行publicclassFirstFilterimplementsFilter{...}ComponentOrder(2)publicclassSecondFilterimplementsFilter{...}四、拦截器 vs 过滤器对比对比项过滤器(Filter)拦截器(Interceptor)所属规范Servlet规范Spring MVC执行时机DispatcherServlet前DispatcherServlet内能否访问Spring Bean需额外处理直接注入能否获取Handler信息不能能知道哪个Controller方法典型场景编码设置、日志、安全过滤登录校验、权限控制简单记过滤器管请求进出拦截器管Controller前后。五、跨域问题解决5.1 什么是跨域浏览器同源策略协议、域名、端口任一不同就是跨域。前端localhost:5173调后端localhost:8080就跨域了浏览器会拦截响应。5.2 三种解决方案方案一CrossOrigin注解粒度最细单个接口RestControllerRequestMapping(/api)CrossOrigin(originshttp://localhost:5173)publicclassApiController{...}方案二WebMvcConfigurer全局配置ConfigurationpublicclassCorsConfigimplementsWebMvcConfigurer{OverridepublicvoidaddCorsMappings(CorsRegistryregistry){registry.addMapping(/api/**).allowedOrigins(http://localhost:5173).allowedMethods(GET,POST,PUT,DELETE,OPTIONS).allowedHeaders(*).allowCredentials(true)// 允许携带Cookie.maxAge(3600);// 预检缓存时间秒}}方案三CorsFilter全局过滤器推荐优先级最高BeanpublicCorsFiltercorsFilter(){CorsConfigurationconfignewCorsConfiguration();config.addAllowedOrigin(http://localhost:5173);config.addAllowedMethod(*);config.addAllowedHeader(*);config.setAllowCredentials(true);UrlBasedCorsConfigurationSourcesourcenewUrlBasedCorsConfigurationSource();source.registerCorsConfiguration(/**,config);returnnewCorsFilter(source);}5.3 跨域常见坑点坑一OPTIONS预检请求被拦截非简单请求如POSTJSON浏览器会先发OPTIONS请求探路。如果登录拦截器把OPTIONS请求拦了前端直接报跨域错误。解决拦截器中放行OPTIONSOverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler){if(OPTIONS.equals(request.getMethod())){returntrue;// 预检请求直接放行}// 正常校验逻辑...}坑二Cookie跨域跨域携带Cookie需要同时满足后端设置allowCredentials(true)allowedOrigins不能用*必须指定具体域名前端请求设置withCredentials: true六、统一返回封装6.1 Result类设计别让每个接口返回格式都不一样统一规范DataAllArgsConstructorNoArgsConstructorpublicclassResultT{privateintcode;privateStringmessage;privateTdata;publicstaticTResultTsuccess(Tdata){returnnewResult(200,操作成功,data);}publicstaticTResultTerror(intcode,Stringmessage){returnnewResult(code,message,null);}}6.2 ResponseAdvice全局统一返回用ResponseBodyAdvice实现全局自动包装Controller里直接返回业务数据框架自动包成ResultRestControllerAdvicepublicclassGlobalResponseAdviceimplementsResponseBodyAdviceObject{Overridepublicbooleansupports(MethodParameterreturnType,ClassconverterType){// 排除Result类型本身和String类型避免序列化问题return!returnType.getParameterType().equals(Result.class)!returnType.getParameterType().equals(String.class);}OverridepublicObjectbeforeBodyWrite(Objectbody,MethodParameterreturnType,MediaTypeselectedContentType,ClassselectedConverterType,ServerHttpRequestrequest,ServerHttpResponseresponse){returnResult.success(body);}}Controller代码变得极简RestControllerRequestMapping(/api/user)publicclassUserController{GetMapping(/{id})publicUsergetUser(PathVariableLongid){returnuserService.getById(id);// 直接返回User框架自动包装成Result}}返回结果统一是{code:200,message:操作成功,data:{id:1,name:张三}}6.3 String返回的坑ResponseBodyAdvice处理String返回值时会有序列化问题。因为Spring MVC对String类型默认用StringHttpMessageConverter而返回Result对象后会报类型转换异常。解决方案给String返回值单独处理手动转成JSONOverridepublicObjectbeforeBodyWrite(Objectbody,MethodParameterreturnType,MediaTypeselectedContentType,ClassselectedConverterType,ServerHttpRequestrequest,ServerHttpResponseresponse){if(bodyinstanceofString){response.getHeaders().setContentType(MediaType.APPLICATION_JSON);returnJSONUtil.toJsonStr(Result.success(body));}returnResult.success(body);}这样全局统一返回就稳了接口层只管业务逻辑返回格式交给框架兜底。

相关新闻

WinMD:3分钟掌握Windows访问Linux RAID的终极方案

WinMD:3分钟掌握Windows访问Linux RAID的终极方案

WinMD:3分钟掌握Windows访问Linux RAID的终极方案 【免费下载链接】winmd WinMD 项目地址: https://gitcode.com/gh_mirrors/wi/winmd WinMD 是一款革命性的驱动程序,它让 Windows 系统能够无缝访问由 Linux mdadm 创建的 MD RAID 设备。对于需要…

2026/7/30 2:14:35 阅读更多 →
3D模型文件预览终极指南:如何让Windows资源管理器显示3D缩略图?

3D模型文件预览终极指南:如何让Windows资源管理器显示3D缩略图?

3D模型文件预览终极指南:如何让Windows资源管理器显示3D缩略图? 【免费下载链接】space-thumbnails Generates preview thumbnails for 3D model files. Provide a Windows Explorer extensions that adds preview thumbnails for 3D model files. 项目…

2026/7/30 2:14:35 阅读更多 →
让RE引擎游戏获得新生:揭秘REFramework的三大魔法

让RE引擎游戏获得新生:揭秘REFramework的三大魔法

让RE引擎游戏获得新生:揭秘REFramework的三大魔法 【免费下载链接】REFramework Mod loader, scripting platform, and VR support for all RE Engine games 项目地址: https://gitcode.com/GitHub_Trending/re/REFramework 你是否曾想过为《生化危机》系列添…

2026/7/30 2:13:35 阅读更多 →

最新新闻

【存储】存储协议全景:文件存储、块存储、对象存储选型指南

【存储】存储协议全景:文件存储、块存储、对象存储选型指南

存储协议全景:文件存储、块存储、对象存储选型指南一、存储选型的本质二、一张表看懂三类存储三、块存储:给服务器一块"远程硬盘"主要协议一句话选型四、文件存储:多台服务器共享同一个目录主要协议分布式文件系统一句话选型五、对…

2026/7/30 2:21:37 阅读更多 →
Kademlia算法解析:P2P网络的核心路由机制

Kademlia算法解析:P2P网络的核心路由机制

1. Kademlia算法概述:当分布式网络遇上XOR度量2002年由Petar Maymounkov和David Mazires提出的Kademlia算法,彻底改变了P2P网络的路由机制。作为BitTorrent、以太坊、IPFS等主流分布式系统的核心协议,其独特的设计哲学体现在三个关键维度&…

2026/7/30 2:21:37 阅读更多 →
CRC硬件结构解析:从原理到嵌入式与网络应用实践

CRC硬件结构解析:从原理到嵌入式与网络应用实践

1. 先搞清楚 CRC 到底解决什么问题,为什么硬件实现比软件快CRC(循环冗余校验)最核心的作用是数据完整性验证。简单说,就是在原始数据后面附加一小段校验码,接收方用同样的算法再算一遍,如果结果对不上&…

2026/7/30 2:21:37 阅读更多 →
Python位运算实战:左移右移核心原理与高效应用

Python位运算实战:左移右移核心原理与高效应用

1. 项目概述:为什么位运算在Python里依然“能打”?看到“位运算”这个词,很多刚接触Python的朋友可能会觉得有点“复古”或者“底层”,心想:现在都是高级语言满天飞,谁还去折腾这些二进制位的操作&#xff…

2026/7/30 2:21:37 阅读更多 →
基于OSM路网与ArcGIS Pro的交通分析小区自动化生成方法

基于OSM路网与ArcGIS Pro的交通分析小区自动化生成方法

1. 项目概述:从一张地图到可分析的交通单元做交通规划或者城市分析的朋友,对“交通分析小区”这个概念肯定不陌生。TAZ,全称Traffic Analysis Zone,简单理解就是把城市这张大“画布”,按照一定的规则切割成一个个小格子…

2026/7/30 2:21:37 阅读更多 →
基于 ESP32-C3 的便携式温湿度、气压与电量监测终端设计

基于 ESP32-C3 的便携式温湿度、气压与电量监测终端设计

从太阳能供电到手机曲线:基于 ESP32-C3 的低功耗环境监测节点1. 项目简介本项目实现了一个低功耗环境监测节点,可采集温度、湿度、气压、电池电压和剩余电量,并通过 Wi-Fi MQTT 上传到手机端,以图表形式查看历史变化趋势。设备采…

2026/7/30 2:20:37 阅读更多 →

日新闻

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:13 阅读更多 →
如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经在浏览…

2026/7/30 0:00:13 阅读更多 →
“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

更多请点击: https://intelliparadigm.com 第一章:AI 教师备课辅助 AI 教师备课辅助系统正逐步成为教育数字化转型的核心支撑工具,它并非替代教师,而是通过语义理解、知识图谱与多模态生成能力,将教师从重复性劳动中解…

2026/7/30 0:00:13 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/29 22:18:20 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻