我正在前端运行Coldfusion8
和jquery/jquery-mobile
。
我正在使用一个支持Ajax的搜索引擎,试图找到数据量和客户端处理时间之间的最佳权衡。
目前,我的AJAX搜索返回40k(JQM增强标记),这避免了任何客户端增强。这样我就可以在没有页面停顿的情况下使用大约2-3秒,而JQM会增强搜索结果中的所有元素。
我很好奇我是否可以从Coldfusion发送gzip Ajax responses
。如果我现在检查我的搜索标题,我就是这样:
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
,但我会回来chunked
。
我在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>
在像这样的响应对象中发送compressedHTML之前:
{"SUCCESS":true,"DATA": compressedHTML }
问题
如果我知道我通过Ajax在我的数据对象中发回HTML
,那么在返回它之前有gzip
响应服务器端与发送chunked
之间的方法吗?如果这是可能的?如果是这样,我可以在我的响应对象中执行此操作,还是必须发回“纯”HTML?
谢谢!
修改
找到this设置'web.config'进行动态压缩 - 似乎无法正常工作
EDIT2 : 找到了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>
可能需要在response object
而不是compressedTHML
变量上尝试此操作
答案 0 :(得分:3)
确定。得到它的工作。
我正在使用CFLib中的this,如下所示:
<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响应中表现得很好。