需求:
    网站包含两个主要的页面:login.jsp和retrieve.jsp。用户在login.jsp输入用户名和密码,retrieve.jsp页面根据用户名密码来显示内容。    要求用户访问retrieve.jsp后,如果跳转到其他非本站点页面,比如新浪首页后,按IE浏览器上的Back按钮,retrieve.jsp要报错,不可以显示刚才的内容。    服务器端我用的是tomcat,下面是测试的日志,我打印出了request的相关参数:
============== Login Page =============
sessionid=3D73200BD37C20B6E660842DD78BBDB5
previous url:null============== retrieve page ===========
sessionid=3D73200BD37C20B6E660842DD78BBDB5
Attributes:
Parameters:
headers:
accept:image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
referer:http://10.10.8.254:8080/mmvd/kevin/
accept-language:zh-cn
accept-encoding:gzip, deflate
user-agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
host:10.10.8.254:8080
connection:Keep-Alive
cache-control:no-cache
cookie:JSESSIONID=3D73200BD37C20B6E660842DD78BBDB5============== retrieve page ==================
sessionid=3D73200BD37C20B6E660842DD78BBDB5
Attributes:
Parameters:
headers:
accept:*/*
referer:http://10.10.8.254:8080/mmvd/kevin/
accept-language:zh-cn
accept-encoding:gzip, deflate
user-agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
host:10.10.8.254:8080
connection:Keep-Alive
cookie:JSESSIONID=3D73200BD37C20B6E660842DD78BBDB5
稍微解释一下:1.login.jsp输入了用户名密码2.第一次出现retrieve page是用户正常登陆时的日志3.第二次是跳转到www.sina.com.cn后,用back键回到retrieve.jsp时的日志。问题:
    可以看到,通过两种方式访问,session id, referer等主要参数都是一样的。而且在这种条件下,没有办法将session销毁。该如果解决这个问题呢?

解决方案 »

  1.   

    用struts,提交给action之后 后退就会提示了
      

  2.   

    因为是在已有的网站上做改进,所以改动不能太大了。有基本方法么?或者说struts是如何做到这点的呢?
      

  3.   

    禁止IE缓存,后退会显示页面失效
    response.setHeader("Pragma","No-cache");
    response.setHeader("Cache-Control","no-cache");
    response.setDateHeader("Expires", 0);
      

  4.   

    谢谢各位的回复。可能有一点我没说清楚,对于站点内部的各个页面,是要求可以自由使用后退键跳转的。如果加了清除缓存和立即过期,内部页面之间也不能后退了。另外,即便后退时显示页面过期,如果点刷新,还是可以重新显示retrieve.jsp的,而且用户名和密码和之前一次登陆时是一样的。还是不能做到完全避免用户信息泄露。盼指点
      

  5.   

    能否这样呢,在unload事件中连接服务器,服务起记录用户要离开页面了,如果下一次连接时超过某个时间了(如3秒),则说明用户用户访问过别的网站了。
      

  6.   


    没有问题的
    并不使用filter
    只在retrieve.jsp页面中设置Pragma,Cache-Control,Expires就好了
    要通用就将下面代码写到javabean函数中,在需要的页面中调用就可以
    response.setHeader("Pragma", "no-cache");
    response.setHeader("Cache-Control", "no-cache");
    response.setDateHeader("Expires", 0);
      

  7.   

    找到一个方法,在session中加一个控制变量。每两个页面之间加入一个不可显示的校验页面。不过现在还是有缺陷,站点内还是不能通过back回退,只能自己在页面上做一个back按钮。因为我原先没有做过JSP,连HTML都没有怎么接触过,所以办法比较土。不过万幸老板说OK。如果谁有更好的办法,还可以跟大家一起讨论。三天后结贴,感谢各位的帮助,分数给大家平分好了。
      

  8.   

    写一个check.jsp页面,然后自己网站的所有页面去include它,在check.jsp中校验session中的控制变量,这样自己网站就能用back了
      

  9.   

    因为后退于刷新很相似,如果你可以不要刷新功能的话,可以在session中保存当前访问的页面,如果反问的页面相同则报错,
    这样会没有刷新功能(要的话要自己在页面加按钮),但有后退功能。
    看不懂你的方法,是否可以结合我的方法实现全部功能呢?
      

  10.   

    这么easy的问题,这么多同学没有答道点子上。easy的问题,就要用easy的方法解决嘛,如下:新建一个autoJump.jsp文件。看名字就知道了,自动跳转啊function jump()
    {
      **************;
      document.location.href=urls; 
    }然后body中,onLoad="jump();"Game Over.
      

  11.   

    这么多人哈。
    看来大家的方法都差不多了,就是在session中加入控制变量,然后在每两个页面中间加入一个不可显示的跳转控制页面。控制的逻辑我想有很多了,只要能实现就好。我就把我现在实现的方法说一下,当作总结了:
    1.在session中加入一个叫做verify的变量,这个变量可以取0或者1两个值。在login.jsp(网站欢迎页面)中初始化这个变量为0。2. 编写一个不可显示页面,比如叫做redirect.jsp。这个页面中将verify变量设为1。每两个页面间跳转都要通过这个页面,比如说对于button的click事件:
      onclick="parent.location=redirect.jsp?nextPage=retrieve.jsp"3.在每个受控制的页面的最开始,加入一段控制逻辑:
       if(verify==0)
       {
    }
      

  12.   

    3.在每个受控制的页面的最开始,加入一段控制逻辑:
         int verify=((Integer)session.getAttribute("verify")).intValue();  
         if(verify==0)  
         {
             //access deny
             return;  
         }
         else
         {
             session.setAttribute("verify",new Integer(0));
         }可以把这段逻辑单独定一个jsp文件,需要的时候include。
      

  13.   

    response.setDateHeader("Expires", 0);
      

  14.   

    mclinting的方法似乎有些问题。当用户从本网站跳转到其他网站,然后点击一下后退的时候可以正常的避免页面显示,因为session中的url记录的就是要回退到的url。但如果后退到更早的页面,比如通过Back按钮旁边的下拉菜单中直接选择,就无法控制了。
      

  15.   

    的确是有问题.window.location.replace()避免后退到前面的网页,就是限制太多了,刷新、后退都不能用了。
    lz的方法也有问题吧,既然redirect.jsp?nextPage=retrieve.jsp可以正常访问retrieve.jsp.
    那么离开后又退到redirect.jsp?nextPage=retrieve.jsp不就能访问retrieve.jsp.
    另外,如果可以解决的话,那也因该做成一个filter啊,因为你只是一些逻辑控制而已,这样可以避免对现有代码的修改,而且也要简单得多。
      

  16.   

    应为两次访问retrieve page页面(或者lz改进的redirect.jsp?nextPage=retrieve.jsp)的信息是相同的,我觉得不记录访问状态是没法实现的。
    在unload事件中记录离开的时间我认为是最好的,改进一下,不用访问服务器,记录在cookie中就可以了,服务器再处理一下时间差,就能得到客户离开某页面的时间。