1

我正在运行Coldfusion8并且jquery/jquery-mobile在前端。

我正在使用 Ajax 驱动的搜索引擎,试图找到数据量和客户端处理时间之间的最佳折衷。

目前我的 AJAX 搜索返回 40k(JQM 增强标记),这避免了任何客户端增强。通过这种方式,我可以在没有页面停顿约 2-3 秒的情况下度过难关,而 JQM 增强了搜索结果中的所有元素。

我很好奇是否可以gzip Ajax responses从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,但我会回来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>

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

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

问题
如果我知道我正在HTML通过 Ajax 发回我的数据对象,在返回它与发送之前有没有办法到gzip响应服务器端chunked?如果这完全有可能?如果是这样,我可以在我的响应对象中执行此操作,还是必须发回“纯”HTML?

谢谢!

编辑:
在为动态压缩设置“web.config”时 发现这个- 似乎不起作用

EDIT2:找到了这个片段并正在使用它,尽管我不确定这是否可行。

<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变量上尝试这个

4

1 回答 1

3

行。让它工作。

我在 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,但它适用于 German äöüß,这是我在 Ajax 响应中遗漏的。

于 2012-09-01T13:54:20.990 回答