【问题标题】:How to change HTTP header for a specific content type?如何更改特定内容类型的 HTTP 标头?
【发布时间】:2012-04-10 20:04:48
【问题描述】:

我正在使用 RichFaces,但我在使用 fileUpload flash 组件 + IE + SSL 时遇到问题。根据我所做的研究,我需要更改“Pragma”和“Cache-Control”HTTP 标头。

如何仅为 Flash 内容更改这些标题? 我尝试使用 Servlet 过滤器。这是doFilter() 方法:

chain.doFilter(request, response);
HttpServletResponse resp = (HttpServletResponse) response;
if (resp.getContentType() != null && resp.getContentType().contains("flash")) { // application/x-shockwave-flash
resp.setHeader("Pragma", "");
}

正在执行过滤器,正在更改标头,但随后我用萤火虫检查,标头回到“无缓存”。这是我在web.xml 中的最后一个过滤器,但它的发生就像其他过滤器将标题放回一样。

我也在使用 JBoss 5。 我该如何解决这个问题?谢谢。

【问题讨论】:

    标签: java internet-explorer ssl richfaces flash


    【解决方案1】:

    尝试执行指令以在doFilter() 之前设置标题。这样:

    HttpServletResponse resp = (HttpServletResponse) response;
    if ( // .. your test ) {
      resp.setHeader("Pragma", "");
    }
    chain.doFilter(request, response);
    

    因为一旦服务器开始向客户端发送数据,您就无法设置标头字段。

    这样一来,你自然得另找方法来检查所请求资源的contentType。也许您可以根据HttpServletRequest.getRequestURI() 和此值中的文件扩展名进行检查。

    【讨论】:

    • 我认为我所做的会更改标头之后服务器已处理请求,但之前发送响应。我首先测试了为所有响应设置该标头,但只有其中一些(不包括闪存)保留了更改。
    • 没有doFilter 中的代码已经写入客户端。有时,如果您的响应缓冲区很大,它可以工作,但是当您超过此限制时,它开始发送数据。所以你不能确定。
    • 您的建议奏效了。但是我从过滤器中删除了 if 条件并将<url-pattern>*.swf</url-pattern> 添加到部署描述符中。谢谢。
    • 请记住,如果需要,您可以在同一个过滤器上添加多个 url-pattern
    猜你喜欢
    • 2013-10-01
    • 2016-04-17
    • 2021-10-12
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 2019-01-20
    • 2011-09-30
    • 1970-01-01
    相关资源
    最近更新 更多