如何使用 Struts2 对 ajax 响应进行 gzip 压缩?我试图创建一个过滤器,但没有成功。在客户端,我使用的是 jQuery,我期望的 ajax 响应是在 json 中。
这是我在服务器上使用的代码:
ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gz = new GZIPOutputStream(out);
gz.write(json.getBytes());
gz.close();
我正在将响应重定向到在 struts.xml 中定义的虚拟 jsp 页面。
之所以要将数据 gzip 回,是因为有一种情况,我必须将一个相对较大的 json 发送回客户端。
我们将不胜感激您提供的任何引用资料。
谢谢。
最佳答案
你不应该随机 gzip 响应。只有当客户端通知服务器它接受(理解)gzip 压缩响应时,您才能对响应进行 gzip 压缩。您可以通过确定 Accept-Encoding
是否请求 header 包含 gzip
.如果它在那里,那么您可以安全地包装 OutputStream
GZIPOutputStream
中的响应.您只需要添加 Content-Encoding
预先 header 值为 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 的示例:检查 compression
和 compressableMimeType
<Connector>
的属性/conf/server.xml
中的元素: HTTP connector reference .这样您就可以直接写入响应而不必担心 gzip 压缩。
关于java - 如何使用 Struts 2 gzip ajax 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3631676/