如何用Struts 2 gzip ajax请求?

kan*_*eda 4 java jquery json gzip

如何使用Struts2 gzip ajax响应?我试图创建一个过滤器,但它不起作用.在客户端我使用jQuery和我期待的ajax响应是在json中.

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

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    GZIPOutputStream gz = new GZIPOutputStream(out);
    gz.write(json.getBytes());
    gz.close();
Run Code Online (Sandbox Code Playgroud)

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

我之所以要重新gzip数据是因为我必须将一个相对较大的json发送回客户端.

任何参考提供将不胜感激.

谢谢.

Bal*_*usC 6

你不应该随机gzip响应.当客户端通知服务器它接受(理解)gzipped响应时,您只能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"));
Run Code Online (Sandbox Code Playgroud)

(请注意,您还要设置内容类型和字符编码,在示例中将其考虑在内)

您也可以在appserver级别配置它.由于目前还不清楚你用哪一个,这里只是一个Tomcat的针对性例如:检查compressioncompressableMimeType的属性<Connector>元素/conf/server.xml:HTTP连接器的参考.这样你就可以写回应而不用担心压缩它.


小智 6

如果您的响应是JSON,我建议使用struts2-json插件 http://struts.apache.org/2.1.8/docs/json-plugin.html并将enableGZIP参数设置为true.