【问题标题】:WebSphere 7: Modify HTTP headers for static content file servingWebSphere 7:修改静态内容文件服务的 HTTP 头
【发布时间】:2013-02-28 03:01:52
【问题描述】:

我正在使用 WebSphere Application Server v7.0 的 <enable-file-serving value="true" /> 功能为我的 Java Web 应用程序提供静态内容(图像、CSS、JavaScript)。

如何修改此静态内容的 HTTP 标头(例如,添加 Cache-ControlExpires 标头)?

【问题讨论】:

  • 嗨,推荐的方法是将静态内容移动到 IHS(IBM HTTP Server - 实际上只是一个 apache 2),如果需要,它会在 WAS 之前进行负载平衡和故障转移。检查:www-01.ibm.com/software/webservers/httpservers
  • @MarcosMaia 我已经在使用 IHS,但是在我的环境中提取/分发/同步静态内容以使其从 Web 服务器而不是应用程序服务器提供服务的困难并不值得头疼。

标签: caching http-headers websphere servlet-filters websphere-7


【解决方案1】:

我最终写了一个Filter 来根据所请求资源的 URL 添加 HTTP 标头。这是一个简化的版本:

CacheFilter.java

public class CacheFilter implements Filter {
    private static long maxAge = 86400 * 30; // 30 days in seconds

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        httpResponse.setHeader("Cache-Control", "max-age=" + maxAge);
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void destroy() {
    }
}

web.xml

<filter>
    <filter-name>cache</filter-name>
    <filter-class>com.example.CacheFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>cache</filter-name>
    <url-pattern>*.png</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>cache</filter-name>
    <url-pattern>*.jpg</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>cache</filter-name>
    <url-pattern>*.gif</url-pattern>
</filter-mapping>

【讨论】:

  • 根据规范 (w3.org/Protocols/rfc2616/rfc2616-sec14.html) max-age 以秒为单位而不是毫秒,所以它应该是 private static long maxAge = DateUtils.SECONDS_PER_DAY * 30;(我不知道那个常数存在)否则很好的答案
  • @jambriz 你是对的。我习惯了标准单位是毫秒的 JavaScript。我已经更正了答案。
  • 我正在尝试做类似的事情。但它不起作用。我仍然看到没有缓存。你认为我遗漏了什么吗?我和你有完全相同的代码。
  • 我尝试了上面的过滤器,它能够为我的本地主机中的图像文件设置最大年龄。但是,如何为来自另一台服务器的图像文件设置最大年龄?我正在进行 JAx 调用以从第三方服务器加载图像
  • @Sarath 你不能,除非你通过你自己的服务器代理这些图像并使用类似上面的东西控制标题。
猜你喜欢
  • 2013-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多