通过java启用浏览器缓存

时间:2009-07-07 10:21:14

标签: java servlet-filters cache-control ihtmlimgelement

美好的一天,

我使用CacheFilter过滤到我的服务器的某个路径(将图像流输出到响应流)。我在我的web.xml中配置它如下:

<filter>
    <filter-name>imagesCache</filter-name>
    <filter-class>com.samaxes.cachefilter.presentation.CacheFilter</filter-class>
    <init-param>
        <param-name>privacy</param-name>
        <param-value>public</param-value>
    </init-param>
    <init-param>
        <param-name>expirationTime</param-name>
        <param-value>2592000</param-value>
    </init-param>
</filter>

...
<filter-mapping>
    <filter-name>imagesCache</filter-name>
    <url-pattern>/my/path/*</url-pattern>
</filter-mapping>

使用我的firefox,如果我通过地址栏访问我的网址,它会在第一次点击服务器,但在接下来的通话中使用缓存。但是,如果网址位于我的网页内(即<img src="..."/>),则它似乎始终会点击服务器。

[编辑]经过多次测试后,通过地址栏访问我的图片并不是一直都能正常工作。但缓存确实似乎比它更常用。至于是否真的,我不确定。

其他信息: 我的路径是/ my / path?then = some&amp; query = strings。请注意,它没有扩展名(即gif,png,jpeg),但它的mimetype设置正确(image / gif,image / png,image / jpeg)。我不确定是否缺少扩展或查询字符串是否存在任何影响。 (另外,另一个注意事项。虽然我的网址有查询字符串,但我在测试中一遍又一遍地使用相同的uri +查询字符串。)

任何想法为什么?

由于

2 个答案:

答案 0 :(得分:1)

我会调查正在发送的HTTP请求 - 特别是为该图像请求发送的HTTP标头。您可以使用Firefox plugin和/或检查servlet端的标头(在HttpServletRequest对象中)

答案 1 :(得分:1)

您希望在请求中特别查找任何Cache-Control标头。如果请求显示类似Cache-Control:no-cache或Cache-Control:max-age = 0,则缓存无法提供缓存副本。或者,如果响应的Expires标头在时间上太近,则无法长时间缓存。

标头和说明的完整列表在HTTP 1.1规范中。请参阅Caching in HTTP (13)Header Field Definitions (14)

Firebug plug-in是使用Firefox检查请求和响应标头的一种好方法。

还要注意你是如何使用Firefox的。点击刷新按钮相当于说Cache-Control:no-cache - 它表示你想要最新的副本,这会将你带回原始的web服务器。