-------------------------------------------敬告信息
警告: 网页已经过期 您申请的网页是用表单中提交的信息创建的。该网页已失效。由于有安全预警功能,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吗?

解决方案 »

  1.   

    首先楼主可以看一下Forward方法与sendRedirect方法的区别:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址,他是不会改变Request的值,如果你需要在下一个页面中能从中获取新的信息的话,你可以Request.setAttribute()来放置一些标志,这样从下一个页面中获取;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用Request Dispatcher.forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用HttpServletResponse.sendRedirect()方法。redirect则是服务器收到请求后发送一个状态头给客户,客户将再请求一次,这里多了两次网络通信的来往。当然forward也有缺点,就是forward的页面的路径如果是相对路径就会有些问题了。
      

  2.   

    我做了以下的尝试:
    两个页面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>
      

  3.   

    Lisliefor你那防止用户后退的方法没有效果啊!