【问题标题】:tomcat ExpiresFilter does not worktomcat ExpiresFilter 不起作用
【发布时间】:2015-01-19 10:25:35
【问题描述】:

以下是我的webapp的web.xml中的sn-p

<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 org.apache.catalina.filters.ExpiresFilter isEligibleToExpirationHeaderGeneration FINE:请求 响应状态为“200”的“/kuku/dist/js/vendor.js.map” content-type "null",过期标头已定义

我在tomcat的conf目录下搜索过

grep -r 配置过期

什么也没找到。

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

【问题讨论】:

    标签: java tomcat


    【解决方案1】:

    我不知道它是否会有所帮助,但实际上有两种情况下您会收到该日志消息:

    • 如果响应已经有“过期”标头

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

    参考:

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

    【讨论】:

    • 我尝试朝这个方向发展。有没有办法从入口点开始获取请求的生命周期日志,并查看链中每个部分的输入和输出?
    • 问题出在 BasicAuthenticator 阀门上
    【解决方案2】:

    更新: 这与安全有关。

    我有以下 xml sn-p 用于身份验证。

    删除它时,过期标头已正确设置。

    <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

    但最好不要使用这种身份验证方案

    【讨论】:

      【解决方案3】:

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

      此答案旨在为喜欢解决此问题的人以及真正想了解此问题的人提供解决方法。

      这里有一个解决方法:

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

      &lt;filter-class&gt;org.apache.catalina.filters.ExpiresFilter&lt;/filter-class&gt;

      并确保你的战争包含这个编译的代码或网络上下文在类路径中有这个类。

      【讨论】:

        【解决方案4】:

        我知道这是一个老问题,但由于我最近遇到了这个问题,这里有更多信息:

        “问题”在org.apache.catalina.authenticator.AuthenticatorBase 中,它为安全资源设置了Expires 标头(这是有道理的)。 参见例如(我只检查了 Tomcat 7 和 8,但这可能无处不在):https://github.com/Oreste-Luci/apache-tomcat-8.0.26-src/blob/master/java/org/apache/catalina/authenticator/AuthenticatorBase.java#L508-L518

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

        在我的例子中,我想更改静态资源的缓存标头,所以我求助于元 HTML 标记,更多信息请访问http://cristian.sulea.net/blog/disable-browser-caching-with-meta-html-tags/

        【讨论】:

          猜你喜欢
          • 2013-07-09
          • 2014-02-24
          • 2013-09-08
          • 2011-09-07
          • 1970-01-01
          • 2019-08-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多