COOKIE/SESSION 详解

  cookie 和 session 是web应用中的会话技术,何为会话技术呢? 说白了就是服务器识别用户跟踪用户的一个功能一个模块,开发中非常重要哦。

  我们都知道web是基于HTTP协议实现请求与响应的,关于HTTP网上一搜一箩筐,无非就是客户端和服务器之间协定的一种交互格式。但其有一个不理想的特点就是无状态性,也就是每次请求都是独立的,服务器不知道你是谁想做什么或者说不让你做什么(哪怕你用同一个浏览器)。这时会话控制就派上了用场,这样在访问服务器时由服务器设置一些信息在终端,之后每次请求都会携带这些信息,进而实现跟踪用户在整个网站的活动,也就实现了数据在多次请求周期的共享。

  cookie介绍

  cookie英文意思是小甜点 我的理解是服务器送给终端的礼物,由终端保存。在终端访问服务器时 由服务器向终端分配一些临时数据,在这些数据有效期内访问服务器 都将携带这些数据,由服务器获取识别 进而做出相应的回应。

  cookie的数据特点

  单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

  数据类型单一 只能是字符串(不过可以考虑序列化数据),数据存储在客户端每次访问要携带所以 会占用一定的带宽,也不是很安全(不要存储重要的数据)。

  cookie的使用

  setcookie(name, value, expire, path, domain, secure, httponly);

    name: 保存的变量名

    value: 保存的数据

    expire:过期时间 以秒为单位,默认0 浏览器关闭即失效

    path:数据有效路径 默认当前路径,向下兼容。、

    domain:有效域名 在什么域名下有效。如果使用二级域名的话使用 .domain.com

    secure:是否安全传输 默认否 (https:)为安全传输

    httponly:是否只用于http传输使用,默认否(终端脚本可以获取数据)。

    一般情况下只是如下用法

    setcookie('name', 'tom'); //设置

    $_COOKIE['name];     //获取 使用超全局变量

    setcookie('name', '', time()-1); 或 setcookie('name',''); //删除

    cookie的使用场景

    比如说 一周内免登录,未登录下的我的足迹,浏览历史等。

 

  session介绍

  我们在介绍cookie中说过cookie的特点 存储在终端 容量小 占带宽 不安全等特点,当然也有其优点 如存储一些不重要的数据做一些配合动作也是很实用的,再加上加密和序列化行为那也是十分强大的。有了对比再说session 理解起来就好多了,

  session的数据是存储在服务器端的,是不是有个疑惑 数据存在服务器那怎么跟踪用户 这不白闹吗?其实使用session还是离不开cookie的(有一种基于url的实现方式后面讲到),

  session的工作原理是这样的 在服务器开启session后 终端请求服务器之初就会自动生成一个session_id 的数据保存在终端用于唯一的指向服务器session、数据区的某个会话数据,看清楚哦是唯一的指向。这样就好比 你去一家超市 店员给你办了张会员卡,卡上有唯一的编码 而你的姓名 年龄 喜好 会员级别等数据都存储在超市的电脑里,这样实现用户识别了。由于session是服务器技术 于是乎就有了很大的战略纵深(个性化设置),

 

  session的使用

  session可操作的数据类型很丰富,4种标量2种复合类型都可以。

  session_start();  //开启session 不能重复开启可以用@错误过滤

  $_SESSION['name'] = 'tom'; //设置session

  $_SESSION['name'];   //获取

  unset($_SESSION['name']); //删除单个数据

  $_SESSION = NULL; 或 session_unset();  //删除全部session数据

  session_distroy();  //清空物理数据文件 

  setcookie(session_name(), '', time()-1); //删除cookie中存储的session_id  

  温习两个函数  1.session_name()-设置获取session_id 的键 (SESSID)  

          2.session_id()-设置获取session_id 的值

    

  基于url的session的实现

  我们知道cookie是客户端功能 当然客户可以自由的开启和关闭,那么引出一个问题,客户端关闭cookie、后session是不是就失效了,答案是肯定的。那该如何实现用户跟踪呢,我们可以为session正常的使用设立第二道防线,那就是利用url、在各个脚本间传递session_id的值。具体实现如下。

  1.使用两个函数 session_name()获取当前会话的名称、session_id()获取和设置当前会话的ID 拼接为请求字符串连接在各个url连接后面。

    如:http://www.baidu.com/index.php?sname=sid

  2.在其他页面接收这个sid 注册为当前session_id  

    如:if ( isset( $_GET[session_name()] ) ){

        session_id( $_GET[session_name());    //注册为当前的session_id

      }

      session_start(); //不要忘记注册session_id后开启session 开启已有会话 否侧创建新会话

    

 

  按照这样操作是不是感觉太繁琐 哪个页面页至少也有几十上百个链接吧,难免会有疏忽。值得高兴的是php已经为我们提供了更为简单的方式,不过原理还是那个原理。具体实现如下、

    1.设置配置项

    开启session_use_trans_sid = 1 //开启自动追加session_id

    关闭session.use_only_cookies = 0  //关闭仅使用cookie项

    后系统会在cookie关闭之后自动的为每个链接加上session_id 数据(链接上会有显示)。

    2.依然需要在其它页面进行判断接收这个session_id 进行注册。(语法如上不变).

     

  session属性

  session是基于cookie实现的,session-id 存储在cookie中,所以 这个session-id的属性决定了session的属性。

  配置项中有对应设置  

    session.cookie_life = 0;     //有效期(默认浏览器关闭)

    session.cookie_path = '/';  //默认跟路径

    session.cookie_domain = ; //有效域名

    session.cookie_secure = ; //是否安全传输 HTTPS

    session.cookie_httponly = ; //是否只http传输

  推荐使用  session_set_cookie_params(expire, path, domain, secure, httponly); 来设置这些属性

  以上是对于终端session_id属性的设置 接下来看看服务器端配置

  session_save_path   //session数据存储路径

  session_name = PHPSESSID; //保存在cookie中sessionid的键

  session_start = 0; //是否自动开启session

  session_use_trans_sid ;//是否开启自动传递SID 功能

  session_use_only_cookie = 1; //是否只依赖cookie传递SID

     

  session.gc_maxlifetime = 1440;  //session数据及文件生存周期 24分钟后视为垃圾

  session.gc_probability = 1;  

  session.gc_dirisor = 100;     

  //以上两个配置组合成了session的垃圾回收机制回收的概率,默认100次请求触发1次垃圾回收。session垃圾回收机制是惰性删除 过期之后不会马上删除而是等待回收概率的触发。

  session_save_handler = files; // session默认的保存介质 文件

       

  会话的基本使用已经介绍完毕如果有错误还请提出 在此表示感谢!!!

 

posted @ 2017-03-31 21:48  #1314#  阅读(2430)  评论(0编辑  收藏  举报