Tomcat 8缓存静态文件,尽管如此配置

时间:2016-04-03 15:01:39

标签: tomcat caching

我的问题:

当我通过http访问从comcat 8提供的静态文件时,文件的内容将缓存在服务器端。 我可以排除以下错误:

  1. 它不是我的浏览器缓存(禁用,尝试过不同的浏览器,在cli上使用wget)。 Tomcat正在返回http 200 OK
  2. 它是not an configuration issue with a conflicting antiResourceLocking
  3. 我不认为这是配置问题? (见下文)
  4. 这是我的server.xml(我知道将上下文放在这里并不太好......)

    <Server port="8005" shutdown="SHUTDOWN">
      <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
      <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
      <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
      <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
      <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
    
      <GlobalNamingResources>
    
        <Resource name="UserDatabase" auth="Container"
                  type="org.apache.catalina.UserDatabase"
                  description="User database that can be updated and saved"
                  factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
                  pathname="conf/tomcat-users.xml" />
      </GlobalNamingResources>
    
    
      <Service name="Catalina">
    
        <Connector port="8888" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" />
    
            <!-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 -->
            <Connector
               protocol="org.apache.coyote.http11.Http11NioProtocol"
               port="8883" maxThreads="200"
               socketBuffer="-1"
               scheme="https" secure="true" SSLEnabled="true"
               keystoreFile="/vagrant/provision/configFiles/keystore" keystorePass="changeit"
               clientAuth="false" sslProtocol="TLS"/>
    
        <Engine name="Catalina" defaultHost="localhost">
    
          <Realm className="org.apache.catalina.realm.LockOutRealm">
            <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
                   resourceName="UserDatabase"/>
          </Realm>
    
               <Host name="www.xxx.de"  appBase="webapps">
                            <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />
                            <Context path="" docBase="/vagrant/webroot/xxx">
                              <Resources cachingAllowed="false" />
                            </Context>
                            <Context path="/r2d2" docBase="/vagrant/webroot/r2d2"/>
                            <Context path="/data" docBase="/vagrant/webroot/shares/data"/>
              </Host>
    
        </Engine>
      </Service>
    </Server>
    

    这是我的context.xml

    <Context>
        <Resources cachingAllowed="false" />
    
        <WatchedResource>WEB-INF/web.xml</WatchedResource>
        <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
    
    </Context>
    

    context xml resources标签仅适用于偏执狂。 server.xml资源标签应该足够,而没有context.xml中的resources标签吗? 但是,这是我观察到的:

    当我更改webroot中的文件时,tomcat会相应地更改内容长度(!)。因此它实际上检测到文件已更改。但是内容仍然是错误的(当我在文件系统中添加更多内容时,在文件末尾添加NUL字符)。我总是得到200个好的回复。 它确实适用于小文件,但不适用于&#34;更大的&#34;像〜&gt;这样的文件45172字节

    我的webapps和工作文件夹为空(!)。

    即使我重新启动tomcat,该文件仍然是缓存服务器端..这就是我失去理智的地方:tomcat从哪里获取旧文件内容?我甚至从tomcat上读取了github上的源代码,我已经看到缓存文件的内容存储在内存中了。我为缓存文件的某些部分进行了搜索,没有找到任何内容。

    对于更多信息:tomcat在vagrant中运行,但是如果我修改guest虚拟机或主机上的文件并不重要。从文件系统(访客和主机)更改文件,tomcat响应为200,但传递了错误的内容。

    tomcat-8.0.28正在运行。

    不再有任何想法:(提前谢谢你。 菲利普

1 个答案:

答案 0 :(得分:1)

使用工具检查网站并查找标题。我想你的问题是tomcat正在为你发送错误的httpheaders。

默认情况下,tomcat使用httpheaders pragma:no cache发送每个https请求。请尝试使用https请求。如果您在文件中看到更改,则可以在web.xml上添加以下代码段

<filter>
     <filter-name>ExpiresFilter</filter-name>
     <filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class>
     <init-param>
        <param-name>ExpiresByType image</param-name>
        <param-value>access plus 0 minutes</param-value>
     </init-param>
     <init-param>
        <param-name>ExpiresByType text/css</param-name>
        <param-value>access plus 0 minutes</param-value>
     </init-param>
     <init-param>
        <param-name>ExpiresByType application/javascript</param-name>
        <param-value>access plus 0 minutes</param-value>
     </init-param>
</filter>

我希望它有效