首先说明一点:session不一定必须依赖cookie,只是php默认客户端sessionid基于cookie方式保存。

到此,我想你也应该了解了php默认的session客户端保存方式是基于cookie的,所以一旦客户端禁用Cookie,那么session跨页将会失效,不知道这么描述是否合适,通俗的说无状态的东西要变的有状态,只能两边都进行比对,如果用cookie方式保存的SessionID,客户端这边的比对条件就放到cookie里,所以客户端禁用cookie,session便也会随之失效。php的session客户端ID一般有两种保存方式:cookie和url方式。如果是cookie中保存session ID,就可以看到浏览器的cookie中有一个PHPSESID变量(可以通过firefox查看)。如果是URL传递的(建议使用隐藏表单传递),就可以看到形如:index.php?PHPSESID=ves0d7uvdsab9k6sig73mnn592的URL。

demo1.php
<?php
session_start();
$_SESSION['blog']='http://blog.jb51.net';
echo "<a href='demo2.php'>test2</a>";
?>

demo2.php
<?php
session_start();
echo 'session值为'.$_SESSION['blog'];
?>

  运行上面的代码,在客户端cookie正常情况下,我么可以在demo2.php中打印出$_SESSION['blog']的值为:http://blog.jb51.net。但是,现在如果你手动禁用客户端的cookie,再运行该实例,可能就得不到结果了。因为默认的客户端sessionid保存方式在跨页后读取不到前一页的sessionid,当执行session_start();将又会产生一个session文件,与之对应产生相应的session id,用这个session id是取不出前面提到的第一个session文件中的变量的,因为这个session id不是打开它的“钥匙”。如果在session_start();之前加代码session_id($sessionid);将不产生新的session文件,直接读取与这个id对应的session文件。简单的说就是在前一页取得session id,然后想办法传递到下一页,在下一页的session_start();代码之前加代码session_id(传过来的sessionid);

demo.php
<?php
$sid = $_GET['sid'];
if(!empty($sid)){
  session_id($sid);
  session_start();
}else{
  session_start();
  $sid = session_id();
}
?>
<form action="demo2.php?sid=<?php echo $sid ?>" method="post">
<input type="text" name="id" value="100" />
<input type="submit" value="提交"/>
</form>

demo2.php
<?php
$sid = $_GET['sid'];
if(!empty($sid)){
  session_id($sid);
  session_start();
}else{
  session_start();
  $sid = session_id();
}
$id = $_POST['id'];
$key = 'poll_'.$id;
if($id!=''){
  echo $key = 'poll'.$id;
  if(!empty($_SESSION[$key])){
    $_SESSION[$key]=$_SESSION[$key] + 1;
  }else{
    $_SESSION[$key]=1;
    setcookie($key ,$id+1,time()+3600*24);
  }
  echo '<script>alert("success");javascript:location.href="demo.php?sid='.$sid.'";</script>';
}else{
  echo '<script>alert("failed!ID Null");javascript:history.back(-1);</script>';
}
?>

除此之外,我们还可以将客户端PHPSESID存放到文件中,如:

demo.php
session_start();
$_SESSION['blogdomain']= 'http://blog.jb51.net';
$sid=session_id();
$fp=fopen("D:\tmp\websid.txt","w+");
fwrite($fp,$sid);
fclose($fp);
echo '<a href="demo2.php">demo2</a>';

demo2.php
$fp=fopen("D:\tmp\websid.txt","r");
$sid=fread($fp,1024);
fclose($fp);
session_id($sid);
session_start();
print_r($_SESSION);

当客户端禁用cookie,可以通过以下几种方式改变session对客户端cookie的依赖,使session抛开客户端cookie:

    设置php.ini中的session.use_trans_sid = 1或者编译时打开了--enable-trans-sid选项,让PHP自动跨页传递session id。当session.use_trans_sid为有效时,session.use_only_cookies一定要设置为无效0。

    手动通过URL传值、隐藏表单传递session id。

    用文件、数据库等形式保存session_id,在跨页过程中手动调用。

    改变session客户端ID保存方式:

      session.use_cookies //控制客户端保存SessionID时使用哪一种方式,当它为“1”时,就说明启动了session cookie(初始值为1)

      可以使用上面我们提到的函数来查询得到目前的session id:echo $_COOKIE["PHPSESSID"];

      但是,如果client的浏览器不支持cookie的话,即使session.use_cookies这个参数的值等于“1”,用上述的查询也只会得到null。

      php.ini中两个和该选项相关的配置参数:

        session.use_cookies = 1  //是否使用cookies(默认值为1)
        session.use_only_cookies=1  //为1时只使用cookie;为0时可使用cookie和其它方式,这时如果客户端cookie可用,则session还是默认用cookie(默认值为1)

      注意:如果客户的浏览器是支持cookie的,强烈推荐“session.use_only_cookies = 1”,当session.use_only_cookies为有效时,即使想通过URL来传递session id也会被认为无效,这样可以减少通过sessionid被攻击的可能性

      在php代码页面中设置方式:

            ini_set('session.use_cookies','1');
          ini_set('session.use_only_cookies','1');       

      

php 会话控制(禁用cookie后session为什么会失效?)的更多相关文章

  1. 会话控制:cookie和session基础学习笔记

    在多次HTTP连接间维护用户与同一用户发出的不同请求之间关联的情况称为维护一个会话(session) 我们可以简单理解为浏览器的开关. 其实对cookie和session也是主要为curd操作 coo ...

  2. 禁用cookie后session是如何设置的

    我们都知道当在session 会话有基于cookie和基于url两种传递SESSIONID的方法.为了实现客户端禁止cookie发送的情况也不影响客户登陆网站,可以设置 php.ini中 sessio ...

  3. session和cookie区别,多台WEB服务器如何共享session,禁用COOKIE后SESSION是否可用,为什么?

    答:session的运行机制: 用户A访问站点Y,如果站点Y指定了session_start();(以下假设session_start()总是存在)那么会产生一个session_id,这个sessio ...

  4. 会话技术之Cookie 和 Session

    为什么要使用会话技术 会话从字面上来说就是,就是两个人说话,也就是两个人交流,那么这里说的是计算机web端的交流,因为互联网是基于HTTP传输信息的,而http传输是无状态协议,缺少状态,意味着如果后 ...

  5. 浏览器禁用cookie后php如何保持session会话-use_trans_sid机制

    原文:浏览器禁用cookie后php如何保持session会话-use_trans_sid机制 为防止浏览器禁用cookie导致服务器会话无法保持,php开发了一个机制,该机制开启后,浏览器发起请求后 ...

  6. IE禁用Cookie后的session处理

    IE禁用Cookie后解决方案:URL重写 购物车案例<IE禁用Cookie后> 购物界面ShowBook.servlet public void doGet(HttpServletReq ...

  7. JavaWeb学习之转发和重定向、会话技术:cookie、session、验证码实例、URLConnection使用(下载网页)(4)

    1.转发和重定向 HttpServletResponse response 转发: RequestDispatcher dispatcher = request.getRequestDispatche ...

  8. JAVAWEB开发之JSP、EL、及会话技术(Cookie和Session)的使用详解

    Servlet的缺点 开发人员要十分熟悉JAVA 不利于页面调试和维护(修改,重新编译) 很难利用网页设计工具进行页面设计(HTML内容导入到servlet中,用PrintWriter的对象进行输出) ...

  9. java的会话管理:Cookie和Session

    java的会话管理:Cookie和Session 1.什么是会话 此处的是指客户端(浏览器)和服务端之间的数据传输.例如用户登录,购物车等 会话管理就是管理浏览器客户端和服务端之间会话过程产生的会话数 ...

随机推荐

  1. 【枚举Day1】20170529-2枚举算法专题练习 题目

    20170529-2枚举算法专题练习 题解: http://www.cnblogs.com/ljc20020730/p/6918360.html 青岛二中日期 序号 题目名称 输入文件名 输出文件名 ...

  2. 【bzoj2844】 albus就是要第一个出场

    http://www.lydsy.com/JudgeOnline/problem.php?id=2844 (题目链接) 题意 给出${n}$个数,它们可以异或出${n^2}$个数,将这些数从小到大排列 ...

  3. LOJ#2540 随机算法

    题意:给定图,随机一个排列,依次加点,如果加点之后不是独立集就不加.求最后得到一个最大独立集的概率. 解:就是求有多少个排列可以加出最大独立集. 显然有一个3n的状压DP,0表示没加,1表示没加上,2 ...

  4. cookie的安全性问题

    HTTP协议: (1)请求组成部分: 请求行:(get或者post请求:请求路径(不包括主机) :http1.1) 请求头:请求头是浏览器交给服务器的一些信息(比较cookie啥的) 请求体:只有po ...

  5. IAR ------ 基本使用

    1.编译结果: 6 887 bytes of readonly code memory 621 bytes of readonly data memory 331 bytes of readwrite ...

  6. C#访问和操作MYSQL数据库

    这里介绍下比较简单的方式,引用MySql.Data.dll然后添加一个MySqlHelper类来对MySql数据库进行访问和操作. 1.将MySql.Data.dll引用到你的项目中 下载地址:MyS ...

  7. bzoj千题计划203:bzoj3994: [SDOI2015]约数个数和

    http://www.lydsy.com/JudgeOnline/problem.php?id=3994 设d(x)为x的约数个数,给定N.M,求 用到的一个结论: 证明: 枚举n的约数i,枚举m的约 ...

  8. 20155339 2016-2017-2 《Java程序设计》第5周学习总结

    20155339 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 使用try.catch 使用try.catch语法,JVM会先尝试执行try区块中的代码,如 ...

  9. oracle用户密码过期!the password has expired

    Oracle提示错误消息ORA-28001: the password has expired,是由于Oracle11G的新特性所致, Oracle11G创建用户时缺省密码过期限制是180天(即6个月 ...

  10. react componentWillReceiveProps 使用注意

    componentWillReceiveProps(nextProps) 请务必使用 nextProps  不要使用 this.props 1个小时的教训...