【问题标题】:Enabling browser caching via java通过java启用浏览器缓存
【发布时间】:2009-07-07 10:21:13
【问题描述】:

早安,

我正在使用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,如果我通过地址栏访问我的 url,它会第一次访问服务器,但在后续调用期间会使用缓存。但是,如果 url 在我的页面内(即 &lt;img src="..."/&gt; ),它似乎一直在访问服务器。

[编辑] 经过几次测试后,通过地址栏访问我的图像并不总是有效。但是缓存似乎确实比 .至于是不是真的,我不确定。

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

有什么想法吗?

谢谢

【问题讨论】:

    标签: java servlet-filters cache-control ihtmlimgelement


    【解决方案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 服务器。

    【讨论】:

    • 谢谢,目前,我正在响应标头中设置 Cache-Control 和 Expires。我应该在请求标头中设置 Cache-Control 吗?回复:火狐:Wdym?我只使用“刷新按钮”或“F5”进行测试,而不使用 Shift+RefreshButton 或 Ctrl+F5。 ...你的意思是说Firefox的RefreshButton本身就是一个硬刷新?谢谢,
    • @Franz:如果您的响应标头允许缓存足够长的时间,那是正确的。如果您使用 Firebug 或其他 Web 开发插件,则可以看到 Firefox 请求标头;这些信息在这里应该真的有用。 F5 和 Ctrl-F5 的语义是:support.mozilla.com/… 另外,尝试输入您的 URL,然后输入另一个 URL,然后再次输入您的第一个 URL,避免刷新和后退/前进按钮。
    【解决方案2】:

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

    【讨论】:

    • 我应该注意什么?有什么陷阱吗?
    • HttpFox (addons.mozilla.org/en-US/firefox/addon/6647) 可以更好地查看标题。查看有效的 URL-type-in​​ 和无效的 IMG SRC fetch 之间有什么不同。需要注意的一点:当您点击“重新加载”时,Firefox 会考虑重新检查其本地副本的请求,至少有一个“if-modified-since”请求,您的 servlet 可能会将其视为新获取。另外:您可以在位置栏中使用“about:cache”查看浏览器缓存条目和过期时间。
    • 我会检查所有标题以确保它们是您所期望的。我不知道您的缓存层是如何工作的,因此它如何确定请求是针对新事物还是针对先前请求的实体。
    • 谢谢。浏览器在向服务器发出请求之前是否检查“if-modified-since”?还是“if-modified-since”仅供我的服务器使用?谢谢
    • 我完全不知道。我会用谷歌搜索的。
    猜你喜欢
    • 2012-04-09
    • 2018-05-05
    • 2020-07-19
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 2022-11-15
    • 2011-09-01
    • 1970-01-01
    相关资源
    最近更新 更多