tomcat服务缓存别名

时间:2014-07-04 05:26:33

标签: jsp tomcat servlets caching compilation

我正在尝试在两个位置提供jsp文件。 (jsp文件使用request.getRequestURI()来决定要投放的内容。)我正在使用下面的web.xml

<welcome-file-list>
    <!--no / here or url pattern will need //-->
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
    <servlet-name>Main</servlet-name>
    <jsp-file>/index.jsp</jsp-file>
</servlet>
<servlet-mapping>
    <servlet-name>Main</servlet-name>
    <url-pattern>/advanced/</url-pattern>
</servlet-mapping>

虽然它工作正常,但tomcat似乎将jsp缓存在/advanced/而不是/处的缓存。我怎样才能解决这个问题,以便两者都相同? (我不想缓存开发,仅用于生产。)

我只能在tomcat的work目录中看到一个java文件,所以我想这个问题与我使用jsp的事实无关,但与我设置映射的方式有关。

编辑:我已经检查了curl中的标头,我可以看到tomcat没有发送Last-Modified标头,所以我不明白为什么任何浏览器都会缓存它。另外,使用curl,我可以看到/更新为更新jsp,但/ advanced /不是。

EDIT2:我在org.apache.jasper.compiler.Compiler#isOutDated(boolean)花了一些时间,我发现只有我访问的第一个网址是标记为outDated的网址。我访问的第二个URL从未标记为outDated。所以就好像tomcat保留了JspServlet的两个实例,但共享该文件的相同outDated信息,所以当一个JspServlet将其标记为outDated并设置reload时,第二个JspServlet永远不会重新编译它也不提供重新编译的版本。我该如何修复/解决此问题?

1 个答案:

答案 0 :(得分:0)

如果您认为它是tomcat中的错误,open a bug report。开发人员通常可以快速分类错误。这个错误刚刚fixed,将在7.0.62&amp; 8.0.22。