gpt4 book ai didi

jquery - 如何在 Coldfusion 中对大型 Ajax 响应(仅限 HTML)进行 gzip 压缩?

转载 作者:行者123 更新时间:2023-12-01 08:13:09 24 4
gpt4 key购买 nike

我在前端运行 Coldfusion8jquery/jquery-mobile

我正在使用 Ajax 支持的搜索引擎,试图找到数据量和客户端处理时间之间的最佳权衡。

目前,我的 AJAX 搜索返回 40k 的(JQM 增强标记),这避免了任何客户端增强。这样,页面不会停滞大约 2-3 秒,而 JQM 会增强搜索结果中的所有元素。

我好奇的是我是否可以gzip Ajax 响应从Coldfusion 发送。如果我现在检查搜索标题,我会看到:

    RESPONSE-header
Connection Keep-Alive
Content-Type text/html; charset=UTF-8
Date Sat, 01 Sep 2012 08:47:07 GMT
Keep-Alive timeout=5, max=95
Server Apache/2.2.21 (Win32) mod_ssl/2.2.21 ...
Transfer-Encoding chunked

REQUEST-header
Accept */*
Accept-Encoding gzip, deflate
Accept-Language de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Connection keep-alive
Cookie CFID= ; CFTOKEN= ; resolution=1143
Host www.host.com
Referer http://www.host.com/dev/users/index.cfm

所以,我的请求会接受gzip, deflate,但我会返回分块

我在 cfsavecontent(称为compressedHTML)中生成 AJAX 响应并运行它以消除空格

<cfrscipt>
compressedHTML = reReplace(renderedResults, "\>\s+\<", "> <", "ALL");
compressedHTML = reReplace(compressedHTML, "\s{2,}", chr(13), "ALL");
compressedHTML = reReplace(compressedHTML, "\s{2,}", chr(09), "ALL");
</cfscript>

在像这样的响应对象中发送压缩HTML之前:

 {"SUCCESS":true,"DATA":  compressedHTML  }

问题
如果我知道我要通过 Ajax 在数据对象中发回 HTML,有没有办法在返回响应服务器端之前对响应服务器端进行 gzip 处理,而不是发送 分块?如果这可能的话?如果是这样,我可以在响应对象中执行此操作还是必须发回“纯”HTML?

谢谢!

编辑:
找到this设置动态压缩的“web.config” - 似乎不起作用

编辑2:找到thi片段并正在使用它,尽管我不确定这是否有效。

<cfscript>
compressedHTML = reReplace(renderedResults, "\>\s+\<", "> <", "ALL");
compressedHTML = reReplace(compressedHTML, "\s{2,}", chr(13), "ALL");
compressedHTML = reReplace(compressedHTML, "\s{2,}", chr(09), "ALL");

if ( cgi.HTTP_ACCEPT_ENCODING contains "gzip" AND not showRaw ){
cfheader name="Content-Encoding" value="gzip";

bos = createObject("java","java.io.ByteArrayOutputStream").init();
gzipStream = createObject("java","java.util.zip.GZIPOutputStream");
gzipStream.init(bos);
gzipStream.write(compressedHTML.getBytes("utf-8"));
gzipStream.close();
bos.flush();
bos.close();
encoder = createObject("java","sun.misc.
outStr= encoder.encode(bos.toByteArray());

compressedHTML = toString(bos.toByteArray());
}
</cfscript>

可能需要在响应对象而不是compressedTHML变量上尝试这个

最佳答案

好的。让它工作。

我正在使用this来自 CFLib,如下所示:

<cfscript>
// remove whitespace
compressedHTML = reReplace(renderedResults, "\>\s+\<", "> <", "ALL");
compressedHTML = reReplace(compressedHTML, "\s{2,}", chr(13), "ALL");
compressedHTML = reReplace(compressedHTML, "\s{2,}", chr(09), "ALL");
// gzip
compressedHTML = gzip(compressedHTML);
</cfscript>
<!--- modify header --->
<cfheader name="Content-Encoding" value="gzip">
<cfheader name="Content-Length" value="#len(compressedHTML)#" >
<!--- return cfcontent with reset="no", so I'm not disrupting the Ajax request --->
<cfcontent reset="no" variable="#compressedHTML#" />
<cfreturn />

您还需要确保将包含上述内容的函数的返回变量设置为binary,并且 Ajax 请求必须使用returntype="html"。至少我就是这样让它工作的。

看起来效果很好,我的 Ajax 请求从 50-60k 增强标记减少到 1-2k。在移动设备上很好用:-)

编辑:
如果您遇到特殊字符无法正确显示的问题,请尝试设置

 <cfheader name="Content-Type" value="text/html; charset=ISO-8859-1">

返回cfcontent之前。我不知道这是否比 UTF-8 更好,但它适用于德语 äöüß,而我在 Ajax 响应中缺少了它。

关于jquery - 如何在 Coldfusion 中对大型 Ajax 响应(仅限 HTML)进行 gzip 压缩?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12226409/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com