tomcat ExpiresFilter不起作用

时间:2015-01-19 10:25:35

标签: java tomcat

以下是我的webapp

的web.xml中的一个片段
<filter>
   <filter-name>ExpiresFilter</filter-name>
   <filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class>
   <init-param>
      <param-name>ExpiresByType text/css</param-name>
      <param-value>access plus 3 months</param-value>
   </init-param>
   <init-param>
      <param-name>ExpiresByType text/html</param-name>
      <param-value>access plus 3 months</param-value>
   </init-param>
   <init-param>
      <param-name>ExpiresByType application/javascript</param-name>
      <param-value>access plus 3 months</param-value>
   </init-param>
</filter>
<filter-mapping>
   <filter-name>ExpiresFilter</filter-name>
   <url-pattern>/css/*</url-pattern>
   <url-pattern>/dist/*</url-pattern>
   <url-pattern>/lib/*</url-pattern>
   <url-pattern>/partials/*</url-pattern>
   <dispatcher>REQUEST</dispatcher>
</filter-mapping>

将logging.properties变为FINER时,我得到了

  

2015 11:51:35 am org.apache.catalina.filters.ExpiresFilter   isEligibleToExpirationHeaderGeneration FINE:Request   响应状态为“200”的“/kuku/dist/js/vendor.js.map”   content-type“null”,已定义过期标头

我在tomcat的conf目录中搜索了

  

grep -r expire conf

并没有找到任何东西。

在哪里可以设置过期标头?

4 个答案:

答案 0 :(得分:1)

我不知道它是否会有所帮助,但实际上有两个条件可以获得该日志消息:

  • 如果回复已有“过期”标题

  • 如果响应具有“Cache-control”标头,该标头指定“max-age”属性。

参考:

(我假设我找到了正确的源代码......)

答案 1 :(得分:1)

更新: 这在某种程度上与安全性有关。

我有以下用于身份验证的xml代码段。

删除时,已正确设置expires标头。

<security-constraint>
    <web-resource-collection>
        <web-resource-name>All</web-resource-name>
        <url-pattern>/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
        <role-name>kuku<role-name>
    </auth-constraint>

    <user-data-constraint>
        <!-- transport-guarantee can be CONFIDENTIAL, INTEGRAL, or NONE -->
        <transport-guarantee>NONE</transport-guarantee>
    </user-data-constraint>
</security-constraint>

<login-config>
    <auth-method>BASIC</auth-method>
</login-config>
<security-role>
<role-name>kuku</role-name>
</security-role>

可以将阀门配置为允许缓存https://tomcat.apache.org/tomcat-7.0-doc/config/valve.html#Basic_Authenticator_Valve

但最好放弃这种认证方案

答案 2 :(得分:0)

如Stephen-C所述,如果已经设置了org.apache.catalina.filters.ExpiresFilterExpires标头,则Cache-Control: max-age将不起作用。

此答案旨在为那些想解决此问题的人以及真正想了解这一点的人们提供一种解决方法。

这是一种解决方法:

public class MyExpiresFilter extends org.apache.catalina.filters.ExpiresFilter { @Override protected boolean isEligibleToExpirationHeaderGeneration( HttpServletRequest request, XHttpServletResponse response) { return true; } } 并使用此类web.xml

更新您的MyExpiresFilter

<filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class>

并确保您的战争中没有包含此编译的代码或Web上下文的classpath中有此类。

答案 3 :(得分:0)

我知道这是一个古老的问题,但是由于我最近一直在苦苦挣扎,因此这里提供了更多信息:

“ {problem””位于org.apache.catalina.authenticator.AuthenticatorBase中,它为安全资源设置了Expires头(这很有意义)。 参见例如(我只检查了Tomcat 7和Tomcat 8,但是可能到处都是):https://github.com/Oreste-Luci/apache-tomcat-8.0.26-src/blob/master/java/org/apache/catalina/authenticator/AuthenticatorBase.java#L508-L518

如果存在ExpiresFilter标头,则Expires将不会设置标头。

在我的情况下,我想更改静态资源的缓存头,因此我求助于meta HTML标记,有关更多信息,请访问http://cristian.sulea.net/blog/disable-browser-caching-with-meta-html-tags/