net::ERR_CONTENT_LENGTH_MISMATCH 导致的个别字乱码

本文探讨了在使用SiteMesh装饰器时遇到的中文显示乱码问题,详细介绍了如何通过修改decorators.xml文件来排除特定页面,从而避免Content-Length计算错误导致的加载异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

加载html文件含有中文时会让响应的Content-Length不准确导致的出现加载出中文个别字体乱码

后面发现是sitemesh装饰器bug导致的

<!-- 装饰容器 sitemesh 文档 http://wiki.sitemesh.org/wiki/display/sitemesh/Home  -->
<!--会导致html等页面出现加载失败或异常 在decorators.xml里排除就好-->
<filter>
    <filter-name>sitemeshFilter</filter-name>
    <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>sitemeshFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

 

修改decorators.xml文件 

<?xml version="1.0" encoding="UTF-8"?>
<!-- 文档https://my.oschina.net/heroShane/blog/199177 -->
<decorators defaultdir="/WEB-INF/webpage/decorators">
    <!-- 此处用来定义不需要过滤的页面 -->
    <excludes>
        <pattern>/static/*</pattern>
        <pattern>/upload/*</pattern>
        <pattern>/media/*</pattern>
    </excludes>
   <!-- 列表页装饰界面 -->
   <decorator name="list" page="list-theme.jsp" />
   <!-- 表单页面装饰界面 -->
   <decorator name="form" page="form-theme.jsp" />
   <!-- 表单页面装饰单页界面 -->
   <decorator name="single" page="single-theme.jsp" />
   <!-- grid选择页面装饰 -->
   <decorator name="grid-select" page="grid-select.jsp" />
   
</decorators>

解决办法:在excludes中排除需要访问的html页面就行了

<think>好的,我现在需要解决用户关于“net::ERR_CONTENT_LENGTH_MISMATCH 206”的问题。首先,我需要回忆之前用户询问过类似的错误,比如ClientAbortException,这可能与网络连接中断有关,但这次是关于内容长度不匹配的错误,并且带有206状态码。 首先,理解这个错误是什么。net::ERR_CONTENT_LENGTH_MISMATCH 是浏览器在加载资源时遇到的错误,表示服务器返回的内容长度与声明的Content-Length头不匹配。状态码206是部分内容,通常用于分块下载或断点续传。 接下来,我需要确定这个问题的常见原因。可能包括:服务器错误计算内容长度、传输过程中数据被修改、网络问题导致传输中断、缓存问题或代理服务器干扰。此外,分块传输编码(Transfer-Encoding: chunked)可能与Content-Length头同时存在导致冲突。 然后,考虑用户可能的背景。用户之前询问过Tomcat相关的异常,可能是在开发Web应用,使用Java后端,可能遇到了文件下载或流媒体传输的问题。他们可能正在处理大文件的分块传输,或者配置服务器时出现了问题。 接下来,需要分步骤解释问题,并提供解决方案。首先解释错误含义,然后分析原因,接着给出排查步骤,最后是解决方案。需要确保结构清晰,用户能逐步排查。 可能需要注意的细节:206状态码的使用场景,比如Range请求,服务器是否正确处理了这些请求,是否在响应中正确设置了Content-Range和Content-Length。另外,分块传输时是否意外关闭了流,或者计算内容长度时出错。 还要考虑用户可能的错误配置,例如在Nginx或Apache中配置不当,或者应用代码中手动设置了Content-Length头但实际发送的数据长度不符。需要建议检查服务器配置,验证内容长度计算,以及处理传输中断的情况。 另外,可能需要指导用户使用开发者工具查看网络请求详情,检查响应头信息,或者使用curl命令测试,查看实际接收的字节数是否匹配。同时,处理缓存和代理的问题,比如禁用缓存或检查CDN配置。 最后,确保回答的语言简洁明了,避免技术术语过多,但又要准确。可能需要提供代码示例,比如如何在Java中正确处理分块传输,或者Nginx的配置示例。</think>`net::ERR_CONTENT_LENGTH_MISMATCH 206` 是浏览器在接收服务器响应时遇到的内容长度不匹配错误,通常与分块传输或断点续传相关。以下为您详细解析及解决方案: --- ### **错误本质解析** - **HTTP 206状态码**:表示服务器成功处理了部分范围请求(Partial Content),常用于大文件分块下载或视频缓冲 - **错误触发条件**:当响应头中`Content-Length`声明的字节数与实际接收的字节数不一致时,浏览器抛出此错误 --- ### **常见触发场景** 1. **分块传输异常** - 服务器启用了`Transfer-Encoding: chunked` - 但错误地同时设置了`Content-Length`头 2. **动态内容生成** ```java // 错误示例:动态生成内容时未正确计算长度 response.setContentLength(100); // 声明长度100字节 out.write(generateDynamicContent()); // 实际生成80字节 ``` 3. **网络中断修复** - 断点续传过程中客户端网络波动 - 服务器未能正确处理`Range`请求头 4. **代理/CDN干扰** - 中间代理修改了响应内容但未更新长度 - CDN缓存了不完整的响应 --- ### **排查步骤** **1. 验证原始响应** ```bash # 使用curl检查原始响应(注意-H参数) curl -I -H "Range: bytes=0-499" http://yourdomain.com/file.mp4 ``` 检查返回头中是否包含: ``` HTTP/1.1 206 Partial Content Content-Range: bytes 0-499/2000 Content-Length: 500 # 必须等于实际发送的字节数 ``` **2. 检查服务器逻辑** ```java // 正确做法:计算实际内容长度 byte[] content = generateContent(); response.setContentLength(content.length); // 动态设置准确长度 response.getOutputStream().write(content); ``` **3. 网络层检查** ```nginx # Nginx配置示例(针对大文件优化) proxy_max_temp_file_size 0; # 禁用缓冲 proxy_buffering off; chunked_transfer_encoding on; # 强制分块传输 ``` --- ### **解决方案** **方案1:禁用冲突头信息** ```java // 在Servlet中避免同时设置两种长度标识 response.setHeader("Content-Length", ""); // 清空显式设置 response.setHeader("Transfer-Encoding", "chunked"); // 启用分块传输 ``` **方案2:正确处理范围请求** ```java // Java处理Range请求示例 String rangeHeader = request.getHeader("Range"); if (rangeHeader != null) { // 解析范围值(示例:bytes=0-499) long[] range = parseRange(rangeHeader); response.setStatus(206); response.setHeader("Content-Range", "bytes " + range[0] + "-" + range[1] + "/" + totalLength); response.setContentLength((int)(range[1] - range[0] + 1)); } ``` **方案3:配置Web服务器** ```apache # Apache配置(httpd.conf) EnableSendfile off # 禁用sendfile防止计算错误 SetEnv proxy-sendcl 1 # 强制传递Content-Length ``` --- ### **进阶调试技巧** 1. **浏览器网络分析**: - 在Chrome DevTools的Network标签中: 1. 查看`Content-Length`响应头值 2. 检查响应体的`Size`是否与声明值一致 2. **数据完整性验证**: ```bash # 比较声明长度与实际长度 curl -sI http://example.com/file | grep -i content-length curl -s http://example.com/file | wc -c ``` 3. **压力测试**: ```bash # 使用ab测试大文件传输 ab -n 100 -c 10 -H "Range: bytes=0-1023" http://example.com/largefile ``` --- ### **特殊场景处理** **视频流场景**: 使用`Accept-Ranges: bytes`头并配合`Content-Range`,建议采用自适应码率技术(如HLS/DASH) **云存储场景**: AWS S3/Azure Blob等服务的预签名URL需确保: ```python # Python生成预签名URL示例(AWS S3) s3.generate_presigned_url('get_object', Params={'Bucket': 'mybucket', 'Key': 'largefile.mp4', 'Range': 'bytes=0-499'}, ExpiresIn=3600) ``` --- **关键注意事项**: 1. 避免在分块传输中混用`Content-Length` 2. 确保服务器正确处理`Range`请求边界 3. 使用`HEAD`方法预检资源信息 4. 对动态内容优先使用`Transfer-Encoding: chunked` 通过系统排查和正确配置,可有效解决该错误,提升大文件传输的可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值