会话控制cookie和session

本文内容说明:
1.说明会话技术存在原因: HTTP协议的误状态
2.会话技术实现方式:
2.1 get实现: 信息不安全,参数易丢失
2.2 Cookie存客户浏览器,虽然不占服务器资源,但是重要信息不建议存浏览器,而且客户可以禁用浏览器cookie
2.3 session存服务器,基于cookie实现,讲了php.ini的session配置

1.为什么要使用会话控制技术?
web是通过http协议来实现的, 而http协议是无状态的协议
http没有一个内建机制来维护两个事物之间的状态。所以同一个用户在请求相同的页面两次的时候,http不会认为两次请求都来自于同一个用户,会把它当成是两次请求的独立
所以如果一个用户做个登录,http协议不会理解为已经做过登录,因为他没有办法保持用户之前的登录状态,所以没有办法保持用户在不用页面的跟踪和状态的保持,而对于我们的会话控制技术来说就是为了解决这样的问题

2.会话控制技术的实现方式
2.1 通过GET参数来传递

信息不安全暴露在地址栏 信息参数易丢失 不建议使用

2.2  Cookie
       cookie是存储在浏览器里的一个文件,文件里面包含客户端片段的信息

     cookie的操作包括:
      //写操作
      setcookie($name,  $value,  $expire,  $path,  $domain,  $secure);  
      //$name 键名 $value 值 $expire 过期时间  $path 路径 $domain 域名 $secure  是否安全

      //读操作
      $_COOKIE  

      //可以数组形式存储
      setcookie('a[b]',   'val');

      //删除cookie的处理
      setcookie($name,  '',  time()-1000);   //让cookie过期

cookie 的优点,存在客户端的不会占用服务器资源,缺点,也是存储在客户端所以一些重要信息不建议用 cookie
而且用户可以有权禁用cookie

2.3 Session 存储在服务器中 session是基于cookie的
用cookie来存储sessionid 如果cookie被禁用,可以通过url来传 session存储在服务中的一个session文件

        session的操作:
        session_start();   
        $_SESSION;   
        $_SESSION = [];     //销毁一个session
        session_destroy();   //会删除session文件   及文件对应的 cookie也删除

session的配置: php.ini中的配置

session.save_path="/data/tmp/session";
//用文件做介质,session存储路径;用memcache做介质时用作服务器连接串:
session.save_path =“tcp://127.0.0.1:11211”
//有一种设置是"N;/path",这是随机分级存储,这个样的话,垃圾回收将不起作用,需要自己写脚本

session.save_handler = “files”;
//可选files,memcache,user。如果想要自定义处理器来存取session数据,比如database, redis就用"user"
session.name = “PHP_SESSION”
//当做cookie name来使用的session标识名
session.cookie_domain = “a.com” //cookie有效作用域名
session.use_cookies = 1 //是否使用cookies在客户端保存会话sessionid 默认为采用cookies
session.auto_start = 0
//是否自动启用session,默认不启用。在使用session功能时,在每个php脚本头部都会通过session_start()函数来启动session
session.cookie_lifetime = 0
//传递sessionid的cookie有效期(秒), 0表示仅在浏览器打开期间有效
session.gc_probability = 1
session.gc_divisor = 1000
//概率是 session.gc_probabilty/session.gc_divisor结果1/1000,
//不建议设置过小,因为session的垃圾回收,是需要检查每个文件是否过期的 session.gc_maxlifetime = 1440 //过期时间默认24分钟
//设定保存的session文件生存期,超过此参数设定秒数后,保存的数据将被视为’垃圾’并由垃圾回收程序清理。判断标准是最后访问数据的时间(对于FAT文件系统是最后刷新数据的时间)。如果多个脚本共享同一个session.save_path目录但session.gc_maxlifetime不同,将以所有session.gc_maxlifetime指令中的最小值为准。

//如果在session.save_path选项中设定使用子目录来存储session数据文件,垃圾回收程序不会自动启动,必须使用自己编写的shell脚本、cron项或者其他办法来执行垃圾搜集。如:cd /path/to/sessions; find -cmin +24 | xargs rm

session.use_trans_sid session值跨脚本(跨页面)传递
基础说明: session会话中传递SESSIONID有两种方式, 1基于cookie传递(常用方式) 2基于URL传递
如果用户的客户端(浏览器)禁止了cookie,那么基于cookie的传递就不能成功,跨页面就无法传递session值了,这个时候可以通过php.ini中设置session.use_trans_sid=1
达到跨页面传递的效果,具体情况看下面的实例
@假设客户端已经禁用了cookie传值,并且php.ini中设置session.use_trans_sid=1(或者php代码中设置set_ini(session.use_trans_sid=1)

     页面a.php代码
     <?php
     session_start();
     $_SESSION['name'] = "LIUWEMBIN";
     $url = "<a  href='b.php'>下一页</a>";  echo  $url;
     页面b.php代码
     <?php
     session_start();
     echo $_SESSION['name'];

     @假设客户端已经禁止了cookie传值,并且php.ini中设置session.use_trans_sid=0(或者php代码中设置set_ini(session.use_trans_sid=0))
       页面a.php代码
       <?php
       session_start();
       $_SESSION['name'] = "LIUWEMBIN";
       $sessionid = session_id();
       $url = "<a  href='b.php?session=$sessid'>下 一页</a>";
       echo  $url;
       页面b.php代码
       <?php
       session_id($_GET['sessid']);
       session_start();
       echo $_SESSION['name'];

      上面两种情况总结:
       1. a.php页面中必须要有<a  href='b.php'>下一页</a>和<a  href='b.php?sessid=$sessid'>下一页</a>这样的超链接,通过超链传递SESSIONID给b.php,如果是直接访问在浏览器中访问的b.php就只有cookie传值才能成功,所以此方法就必须通过URL传递
       2.如果设置session.use_trans_sid=1,即使在a.php页面中的<a  href='b.php'>这个链接中不添加"?sessid=$sessid"  php会自动添加的,而且在b.php中不需要session_id($_GET['sessid']);  php也会自动获取到SESSIONID,但是如果session.use_trans_sid=0那么"?sessid=$sessid"和session_id($_GET['sessid']);是必须出现在应该出现的位置,不然无法跨页面获取sessin取得

      补充:
      session.use_trans_sid=1,表示当客户端浏览器禁止cookie的时候,页面上的链接会基于url传递SESSIONID。但是很多人仅仅设置了这个选项并没有达到效果,后来发现php.ini中还有两个选项
      session.use_cookies=1
      session.use_only_cookies=1

      session.use_cookies表示是否开始基于cookies的session会话
      session.use_only_cookies 表示是否开启基于cookies 的session的会话方式
      就是说如果session.use_trans_sid=1并且客户端浏览器禁止cookie的时候,达不到效果,就要注意session.use_only_cookies的值是否为0
  1. session的垃圾回收机制

session.gc_probability = 1
session.gc_divisor = 1000
//概率是 session.gc_probabilty/session.gc_divisor结果1/1000,
//不建议设置过小,因为session的垃圾回收,是需要检查每个文件是否过期的

  session.gc_maxlifetime = 1440  //过期时间默认24分钟

  表示每1000次调用session_start会有1次去清除文件   当前时间戳-文件最后修改时间戳>1440秒  则文件过期了,进行清理
    gc_divisor不建议配置的太小,太消耗服务器资源,降低效率

 session的优点:  信息比较安全   缺点占用服务资源

4.4.sessionid的问题
正常< a href=“1.php”>下个页面 我们通过cookie在1.php中拿到sessionid

 4.1  cookie被禁用  没发传递sessionid
  可以通过session_name()  和session_id()  这两个函数进行传递
  //sessid的值就是session文件名称  默认是sess_sessionid的值
  <a  href="1.php?PHPSESSID=sessid的值">下个页面</a>    
  //sessid的值比较长
  <a  href="1.php?<?php echo session_name().'='.session_id() ?>">下个页面</a>    
  //上面写法还是很长
  <a  href="1.php?<?php echo SID;?>">下个页面</a>

  SID是php的一个常量   session_name().'='.session_id() 
  SID特性:如果开启了cookie SID为空   如果没有开启cookie   则SID才是上面字符串的拼接
  所以sid还是比较智能的也建议使用

5.session的存储
多台web服务器session存储在其中一台中, 如果存储在文件则不合适会找不到
因此建议存储到内存中 使用session_set_save_handler(); 可以存到MYSQL Memcache redis中

session信息的存储方式,如何进行遍历
可以文件也可以数据库等 通过session_set_save_handler 遍历直接$_SESSION就可以了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值