MVC全局GZIP压缩,异常黄页出现乱码解决方案

Spring MVC过滤器与拦截器:从原理到实战的完整解析 在Java Web开发中,请求处理链是构建健壮应用架构的核心机制。其基本原理是通过在HTTP请求与响应的生命周期中插入可插拔的组件,实现对流量的统一管控与业务逻辑的织入。这一技术价值在于解耦横切关注点,提升代码复用性与可维护性。典型的应用场景包括全局安全防护、日志记录、权限校验与数据预处理等。本文聚焦于Spring MVC框架中两个关键组件——过滤器和拦截器,深入剖析其核心差异。过滤器作为Servlet规范定义的‘门户保安’,作用于更底层的容器级别,擅长处理全局性、基础性任务;而拦截器作为Spring框架的 阅读详情

最近这个问题一直让我很纠结,设置了MVC全局压缩后发现,连抛出异常的页面也会进行压缩,于是出现一连串压缩后的乱码,感觉实在是太坑爹了。其中一直在想既然能压缩,那就肯定可以解压缩,于是一直试啊试,还是没成功,试过读取写入流,解压缩,试过用系统的方法,可是都没用,唉,那时候感觉真的一团糟啊,在国外的一些技术交流社区也提过问,可是都没得到理想的答案,经过这几天的努力,不过最主要的还是我们项目经理—小亮的指导,我完成了这么一个让我很纠结的压缩的问题。好了,不多说了,开始上代码吧。

首先来看看我定义的CompressFilterAttribute过滤器吧。

 1    /// <summary>
 2     /// 文件压缩特性
 3     /// </summary>
 4     public class CompressFilterAttribute : ActionFilterAttribute
 5     {
 6         private bool isEnableCompression = true;
 7 
 8         /// <summary>
 9         /// 构造函数
10         /// </summary>
11         public CompressFilterAttribute()
12         {
13         }
14 
15         #region OnActionExecuting
16         /// <summary>
17         /// Action方法执行前执行的方法
18         /// </summary>
19         /// <param name="filterContext">ActionExecutingContext 对象</param>
20         public override void OnActionExecuting(ActionExecutingContext filterContext)
21         {
22             object[] actionFilter = filterContext.ActionDescriptor.GetCustomAttributes(typeof(NoCompress), false);
23             object[] controllerFilter = filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(NoCompress), false);
24             if (controllerFilter.Length == 1 || actionFilter.Length == 1)
25             {
26                 isEnableCompression = false;
27             }
28         }
29         #endregion
30 
31         #region OnResultExecuted
32         /// <summary>
33         /// 返回结果集之后执行的方法
34         /// </summary>
35         /// <param name="filterContext"></param>
36         public override void OnResultExecuted(ResultExecutedContext filterContext)
37         {
38             if (filterContext.HttpContext.Request.IsAjaxRequest())
39             {
40                 return;
41             }
42 
43             if (filterContext.Exception != null)
44             {
45                 return;
46             }
47 
48             if (isEnableCompression)
49             {
50                 HttpRequestBase request = filterContext.HttpContext.Request;
51                 HttpResponseBase response = filterContext.HttpContext.Response;
52                 string acceptEncoding = request.Headers["Accept-Encoding"];
53 
54                 if (acceptEncoding == null)
55                 {
56                     return;
57                 }
58 
59                 if (acceptEncoding.ToLower().Contains("gzip"))
60                 {
61                     response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
62                     response.AppendHeader("Content-Encoding", "gzip");
63                 }
64                 else if (acceptEncoding.ToLower().Contains("deflate"))
65                 {
66                     response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
67                     response.AppendHeader("Content-Encoding", "deflate");
68                 }
69             }
70         #endregion
71         }

文中运用到的排除压缩方法是:http://www.cnblogs.com/yangda/archive/2013/03/20/2970860.html

首先在OnActionExecuting方法呢是判断当前Controller或者Action方法是否贴有特性[NoCompress],当贴有我们就直接跳过,不对其进行压缩。

OnResultExecuted便是真正的对代码进行压缩的语句了,判断当前是否为AJAX请求,判断当前是否出现错误,出现这些情况都排除,不对其进行压缩。

开始想的太复杂了,后来仔细分析了一下,也就是在出现错误的时候我们不对其进行压缩,页面也就不会出现乱码了。

重点代码是:filterContext.Exception != null  ,判断其之前是否出现过异常。出现后,不执行压缩,直接抛出错误页面。

 

JSON Web传输的工程实践:序列化、解析与HTTP状态码驱动 JSON作为Web API最主流的数据交换格式,其本质远不止是字符串序列化——它深度耦合HTTP协议语义、服务端序列化引擎(如Newtonsoft.Json、System.Text.Json)和前端解析行为(如jQuery的dataType、Axios的响应处理)。理解JSON在WCF、MVC、HttpHandler等.NET路径下的差异化表现,掌握DateTime时区、循环引用、字符编码、Content-Type头、GZip压缩等关键细节,是构建高可靠性API的基础。尤其当涉及前后端联调、异常传播与监控告 阅读详情

相关推荐

Spring Controller原理与最佳实践:从MVC设计到Spring Boot 3.x落地

Spring Controller是Spring MVC架构中承接HTTP请求的核心组件,其本质是MVC模式在Java Web中的工程化实现,通过DispatcherServlet、HandlerMapping与HandlerAdapter协同完成请求路由、参数绑定与响应渲染。它并非简单注解标记,而是承担协议适配、数据契约定义与入口守门职责的关键层。理解@Controller与@RestController的语义差异、@RequestParam/@PathVariable/@RequestBody的协议层级

weixin_33901926的博客 133

黄页88网站之加密字符串破解

网站:http://b2b.huangye88.com/ 需求:爬取黄页88 网站下的一些公司的详情信息

电子厂员工 4万+

JSP技术从入门到精通:企业级开发实战指南

JSP(JavaServer Pages)作为JavaEE体系中的动态网页技术,通过在HTML中嵌入Java代码实现服务器端渲染。其工作原理是将JSP编译为Servlet运行,结合EL表达式和JSTL标签库可大幅提升开发效率。这项技术在传统企业系统和教育领域仍广泛应用,特别适合需要快速构建动态页面的场景。掌握JSP需要理解Servlet容器、HTTP协议以及MVC设计模式等核心概念,其中隐式对象、指令元素和脚本元素是三大关键技术点。通过学生管理系统等实战项目,开发者可以学习到数据库连接、分页优化等企业级开发

weixin_31309419的博客 352

中文乱码集锦

控制台没有问题,但是HttpRequester中的json中文乱码解决办法:添加produces = “application/json;charset=utf-8” 例如:@RequestMapping(value = "/app/users/{userId:\\d+}", method=RequestMethod.GET, produces = "application/json;charse

ECHO_FOLLOW_HEART的专栏 18万+

针对ASP.NET页面实时进行GZIP压缩优化的几款压缩模块的使用简介及应用测试

针对ASP.NET页面实时进行GZIP压缩优化的几款压缩模块的使用简介及应用测试

win x64下安装oracle 12c出现[INS-30131]报错的解决方案

问题:  win x64下安装oracle 12c出现[INS-30131]报错的解决方案 安装oracle11g碰到“无法访问临时位置”的问题,详细信息如下: INS-30131] 执行安装程序验证所需的初始设置失败。 原因 - 无法访问临时位置。   操作 - 请确保当前用户具有访问临时位置所需的权限。   附加信息:  - 所有节点上的框架设置检查都失败  

一条道走到黑的GISer 1347

【MVC】未能加载类型"********.MvcApplication"

错误截图可能的错误原因及其解决方案1.多开VS导致可能的内存加载错误 解决方案:关掉所有的VS,整理一下内存,重开项目即可。 2.Global.asax文件与WEB项目本身命名空间存在冲突 解决方案:将二者namespace名称改为一致。

Ubisoft-One kid's Dream 8058

MATLAB/Simulink实战:三电平逆变器SVPWM调制从入门到精通(附完整仿真模型)

本文提供了一份详尽的MATLAB/Simulink实战指南,手把手教你从零搭建三电平逆变器的SVPWM调制系统。文章深入剖析了27个空间矢量的分区与分解算法,并完整实现了包含中点电位平衡控制的Simulink仿真模型,旨在帮助电力电子与电机控制领域的学习者和工程师跨越从理论到实践的鸿沟。

sugar的博客 1213

ASP.NET MVC 网站优化总结 使用 Gzip 压缩

1.开GZIP有什么好处? 答:Gzip开启以后会将输出到用户浏览器的数据进行压缩的处理,这样就会减小通过网络传输的数据量,提高浏览的速度。  2.如何启用IIS的Gzip压缩功能: 答: 首先,如果你需要压缩静态文件(HTML),需要在硬盘上建一个目录,并给它“IUSR_机器名”这个用户的写权限。如果压缩动态文件 (PHP,asp,aspx)就不需要了,因为它的页面是每次都动态生成

飞鸟的博客 3730

Python量化交易实战:从零搭建你的第一个多因子选股模型(附完整代码)

本文是一份详细的Python量化交易入门实战指南,手把手教你从零搭建第一个多因子选股模型。内容涵盖环境配置、数据获取、因子挖掘与有效性检验、多因子合成以及完整的策略回测与绩效评估,并附有可直接运行的完整代码,帮助初学者快速掌握量化交易的基本概念与实践流程。

resnet7explorer的博客 936

图形引擎实战:镭射效果制作分享

该方案的优势1.遵循物理的2.可以使用少量的参数去调控镭射的效果。计算相对简单,缺点仍是颜色不能够自定义,还有一种常见的方案是采样一张镭射贴图来模拟,好处是颜色可以自定义同时性能上还很高效没有复杂的公式计算。我查阅了网上普遍的方案,常见的做法是制作一个Ramp图生成工具,然后将生成好的ramp图赋给材质。这两个方案的好处是美术同学可以手动的去控制镭射的颜色。最后就是Shader中对Ramp图的采样的部分,Ramp图的UV坐标是使用fresnel作为Ramp的U轴坐标,0.5作为V轴坐标。

qq_41166022的博客 1354

SpringBoot系列教程Web篇之开启GZIP数据压缩

本篇可以归纳在性能调优篇,虽然内容非常简单,但效果可能出乎预料的好;分享一个真实案例,我们的服务部署在海外,国内访问时访问服务时,响应有点夸张;某些返回数据比较大的接口,...

小灰灰blog的专栏 1154

CT探测器普遍采用“星形拓扑+多ADC模组”架构的TDC(时间数字转换器)设计方案

本文提出一种基于TDC反馈机制的CT探测器时钟同步方法,通过延时测量、偏差计算和动态补偿三步硬件流水线,实现高精度同步。系统采用Xilinx Kintex UltraScale FPGA内置CARRY8进位链构建3.5ps分辨率的TDC,结合多级比较器和延迟单元,形成闭环反馈控制。实验表明,在512通道、1.28m传输距离下,同步精度稳定在10ps以内,较传统方案提升两个数量级,并能动态补偿干扰抖动。该方案解决了传统方法在CT旋转腔体环境下精度不足的问题,为下一代超高清CT提供了有效的时钟同步解决方案。

whm128的博客 274

Postman请求结果乱码:从字符编码原理到全链路解决方案

字符编码是计算机科学中数据表示与交换的基础,它定义了字符与二进制数据之间的映射规则。其核心原理在于确保编码与解码过程使用同一套“密码本”,否则就会产生乱码。在Web开发与API调试领域,正确理解并统一字符编码对于保障数据完整性和可读性具有重要技术价值,尤其是在处理多语言内容(如中文)时。UTF-8作为当前互联网事实上的标准编码,因其良好的兼容性与广泛的字符覆盖,成为跨系统、跨平台通信的首选。在实际工程实践中,API调试工具(如Postman)出现响应乱码,是编码不一致问题的典型应用场景。这通常涉及服务器响应

weixin_30947043的博客 432

【RT-DETR涨点改进】全网独家首发、注意力改进篇 | ICLR 2026 | 引入 MHLA 多头线性注意力,关注不同的上下文区域,弥补卷积的长程依赖建模方面的不足,助力高效涨点,来自北京大学

🔥本文提出MHLA多头线性注意力模块,用于改进RT-DETR目标检测网络。MHLA通过恢复线性注意力的表达能力,在保持线性复杂度的同时,为网络提供高效的全局上下文建模能力。该方法解决了传统线性注意力在长序列建模中的"全局上下文坍塌"问题,使不同空间位置能关注不同上下文区域。实验表明,MHLA显著提升了RT-DETR在复杂背景、小目标和遮挡场景下的检测性能,且不增加显著计算开销。文章详细介绍了MHLA的原理、优势及8种改进方案,并提供了完整的代码实现和配置指南。

Ai缝合怪、助力小伙伴高效发论文 271

PCL体素滤波器【2026最新版】

PCL实现的VoxelGrid类和ApproximateVoxelGrid体素滤波,详细记录。博客长期更新,本文最近一次更新时间为:2026年3月14日。

点云侠的博客 39万+

# 揭秘.NET Core调用MVC API接口报415错误的终极解决方案

当.NET Core应用程序调用MVC API接口时遇到HTTP 415 Unsupported Media Type错误,主要原因是客户端与服务器之间的媒体类型协商失败。本文依托RFC 7231规范和ASP.NET Core框架特性,结合多个真实场景、丰富的调试技巧及最佳实践方案,系统性地提供从协议原理到具体代码实现的全方位解决方案。通过多张流程图、详细参数对比表格和大量代码示例,帮助开发者深入理解和掌握媒体类型协商机制,实现高可靠性的API交互,彻底避免415错误带来的困扰

领码SPARK - 以无代码之星火,燎原数字之未来! 1910

01 - 什么是SVM

摘要:SVM(共享虚拟内存)技术使CPU和GPU能共享同一虚拟地址空间,简化异构计算编程。传统模型需手动管理CPU/GPU内存和拷贝数据,而SVM允许直接传递指针,自动处理页面迁移和一致性维护。其核心包括统一地址空间、按需迁移、页面故障处理和一致性管理,显著降低编程复杂度并提升性能。通过HMM框架、MMU通知和GPU页面异常等机制实现高效内存共享,支持复杂数据结构,为异构计算带来便利。

图形/计算GPU的驱动与虚拟化技术分享园地 3132

Java Servlet Filter 核心原理与生产级实战

Servlet Filter 是 Java Web 容器中实现请求拦截与响应处理的基础机制,其本质是嵌入在容器请求生命周期中的可编程钩子。它基于责任链模式构建执行栈,支持前置预处理、后置增强及原始输入输出流劫持,具备 Spring Interceptor 无法替代的底层能力。Filter 的线程安全设计、初始化参数治理、Dispatcher 类型控制以及与 Servlet 容器深度绑定的生命周期,共同决定了其在性能监控、XSS 防护、会话续期和 GZIP 压缩等场景中的不可替代性。本文聚焦原生 Filter

weixin_34109408的博客 440

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

html编码有问题,html特殊字符编码问题导致的细节问题

今天在写前端html时,一个a标签的链接地址,由于链接地址需要给后台传参数,因此带了部分url参数:在html源码里写的连接地址是:http://域名/bidder/noticesearch?noticecate=1&noticetype=1因为需要传递参数noticecate和参数noticetype给后台使用。但是结果页面运行的时候却显示的如下图所示:可以发现&not这四个字符...

weixin_42622428的博客 950

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java Web 拦截机制实战指南:Filter 与 Interceptor 深度解析

Java web中的Filter 与 Interceptor 的理解与使用

0xDevNull的博客 1181

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SpringCloud笔记05-Feign

传送门 SpringCloud笔记01-简介 SpringCloud笔记02-Eureka SpringCloud笔记03-Ribbon SpringCloud笔记04-Hystix SpringCloud笔记06-Zuul 简介: Feign是Netlix开发的声明式、模板化的HTTP客户端。Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。 Feign原理 启动时,程序会进行包扫描,扫描所有包

a2868221132的博客 1186

Java Web家庭财务管理系统开发实战

Java Web技术作为企业级应用开发的主流选择,其MVC架构模式通过分层设计实现了业务逻辑与表现层的解耦。在数据库操作层面,JDBC提供了标准化的数据访问接口,而结合MySQL这类关系型数据库,能够高效处理结构化财务数据。系统采用Servlet+JSP核心组件实现请求路由和视图渲染,配合Bootstrap前端框架快速构建响应式界面。项目中涉及的RBAC权限模型和BCrypt加密方案,为家庭财务数据提供了基础安全防护。这类系统开发经验,对于理解Java Web技术栈的全链路应用具有典型意义,特别适合作为计算

weixin_34034670的博客 435

JavaWeb

初始化方法,在Servlet被创建时执行,只执行一次提供服务方法,每次Servlet被访问,都会调用该方法销毁方法,当Servlet被销毁时,调用该方法,在内存释放或服务区关闭时销毁Servlet获取ServletConfig对象获取Servlet信息响应数据分为3部分1.响应行 HTTP/1.1 200 OKvoid setStatues(int sc):设置响应状态码2.响应头 Content-Type:text/html。

kebi_lh的博客 1873

ASP.NET HttpHandler与HttpModule职责分离原理

HttpHandler和HttpModule是ASP.NET请求管线中两类核心组件,分别承担响应内容生成与横切逻辑处理职责。其设计基于HTTP协议规范与管线事件驱动机制,通过24个标准化事件节点实现精确的执行时机控制。HttpHandler作为唯一拥有ProcessRequest调用权的组件,直接操作Response.OutputStream,决定最终响应体;而HttpModule以事件订阅方式介入各阶段,适用于日志、认证、压缩等全局性功能。这种职责分离架构支撑了高内聚、低耦合的系统演进,也是理解ASP.N

unixboy 638
上一篇: MVC4路由机制源码剖析
下一篇: MVC4 过滤器学习
yangdaboke
博客等级 码龄17年 6粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值