敬告信息 :response.setHeader("Pragma","no-cache");问题

kisslan 2007-08-17 01:04:38
-------------------------------------------敬告信息
警告: 网页已经过期 您申请的网页是用表单中提交的信息创建的。该网页已失效。由于有安全预警功能,Internet Explorer 不会自动再次提交您的信息。
要重新提交信息并查看该网页,请单击刷新按钮。


--------------------------------------------------现象1----------------------------------------------------------
[登陆]页面--------->[树型目录]IFREAM页面
若在[树型目录]的每个Link的页面里面都加入,如下清cache语句
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires",0);
response.setHeader("Pragma","no-cache");
则,用Link的真实地址(右键属性查看这个Link的真实地址)
在IE浏览器上访问这个Link,然后在点IE的Back按钮就会出现上面的警告信息!
--------------------------------------------------现象2----------------------------------------------------------
getServletContext().getRequestDispatcher("URL").forward(request,
response);

若[登陆]页面采用上面这种方式,迁移到[树型目录]IFREAM页面,则
用户登陆后在[树型目录]页面做一些操作后,点IE浏览器的Back按钮!一直Back
到[登陆]页面,然后再点前进,若画面加入清cache语句,则显示上面的警告信息!
这时候若Back到URL为控制迁移的Servlet上,点刷新则
[
因为从[登陆]页面迁移到[树型目录]页面,通过一个Servlet来控制迁移,该Servlet采用的是getRequestDispatcher方式,所以
现在点刷新就会把原来信息重新提交一遍。
]会自动重新登陆到[树型目录]叶面!这就是所谓的重复提交?

若采用下面这种方式迁移则不会出现这种情况!
response.sendRedirect("URL");
但是这个URL必须是存在的.Jsp,并且IE的浏览器,地址栏上面的路径,即是我Jsp的路径!
不像getRequestDispatcher这种方式,地址栏上面的路径,即我Servlet的路径!

若用response.sendRedirect("URL");这种方式,我有办法修改,IE地址栏上面先是的URL吗?
...全文
4035 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dyijun 2011-11-08
  • 打赏
  • 举报
回复
mark
jianjianyuer 2011-07-30
  • 打赏
  • 举报
回复
原来如此
fq1798 2011-04-21
  • 打赏
  • 举报
回复
虽然帖子 比较老,但是 很实用
love1901 2011-03-09
  • 打赏
  • 举报
回复
mark
zhoudewen_degediao 2010-07-31
  • 打赏
  • 举报
回复
Lisliefor

你那防止用户后退的方法没有效果啊!
zjf405 2007-09-14
  • 打赏
  • 举报
回复
mark
bushuang 2007-09-14
  • 打赏
  • 举报
回复
mark
Lisliefor 2007-09-14
  • 打赏
  • 举报
回复
我做了以下的尝试:
两个页面a.jsp b.jsp ,a页面由用户输入一串字符,提交后,传递到b页面显示,而b页面我添加了清缓存的操作:
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires",0);
response.setHeader("Pragma","no-cache");
运行a.jsp,提交后,到b页面,b页面点浏览器“后退”键,正常回到a页面,而后点“前进”键,则提示网页已过期。
那么我们的服务器应答工作是不是在第二次进入这个页面时,才会进行清理缓存的操作呢?

以前搜集过防止用户点“后退”和刷新页面的一些方法:
<script language="javascript" for="document" event="onkeydown">
<!--
if(event.keyCode==13 && event.srcElement.type!='button' && event.srcElement.type!='submit' && event.srcElement.type!='reset' && event.srcElement.type!='textarea' && event.srcElement.type!=''){
event.keyCode=9;
}

if((event.altKey)&&((event.keyCode==37)||(event.keyCode==39))){
//alert("不准你使用ALT+方向键前进或后退网页!");
event.returnValue=false;
}
//屏蔽退格删除键,屏蔽F5刷新键,Ctrl+R
if((event.keyCode==116)||(event.ctrlKey && event.keyCode==82)){
event.keyCode=0;
event.returnValue=false;
}

//屏蔽Ctrl+n
if((event.ctrlKey)&&(event.keyCode==78)){
event.returnValue=false;
}

//屏蔽 shift+F10
if((event.shiftKey)&&(event.keyCode==121)){
event.returnValue=false;
}

//屏蔽 shift 加鼠标左键新开一网页
if(event.srcElement.tagName == "A" && event.shiftKey){
event.returnValue = false;
}

//屏蔽Alt+F4
if((event.altKey)&&(event.keyCode==115)){
showModelessDialog("about:blank","","dialogWidth:1px;dialogheight:1px");
return false;
}

-->
</script>

ps:这个不会与你其他的js函数冲突,若想继续添加新的js函数,在下面直接添加:
<script language="JavaScript" type="text/JavaScript">
<!--
......
-->
</script>
Lisliefor 2007-09-14
  • 打赏
  • 举报
回复
首先楼主可以看一下Forward方法与sendRedirect方法的区别:

前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址,他是不会改变Request的值,如果你需要在下一个页面中能从中获取新的信息的话,你可以Request.setAttribute()来放置一些标志,这样从下一个页面中获取;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用Request Dispatcher.forward()方法,并且,这样也有助于隐藏实际的链接。

在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用HttpServletResponse.sendRedirect()方法。redirect则是服务器收到请求后发送一个状态头给客户,客户将再请求一次,这里多了两次网络通信的来往。当然forward也有缺点,就是forward的页面的路径如果是相对路径就会有些问题了。


kisslan 2007-09-14
  • 打赏
  • 举报
回复
up
kisslan 2007-09-14
  • 打赏
  • 举报
回复
up
kisslan 2007-09-14
  • 打赏
  • 举报
回复
up
yufanzy909 2007-08-17
  • 打赏
  • 举报
回复
jf
iboy1983 2007-08-17
  • 打赏
  • 举报
回复
接分学习
shili150 2007-08-17
  • 打赏
  • 举报
回复
JF

62,624

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧