有一种应用场景是, 用户点击返回按钮回到页面后,需要清除页面的缓存,不记录用户的操作。
这就需要清除页面的缓存 或者 对页面继续刷新。
在网上看了很多资料都是如下方法,但在jsp页面中并不起作用。
方法一: 在jsp页里
<%response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
response.flushBuffer();%>
方法二:在jsp<head></head>里
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="0">
亲测这两种方法都无效。
考虑到 如果客户端缓存了页面的话,页面上的 input带的值也会缓存下来,所以可以用input带的值来 进行判断 是否需要 reload 刷新。
下面的代码思路是 一进页面就运行 js代码,进页面判断input的值,如果不是yes就赋值yes就给input 赋值yes。
如果是yes,就reload。
也就是说 第二次进入同一个页面 就会reload( 点击返回按钮也算第二次进入)。
这样就能实现了 用户点击返回按钮回到页面后,需要清除页面的缓存。
实现代码如下:
js
<script type="text/javascript">
function pageNoCache(url){
//<input type="hidden" id="page_no_cache" data-description="magic_methon_dont_touch_me_fuck_x5" value="no">
var ele = document.getElementById('page_no_cache');
if(ele != null){
//alert(ele.value);
ele.value == 'yes' ? (url ? location.replace(url) : location.reload()) : ele.value = 'yes';
} else {
alert('页面需要一个id为page_no_cache的隐藏input,详见此方法');
}
}
pageNoCache();
</script>
jsp页面中加入input
<input type="hidden" id="page_no_cache" data-description="magic_methon_dont_touch_me_fuck_x5" value="no">
ps:
reload 方法,该方法强迫浏览器刷新当前页面。
语法: location.reload([bForceGet])
参数: bForceGet, 可选参数, 默认为 false,从客户端缓存里取当前页。true, 则以 GET 方式,从服务端取最新的页面, 相当于客户端点击 F5("刷新")
replace 方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,你不能通过“前进”和“后退”来访问已经被替换的URL。
语法: location.replace(URL)
在实际应用的时候,重新刷新页面的时候,我们通常使用: location.reload() 或者是 history.go(0) 来做。因为这种做法就像是客户端点F5刷新页面,所以页面的method="post"的时候,会出现“网页过期”的提示。那是因为Session的安全保护机制。可以想到: 当调用 location.reload() 方法的时候, aspx页面此时在服务端内存里已经存在, 因此必定是 IsPostback 的。如果有这种应用: 我们需要重新加载该页面,也就是说我们期望页面能够在服务端重新被创建, 我们期望是 Not IsPostback 的。这里,location.replace() 就可以完成此任务。被replace的页面每次都在服务端重新生成。你可以这么写: location.replace(location.href) |