Java / Wicket - 如何阻止浏览器缓存页面?

问题描述 投票:7回答:6

我有一个Java / Wicket页面,它生成一个JNLP文件,用于启动我公司的软件。该类将可选地获取一些url参数并将它们作为参数嵌入JNLP中。当用户启动此JNLP文件时,客户端应用程序将根据这些参数执行某些功能。如果客户端软件已在计算机上运行,​​则点击JNLP页面将尝试通过远程调用向正在运行的客户端提供这些参数,而不是启动新页面。

这部分是我遇到问题的地方。在IE,Firefox和Chrome上,我可以打开一个新的客户端,但尝试再次访问相同的URL将返回一个JNLP文件。我发现清除浏览器缓存会在所有浏览器上修复此问题。此外,我似乎无法在JNLP类中遇到断点,这强制了我的预感,这对于请求而言比Wicket更奇怪。

我将以下代码放在我的页面类中,该类扩展了org.apache.wicket.markup.html.WebPage:

@Override
protected void setHeaders(WebResponse response) {
    getPageMap().remove(this);
    HttpServletResponse httpServletResponse = response.getHttpServletResponse();
    if (httpServletResponse != null) {
        httpServletResponse.setDateHeader("Expires", 0);
        httpServletResponse.addHeader("Cache-Control", "no-cache,no-store,private,must-revalidate,max-stale=0,post-check=0,pre-check=0");
        httpServletResponse.addHeader("Keep-Alive", "timeout=3, max=993");
    }
}

这似乎不起作用,因为Firefox 3.6似乎仍然缓存结果。 IE 7将工作,但只有在尝试我创建几次链接后。我不太了解Web开发和Wicket,这对我来说是新的,所以我可能会遗漏一些简单的东西。

TL; DR:如何让Wicket页面不在客户端浏览器上缓存?

java wicket
6个回答
5
投票

在一些Wicket内部使用的hack(例如参见org.apache.wicket.markup.html.image.NonCachingImage的源代码)是向网址添加随机噪声。

基本上,如果您正在生成浏览器调用的URL,您可以添加随机变化的Web应用程序忽略的参数,并欺骗浏览器忽略其缓存。


2
投票

0
投票

我不太了解Wicket,但你尝试过使用WebResponse.setLastModifiedTime(Time time)吗?我知道FF发送一个If-Modified-Since标头,您的服务器将使用304 Not Modified或正常响应回复。

对我来说,你的服务器会检查lastModifiedTime上的WebResponse来决定,这似乎很自然。

如果这没有帮助,我会建议您使用Firebug for Firefox并查看请求和响应。


0
投票
response.setHeader( "Expires", "0" );
response.setHeader( "Cache-Control", "no-store, no-cache, must-revalidate, max-age=0, private" );
response.setHeader( "Pragma", "no-cache" );

这适用于IE,Firefox等,它唯一不起作用的浏览器是konqueror。


0
投票

Wicket 6.11.0:Application.get()。getResourceSettings()。setDefaultCacheDuration(Duration.NONE);


0
投票

你有没有试过使用window.location.replace加载页面?

© www.soinside.com 2019 - 2024. All rights reserved.