由于我们的网络服务器配置错误,主域名将302重定向发送到新位置.我们解决了这个问题.清空浏览器缓存时,一切正常.
对于没有清空缓存的"普通"客户端:302重定向在浏览器中保留多长时间?
我正在寻找默认设置下每个主要浏览器(Chrome,Firefox,Safari,Opera,Edge,IE 12)的特定缓存时间(如果有的话).
我试图帮助一位同事调试过去6个月来一直没有问题的问题.在最近部署ASP.NET MVC 2应用程序之后,FileResult强制用户打开或保存PDF文件的响应在客户端计算机上存在的问题足够长,以便PDF阅读器打开它们.
早期版本的IE(特别是6)是受影响的唯一浏览器.Firefox和Chrome以及较新版本的IE(> 8)都表现得如预期.考虑到这一点,下一节将定义重新创建问题所需的操作.
href属性的普通超链接).在action方法中,标头设置为指示浏览器如何缓存响应.他们是:
response.AddHeader("Cache-Control", "public, must-revalidate, post-check=0, pre-check=0");
response.AddHeader("Pragma", "no-cache");
response.AddHeader("Expires", "0");
Run Code Online (Sandbox Code Playgroud)
对于那些不熟悉标题的人不熟悉:
一个.缓存控制:公共
表示任何缓存都可以缓存响应,即使它通常只是非缓存或只能在非共享缓存中缓存.
湾 缓存控制:必须重新验证
当高速缓存接收到的响应中存在must-revalidate指令时,该高速缓存必须在该条目变为陈旧后才能响应后续请求而不首先使用源服务器重新验证它
C.缓存控制:预检(IE5引入)
定义以秒为单位的间隔,在此之后必须检查实体的新鲜度.检查可能在用户显示资源后发生,但确保在下一次往返时缓存的副本将是最新的.
d.缓存控制:后检查(IE5引入)
定义以秒为单位的时间间隔,在此之后必须在向用户显示资源之前检查实体的新鲜度.
即 Pragma:no-cache(确保向后兼容HTTP/1.0)
当请求消息中存在no-cache指令时,应用程序应该将请求转发到源服务器,即使它具有所请求内容的缓存副本
F.过期
Expires entity-header字段给出了响应被视为过时的日期/时间.
我们从操作中返回文件
return File(file, "mime/type", fileName);
Run Code Online (Sandbox Code Playgroud)向用户显示"打开/保存"对话框
这里有六个其他应用程序使用相同的标题来强制Excel,CSV,PDF,Word和大量其他内容在用户,从来没有一个问题.
在返回a之前,在action方法中设置响应头FileResult.我已经让我的同事尝试创建一个继承的新类,FileResult然后重写该ExecuteResult方法,以便它修改标题,然后base.ExecuteResult()改为 - 没有状态.
我预感到"0"的"Expires"标题是罪魁祸首.根据这篇W3C文章,将其设置为"0"意味着"已经过期".我确实希望它过期,我只是不希望IE在处理它的应用程序有机会打开它之前将其从文件系统中删除.
一如既往,谢谢!
在进一步测试(使用Fiddler检查标头)时,我们发现我们认为设置的响应头不是浏览器解释的响应头.由于我自己并不熟悉代码,因此我没有意识到一个潜在的问题:标题在操作方法之外被踩到了.
尽管如此,我还是要打开这个问题.依然突出是这样的:有似乎是有出入Expires具有数值头 …
我遇到过Post/Redirect/Get模式的下一个问题.GET在重定向后执行Chrome时会从缓存中获取该页面.因此用户会看到过时的数据.
我试过跟随强制/支持重新验证
if (request.checkNotModified(sinceLastTweet)) return null;
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Last-Modified", String.valueOf(sinceLastTweet));
Run Code Online (Sandbox Code Playgroud)
但只会no-store导致服务器请求.
为什么Chrome在执行重定向时从缓存中获取页面?
@RequestMapping(method = GET)
public String home(ModelMap model, @PathVariable String username, HttpServletResponse response, WebRequest request) {
// response.setHeader("Cache-Control", "no-store");
List<Tweet> tweets = tweetRepository.findAll();
// long sinceLastTweet = tweets.get(0).getTimestamp().toEpochMilli();
// if (request.checkNotModified(sinceLastTweet)) return null;
// response.setHeader("Cache-Control", "no-cache");
// response.setHeader("Last-Modified", String.valueOf(sinceLastTweet));
model.addAttribute("tweets", tweets);
model.addAttribute("tweet", new Tweet());
model.addAttribute("username", username);
return "home";
}
Run Code Online (Sandbox Code Playgroud) 我有一些网站需要登录并显示敏感信息.
此人进入页面,提示登录,然后查看信息.
此人退出站点,并重定向回登录页面.
然后,该人可以"返回"并直接返回包含敏感信息的页面.由于浏览器只是将其视为呈现的HTML,因此它向他们显示没问题.
当人从登出屏幕点击"后退"按钮时,有没有办法阻止显示该信息?我不是试图禁用后退按钮本身,我只是试图阻止敏感信息再次显示,因为此人不再登录该站点.
为了便于论证,上面的站点/场景是在ASP.NET中使用表单身份验证(因此当用户转到第一页,即他们想要的页面时,它们会被重定向到登录页面 - 如果是差异).
我想确保我的servet的响应永远不会被broswer缓存,这样即使两个相同的请求(相隔一个纳秒),也总是联系服务器.这是实现这一目标的正确方法:
class MyServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
response.setHeader("Cache-Control", "no-cache");
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢,唐
这就是我们如何防止浏览器缓存JS和CSS文件.这似乎有点hacky ..有更好的方法吗?
<%
//JSP code
long ts = (new Date()).getTime(); //Used to prevent JS/CSS caching
%>
<link rel="stylesheet" type="text/css" media="screen" href="/css/management.css?<%=ts %>" />
<script type="text/javascript" src="/js/pm.init.js?<%=ts %>"></script>
<script type="text/javascript" src="/js/pm.util.func.js?<%=ts %>"></script>
Run Code Online (Sandbox Code Playgroud)
更新:我们想要阻止缓存的原因是为了确保在我们执行新版本时加载更新版本的文件.
问题:我有一个包含动态内容的网站,每次用户看到它时都需要重新加载.这包括用户点击另一个站点上的后退按钮并进入需要重新加载的站点时的用例.此事件后,大多数(全部?)浏览器不刷新站点.
我的解决方案(不太合适):http: //www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript
window.onbeforeunload = function () {
// This function does nothing. It won't spawn a confirmation dialog
// But it will ensure that the page is not cached by the browser.
}
Run Code Online (Sandbox Code Playgroud)
但它仍然不刷新页面.
什么可以影响/阻止所需行为的想法?对于这个问题,分别有其他解决方案的建议吗?
编辑:
设置如下:
Cache-Control private, must-revalidate, max-age=0
Expires Sat, 26 Jul 1997 05:00:00 GMT
Pragma no-cache
Run Code Online (Sandbox Code Playgroud)
和:
<meta name="cache-control" content="no-cache" />
<meta name="expires" content="0" />
<meta name="pragma" content="no-cache" />
Run Code Online (Sandbox Code Playgroud)
仍然没有成功.
我们遇到了一个奇怪的问题,我们不确定究竟是什么导致它.让我详细说明这个问题.假设我们有两个不同的html页面a.html和b.html.还有一个用index.html编写的小脚本:
<html>
<head>
<script>
function reloadFrame(iframe, src) {
iframe.src = src;
}
</script>
</head>
<body>
<form>
<iframe id="myFrame"></iframe>
<input type="button" value="Load a.html" onclick="reloadFrame(document.getElementById('myFrame'), 'a.html')">
<input type="button" value="Load b.html" onclick="reloadFrame(document.getElementById('myFrame'), 'b.html')">
</form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
服务器组件不断更新文件a.html和b.html.问题是两个文件的内容在服务器端成功更新.如果我们打开,我们可以看到更新的更改,但客户端获取的旧内容未显示更新的更改.
任何的想法?
当用户按下后退按钮时,如何让Firefox重新运行javascript并重新加载整个页面?通过添加此代码,我可以在除了Firefox之外的所有浏览器中通过另一个SO问题的帮助来执行此操作:
history.navigationMode = 'compatible';
$("body").unload(function(){})
Run Code Online (Sandbox Code Playgroud)
并且还添加了iFrame ...但这在Firefox中不起作用.有什么事可做吗?
我有一个页面index.php,它显示了基于mysql db的信息.它上面有表单,表单的操作设置为一个名为process.php的单独页面.Process.php执行所有数据库CRUD的东西,然后使用
header("Location: /webadmin/email/index.php");
Run Code Online (Sandbox Code Playgroud)
将用户发送回原始页面.
这似乎工作得很好,除了原始索引页面并不总是反映process.php所做的更改.我假设页面正在缓存,因为如果我进行刷新(Ctrl + F5),页面将显示最新数据.
如何防止此页面被缓存?我已经尝试了header()的PHP页面,但它似乎不起作用.Cache-Control和Expires选项似乎完全没有效果 - 页面仍在缓存中.
更新
好吧,我错了.显然,以下在IE中可以正常工作:
<?php header("Cache-Control: no-cache, must-revalidate");
Run Code Online (Sandbox Code Playgroud)
但是,它绝对不适用于FF,它仍然显示缓存版本.有关为什么会这样的想法,以及如何让它停止缓存?