Etag提供的缓存验证适用于FF和chrome,但IE似乎忽略了Etag值并始终返回缓存的响应.
服务器响应是:
HTTP/1.1 200 OK
Date: Mon, 07 Jul 2014 06:01:57 GMT
Content-Type: application/json
ETag: a7628382056ddd13b7e06991571fd3ad
Content-Encoding: gzip
Content-Length: 4360
Run Code Online (Sandbox Code Playgroud)
当客户端发送条件获取请求时
If-None-Match: 71fb49ecd6f85545693dec0e78ae2131
Run Code Online (Sandbox Code Playgroud)
根本不发送请求,IE返回缓存的响应.当ETag值相同时它是透明的但是当ETag不同时它是一个问题.
对我有用的唯一解决方案是添加标题
Cache-Control: no-cache
Run Code Online (Sandbox Code Playgroud)
我监控网络并强制IE验证ETag值.
问题解决了!
但是我没有找到任何正式的解决方案.我使用帖子Make IE来缓存资源,但总是重新验证作为参考,但大多数信息与我的问题无关.
如果您有其他想法或建议,请分享
我正在建立一个网站,我的用户正在遇到网站缓存问题.我开发了我的网站,并设置了chrome开发人员工具来禁用我的网站的缓存以进行开发.问题是当我向prod发布一个新的更改时,我的所有用户都因为浏览器缓存而无法获得更新.当我在朋友的计算机上手动删除我的网站的缓存时,它可以工作,但我显然不能指望每个人都这样做以获得新的更新.无论如何,我是否可以通过版本控制来解决这个问题?我环顾四周但似乎找不到任何东西.
编辑:我知道我可以防止缓存,但我不想完全阻止缓存,这似乎是一个糟糕的设计
为了处理JSF中的viewExpiredException,我进行了编码
<error-page>
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/error.html</location>
</error-page>
<session-config>
<session-timeout>1</session-timeout>
</session-config>
Run Code Online (Sandbox Code Playgroud)
在web.xml.
在error.html我已重定向到原始登录页面.但问题是会话范围bean即使会话过期也没有被清除.有什么方法可以解决这个问题吗?
所以这就是问题所在.当用户退出我的网站时,他们仍然可以点击后退按钮并继续使用该网站.为了跟踪用户是否登录,我创建了一个会话属性"isActive".用户登录时该属性设置为true,并且在注销时会话无效之前(冗余)删除该属性.同样在每个页面上,我都会检查属性是否存在.
我还指定不应在其head标签中缓存页面.
尽管如此,用户仍然能够回击浏览器,并继续使用该网站,就好像他们从未注销过一样.
有关如何解决此问题的任何想法?
这是代码:
登录Servlet:
...
session.setAttribute("isActive", true);
//Redirect to home page.
Run Code Online (Sandbox Code Playgroud)
检查登录的JSP:
<c:if test='${empty sessionScope.isActive || sessionScope.isActive != true}'>
<c:redirect url="/index.jsp?message=Session Timed Out."/>
</c:if>
Run Code Online (Sandbox Code Playgroud)
注销Servlet:
request.getSession().removeAttribute("isActive");
request.getSession().invalidate();
response.sendRedirect("index.jsp");
Run Code Online (Sandbox Code Playgroud)
内部标记:
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="Sat, 01 Dec 2001 00:00:00 GMT">
Run Code Online (Sandbox Code Playgroud)
谢谢
我对node.js,Express和移动开发比较陌生,并且遇到了我认为与使用Express发送标头有关的问题.
用户从主页"/"开始,未登录,然后单击按钮进入登录页面.当他们将用户名和密码提交给'/ validate_signin'时,他们应该被重定向回主页,这次主页显示不同,因为他们已登录.
重定向的工作方式如下:
res.redirect('/');
Run Code Online (Sandbox Code Playgroud)
这在我的笔记本电脑上工作正常,但在我的手机上,它重定向到'/',处于旧状态,可能是因为缓存.如果我在手机上刷新页面,"/"将会显示出来.
我发现这篇文章: 如何在所有浏览器中控制网页缓存?
尝试过以下两种方式设置标头(单独),但它们似乎没有发送:
res.header("Cache-Control", "no-cache, no-store, must-revalidate");
res.header("Pragma", "no-cache");
res.header("Expires", 0);
res.writeHead(302, {
"location": "/",
"Cache-Control" : "no-cache, no-store, must-revalidate",
"Pragma": "no-cache",
"Expires": 0
});
Run Code Online (Sandbox Code Playgroud)
以下是我目前收到的标题:
HTTP/1.1 304 Not Modified
X-Powered-By: Express
Date: Fri, 13 Jul 2012 17:35:18 GMT
Cache-Control: public, max-age=0
Last-Modified: Fri, 13 Jul 2012 12:32:12 GMT
Etag: "3223-1342182732000"
Accept-Ranges: bytes
Connection: keep-alive
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
非常感谢.
我在Stack Overflow上找到了很多关于如何用JavaScript刷新iframe的答案.
例如:
他们工作正常.但是,如果最近iframe中的页面已更改,则刷新将不会显示此更改.有没有办法可以强制刷新指定的iframe,以便显示新版本?
在我的Web应用程序中,我设置window.location导航到不同的页面,但由于某种原因,Firefox显示该页面的旧版本.
使用Firebug我检测到浏览器甚至没有发送HTTP请求,它只是使用该页面的旧版本(甚至不是最后一个版本)并显示它.
页面本身具有所有常用的标题,以防止缓存,当我使用链接或手动输入浏览页面时,它可以正常工作.只有在设置时才会出现此问题window.location.
这是一个Firefox问题或任何浏览器的东西?这种行为可以改变吗?
我有一个WebForms应用程序,其中第一页基本上是一个网格,其中包含指向第二页的链接,该第二页加载PDF查看器.网格实际上位于.ascx控件中.从第一页到PDF查看器页面,一切正常.但是,当我按下后退按钮返回第一页时.我收到以下错误(在Chrome中,但这也发生在其他浏览器中):

如果我单击后退按钮然后浏览器返回到第一页,一切都很好,但我需要解决此错误.
我已经尝试根据StackOverflow答案的建议在第一页中禁用缓存,如下所示:
Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.
Run Code Online (Sandbox Code Playgroud)
我也试过这个:
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
Response.Cache.SetExpires(DateTime.MinValue);
Run Code Online (Sandbox Code Playgroud)
我已将此代码放在.aspx页面和.ascx控件(在OnInit方法中)后面的代码中,但都无济于事.我在这里错过了什么?
我对web dev和http服务器等世界相当新,但我有一个基本的shell脚本,如下所示:
PORT=2600
if [[ $1 =~ ^[0-9]+$ ]]
then PORT=$1
fi
echo "Starting local http server (ctrl-c to exit)"
echo ""
echo " Demo: http://127.0.0.1:$PORT/demo"
echo ""
python -m SimpleHTTPServer $PORT
Run Code Online (Sandbox Code Playgroud)
它似乎可以正常工作,但是当我在我的演示中更新css文件时,很少和不一致会更新页面上显示的css.对任何html的更改都很好,并且它偶尔会显示css的变化,但我觉得我在这里做了一些根本错误的事情.思考?
我已经阅读了很多与此相关的文章,也阅读了有关HTTP缓存的很好的文章:https : //developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching?hl = en#无效并更新缓存的响应, 但我仍然不清楚:
为什么发送ETag标头不足以使特定资源的浏览器缓存无效?为什么每个人都建议实际更改资源的URL /文件名以强制浏览器重新下载文件?如果浏览器已经使用特定的ETag缓存了文件,并且在服务器上修改了ETag,那还不够吗?