2010-09-02 70 views
2

如何使用Struts2来压缩ajax响应?我试图创建一个过滤器,但它不起作用。在客户端,我使用jQuery和我期待的ajax响应是在json中。如何使用Struts 2对ajax请求进行gzip压缩?

这是我在服务器上使用的代码:

ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    GZIPOutputStream gz = new GZIPOutputStream(out); 
    gz.write(json.getBytes()); 
    gz.close(); 

我重定向到struts.xml中定义的虚拟jsp页面的响应。

我想要将数据gzip的原因是因为有一种情况,我必须将相对较大的json发送回客户端。

提供的任何参考将不胜感激。

谢谢。

回答

5

你不应该随机gzip响应。您只能在客户端通知服务器它接受(理解)gzip响应时才能响应gzip响应。您可以通过确定Accept-Encoding请求标头是否包含gzip来做到这一点。如果它在那里,那么您可以安全地将OutputStream的回复包装在GZIPOutputStream中。您只需预先添加Content-Encoding标头,其值为gzip,以通知客户端发送内容的编码方式,以便客户端知道需要将其解压缩。

一言以蔽之:

response.setContentType("application/json"); 
response.setCharacterEncoding("UTF-8"); 
OutputStream output = response.getOutputStream(); 

String acceptEncoding = request.getHeader("Accept-Encoding"); 
if (acceptEncoding != null && acceptEncoding.contains("gzip")) { 
    response.setHeader("Content-Encoding", "gzip"); 
    output = new GZIPOutputStream(output); 
} 

output.write(json.getBytes("UTF-8")); 

(请注意,你想设置的内容类型和字符编码为好,这是考虑到在本例中)

你也可以在应用程序服务器级别进行配置。由于您不清楚您使用的是哪一个,因此以Tomcat为目标的示例如下:请检查元素的compressioncompressableMimeType属性/conf/server.xmlHTTP connector reference。通过这种方式,您可以直接写入响应而不必担心是否会对其进行压缩。