java - 如何使用 Struts 2 gzip ajax 请求?

标签 java jquery json gzip

如何使用 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 的示例:检查 compressioncompressableMimeType <Connector> 的属性/conf/server.xml 中的元素: HTTP connector reference .这样您就可以直接写入响应而不必担心 gzip 压缩。

关于java - 如何使用 Struts 2 gzip ajax 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3631676/

相关文章:

wcf - 如何保护 .NET WCF 中的 HTTP JSON Web 服务

jquery 使用数组序列化输入

java - 为什么 setmaxage 不允许超过 ~5 分钟的时间

javascript - 如何使用变量自动运行外部 JavaScript 函数?

javascript - 如何使div的不透明度低于过度分层的iframe

jquery - Yajra 数据表 : Unable to load records in tables

javascript - 在 NodeJS ExpressJS 中从 req.body 中删除一个变量

java - GXT 3 : GridSelectionModel SelectionEvent/SelectionChangedEvent not firing

java - 我的 isPrime 方法有什么问题?

java - 如何修复 "this method must return boolean type"错误