【问题标题】:Returning zip file from JSP从 JSP 返回 zip 文件
【发布时间】:2014-04-14 16:53:20
【问题描述】:

如果请求包含包含“gzip”的 Accept-Encoding 标头,我编写了一个简单的 JSP 以返回 JavaScript 文件的压缩版本,否则返回解压缩版本。

<%@ page language="java"%>

<%
    boolean zipVersionRequired = false;
    try
    {
            String acceptEncodingHeader = request.getHeader("Accept-Encoding");

            if (acceptEncodingHeader != null && acceptEncodingHeader.indexOf("gzip") != -1)
            {
                    zipVersionRequired = true;
                    response.setHeader("Content-Encoding", "gzip");        
            }
            response.setHeader("Content-Type", "text/javascript");
    }
    catch (java.lang.Throwable t)
    {
    }
%>

<% if (zipVersionRequired == true) {
%>
    <jsp:forward page="/files/zipped/f1.js.gz"/>
<% } else {
%>
<jsp:forward page="/files/unzipped/f1.js"/>
<%
}
%>

需要注意的一点是,我将 Content-Type 设置为“text/javascript”,但根据我的浏览器,该响应标头的值是“application/x-gzip”——不确定在哪里设置。 Content-Encoding 响应标头设置为“gzip”。在 Chrome 开发者工具中,响应本身看起来像一堆奇怪的符号,所以我假设浏览器没有解压缩响应。

我编写了一个 servlet 来完成相同的工作 - 它根据 Accept-Encoding 请求标头读取压缩或解压缩文件的内容并将内容写回客户端。该 servlet 工作正常,但我想知道我在 JSP 版本中做错了什么。

我正在使用 Tomcat 网络服务器,但请不要建议将连接器上的 compression=on 设置作为此处任何事情的解决方案,因为在这种情况下这不是一个选项。

谢谢,

保罗

【问题讨论】:

  • 在你的第一个 <jsp:forward.../> 对我来说没有意义。不应该是&lt;jsp:include.../&gt;吗?

标签: jsp servlets gzip


【解决方案1】:

感谢 developerwjk 的评论。

这太长了,无法添加为对您的评论的回复,因此作为答案发布(并且有答案;见下文)。

我很想知道为什么您 (developerwjk) 认为 jsp:include 比 jsp:forward 更合适。如果我使用 jsp:include,我会得到一个 IllegalStateException。我想我理解其中的原因 - JSP servlet 使用 PrintWriter,当我使用 jsp:include 包含 gz 文件时,gz 后缀是公认的 mime 类型,并被识别为二​​进制类型,因此打开了 OutputStream ,导致 IllegalStateException。这只是我的猜测。

所以我使用前进返回,消除了所有空白(我在生成的 Java 中检查了它)并得到了与原来发布的相同的问题 - 所以问题与 jsp 中的空白无关(不是在使用 jsp 时:无论如何转发)。

然后我找到了它不起作用的原因 - 它是响应中的 Content-Type 标头。这是由 Tomcat 设置的,因为默认 web.xml 文件中的文件扩展名 (gz) 到 mime 类型 (application/x-gzip) 映射。当我将 .gz 文件重命名为 .xxxxx 时,响应中的 Content-Type 标头与我将其设置为 (text/javascript) 的内容相匹配,并且浏览器 (Chrome) 成功解压缩响应并运行 javascript。当然,我会在我的 war 的 web.xml 中添加一个 mime 类型映射,而不是在任何真正的解决方案中使用 .xxxxx 扩展名。

最后一件事 - 我希望 jsp:include (其中包含的文件是 .xxxxx 文件)只要 jsp 不包含空格就可以工作 - 它不包含。我没有收到任何响应内容和这个错误(在 Chrome 上):

Failed to load resource: net::ERR_CONTENT_DECODING_FAILED

我还在咀嚼那个。

保罗

【讨论】:

    猜你喜欢
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 2018-07-13
    相关资源
    最近更新 更多