如何在Struts 2中使用gzip压缩ajax请求?

4
如何使用Struts2压缩ajax响应?我尝试创建一个过滤器,但它没有起作用。在客户端,我正在使用jQuery,并且我期望的ajax响应是json格式。以下是我在服务器上使用的代码:
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    GZIPOutputStream gz = new GZIPOutputStream(out);
    gz.write(json.getBytes());
    gz.close();

我将响应重定向到struts.xml中定义的虚拟jsp页面。
我希望对返回的数据进行gzip压缩是因为有这样一种情况:必须向客户端发送相对较大的json数据。
如果提供任何参考资料,我将不胜感激。
谢谢。
2个回答

6
您不应随意压缩响应。只有在客户端已通知服务器接受(理解)压缩的响应时,您才可以压缩响应。您可以通过确定Accept-Encoding请求头是否包含gzip来实现。如果有,那么您可以安全地将响应的OutputStream封装在一个GZIPOutputStream中。您只需要事先添加一个值为gzipContent-Encoding头,以告知客户端发送内容所使用的编码方式,这样客户端就知道它需要解压缩。

简而言之:

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的示例:检查/conf/server.xml<Connector>元素的compressioncompressableMimeType属性:HTTP连接器参考。这样,您就可以直接写入响应,而无需担心gzip压缩。


6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接