index.html
<form action="a.php" method="post">
密码:
<input type="text" name="passwd" />
<input type="submit" value="提交" />
</form>a.php
<?php
header("Expires: Thu, 01 Jan 1970 00:00:01 GMT");
  header("Cache-Control: no-cache, must-revalidate");
  header("Pragma: no-cache");
  header("Content-Type:text/html;charset=utf-8"); $passwd=$_POST['passwd'];

if($passwd=='xwcmb'){
                  session_start();
   $_SESSION['login']=1;
                  ......
else{
echo '密码错误!';
}
?>b.php 退出,销毁session
<?php
header("Expires: Thu, 01 Jan 1970 00:00:01 GMT");
  header("Cache-Control: no-cache, must-revalidate");
  header("Pragma: no-cache");
  header("Content-Type:text/html;charset=utf-8");
  
session_start();
unset($_SESSION['login']);
session_destroy();
echo "Bye!"  ?>其他php页面         .......
session_start();
if(isset($_SESSION['login'])&&$_SESSION['login']==1){
             ......
}else{
echo '非授权访问!';
}
测试正常,在用b.php销毁session后,在ie地址栏访问其他php页面,非授权访问;
在ie地址栏直接输入a.php,也得到密码错误,但是用ie回退访问a.php,却重新获得session访问。我知道这样程序和结果是符合的,因为访问ie回退访问a.php, post变量可能还有缓存,导致重新生成session。我想要的是,销毁session后,如何禁止回退访问呢?如何来写程序呢?期待高人指点,十分感谢

解决方案 »

  1.   

    这个回退没有关系的,看到的只是缓存的东西,并不是实时的数据。只要用户一刷新,就退出了。这个事是浏览器干的,不是你php干的事
      

  2.   


    那么我想做到,销毁session后,无论是用户在地址栏直接访问,还是用浏览器后退按钮,都无法访问注销前的内容,这种体验如何实现呢,十分感谢
      

  3.   

    最简单的方法就是在页面里加入<meta http-equiv="pragma" content="no-cache" />
    以下为说明:pragma与no-cache 属性值 -- 定义页面缓存 
    pragma与no-cache用于定义页面缓存 
    pragma出现在http-equiv属性中,使用content属性的no-cache值表示是否缓存网页 
    引用网址:http://www.dreamdu.com/xhtml/no-cache/ 
    不缓存页面(为了提高速度一些浏览器会缓存浏览者浏览过的页面,通过下面的定义,浏览器一般不会缓存页面,而且浏览器无法脱机浏览.)pragma
    <meta http-equiv="pragma" content="no-cache" />
      

  4.   


    已经在php输出头加上了,示例中有啊
      

  5.   

    做了一些尝试,发现销毁session后,用ie回退,提示刷新,php再刷新后,之前的POST变量值,还是存在的,导致页面又可以看到内容,如何销毁session时,也把POST变量值清空。我的想法是这样的
    1.php页面,密码正确,显示内容,启用session。
    2.密码不正确,查看session变量存在,依旧显示内容(主要用在刷新本页更新内容上)
    3.密码不正确并且session变量不存在,提示密码错或者非法登录  header("Expires: Thu, 01 Jan 1970 00:00:01 GMT");
      header("Cache-Control: no-cache, must-revalidate");
      header("Pragma: no-cache");
      header("Content-Type:text/html;charset=utf-8"); $passwd=$_POST['passwd'];
    session_start();
      if(isset($_SESSION['login'])||$passwd=='xwcmb'){
       $_SESSION['login']=1;
            .......
            }elseif(!isset($_SESSION['login'])){
    echo '非法登录!';
    echo isset($_SESSION['login']).'_'.$passwd;
    }elseif($passwd!='xwcmb'){
    echo '密码错误!';
    echo isset($_SESSION['login']).'_'.$passwd;
    }做了一些尝试,发现销毁session后,用ie回退,提示刷新,php再刷新后,之前的POST变量值,还是存在的,导致页面又可以看到内容,如何销毁session时,也把POST变量值清空,也就是禁用POST缓存。
      

  6.   

    我知道了这种做法的弊端或者错误,session生成页面和session判断使用页面,做成了一个页面。
    应该是这样的
    1.html登录到logon.php
    2.logon.php判断密码,是否启用session,跳转正确或错误的页面。
    3.内容php页面,启用session,判断是否合法。
    4.session销毁页面,并跳转。我想的比较简单
    1.html登录到内容php页面。
    2.内容php页面,判断密码,是否启用session,是否显示内容。
    3.session销毁页面。第二种方法,我在想是否能够行的通,只要能够禁用或者清除POST缓存,应该是可以的。
    在刷新php页面的时候,html传递过来的POST值依然存在
    有没有这种可能
    1.html链接过来的,POST正常。
    2.php单独刷新,POST缓存为空。
      

  7.   

    <input type="text" name="passwd" />
    这个东东type="text"最好改改 type="password" 这样是最简单的防密码外泄的
      

  8.   

    搞定了,弄清楚了很多东西Post Redirect Get,简称PRG,呵呵很像RPG