【问题标题】:How to gzip ajax requests with Struts 2?如何使用 Struts 2 压缩 ajax 请求?
【发布时间】:2010-09-02 22:12:40
【问题描述】:

如何使用 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发送回客户端。

我们将不胜感激。

谢谢。

【问题讨论】:

    标签: java jquery json gzip


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2017-09-20
        • 1970-01-01
        • 2011-12-09
        • 2017-01-03
        • 1970-01-01
        • 2014-11-09
        • 2012-08-26
        • 2016-09-21
        • 2023-03-10
        相关资源
        最近更新 更多