如何在Apache Tomcat中的单个JS文件上设置Expires HTTP标头?

Itt*_*tai 6 gwt tomcat caching http-headers

我有一个js缓存在5-10分钟之间的文件,具体取决于我是使用eclipse中的tomcat(通过GWT插件)还是以独立方式启动tomcat.
这很奇怪,因为我使用的GWT是我的框架,并且根本不应该缓存此文件(对于那些了解GWT的人来说,这是一个nocache.js文件).我已经阅读了一个GWT Google团队线程,它是一个容器配置问题,而在其他地方,我需要在包含的HTML文件中定义它.
基本上,我现在很困惑,因为我不知道如何让这个文件不缓存.请注意,此js是由生成的GWT,我无法修改它.

感谢任何帮助,Ittai 替代文字 替代文字

Chr*_*her 15

使用javax.servlet.Filter

以便携方式(跨不同的应用服务器)执行此操作的一种方法是使用过滤器.在您的web.xml中添加以下内容:

  <filter>
    <filter-name>headersFilter</filter-name>
    <filter-class>MyHeadersFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>headersFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
Run Code Online (Sandbox Code Playgroud)

然后实现你的MyHeadersFilter:

public class MyHeadersFilter implements Filter {

  @Override
  public void doFilter(final ServletRequest request,
         final ServletResponse response, final FilterChain chain)
         throws IOException, ServletException {

      final HttpServletRequest httpRequest = (HttpServletRequest) request;
      final String requestUri = httpRequest.getRequestURI();

      final HttpServletResponse httpResponse = (HttpServletResponse) response;


      if (requestUri.contains(".nocache.")) {
        httpResponse.addHeader("Cache-Control", "no-cache");
        ...

      } else if (...) {
        ...
      }

      chain.doFilter(request, response);
  }
}
Run Code Online (Sandbox Code Playgroud)

可选:可配置的过滤器

您还可以使用<init-param>s 在web.xml中配置过滤器:

  <filter>
    <filter-name>headersFilter</filter-name>
    <filter-class>MyHeadersFilter</filter-class>
    <init-param>
        <param-name>myParam</param-name>
        <param-value>myValue</param-value>
    </init-param>
  </filter>
Run Code Online (Sandbox Code Playgroud)

将以下内容添加到MyHeadersFilter:

    private FilterConfig filterConfig;

    @Override
    public void init(final FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
    }

    @Override
    public void destroy() {
        this.filterConfig = null;
    }
Run Code Online (Sandbox Code Playgroud)

这使得可以使用以下方法访问您的init-param:

filterConfig.getInitParameter("myParam")
Run Code Online (Sandbox Code Playgroud)