cookie and session

来源:互联网 发布:手机淘宝如何退换货物 编辑:程序博客网 时间:2024/05/22 14:10

cookie

    Cookie 是通过HTTP标头进行设置的,所以也可以直接使用 header 方法进行设置。

header("Set-Cookie:cookie_name=value");

setcookie

  共有7个参数,常用的有5

    nameCookie名)可以通过 $_COOKIE['name'] 进行访问;

    valueCookie的值)

    expire(过期时间)Unix 时间戳格式,默认为0,表示浏览器关闭即失效;

    path(有效路径)如果路径设置为'/',则整个网站都有效;

    domain(有效域)默认整个域名都有效,如果设置了 'www.xxx.com',则只在 www 子域中有效。

setrawcookie

  serawcookie 也是设置 Cookie 的函数,跟 setcookie  基本一样,唯一的不同就是 value 值不会自动的进行 urlencode ,因此在需要的时候要手动的进行 urlencode 

删除 Cookie

    php 中没有删除 Cookie 的函数,在 PHP 中删除 cookie 也是采用 setcookie 函数来实现。

setcookie('test', '', time()-1); 

  将 cookie 的过期时间设置到当前时间之前,则该 cookie 会自动失效,也就达到了删除 cookie 的目的。之所以这么设计是因为 cookie 是通过 HTTP 的标头来传递的,客户端根据服务端返回的 et-Cookie 段来进行 cookie 的设置,如果删除 cookie 需要使用新的 Del-Cookie 来实现,则 HTTP 头就会变得复杂,实际上仅通过 Set-Cookie 就可以简单明了的实现Cookie的设置、更新与删除。

  也可以直接通过 header 来删除 cookie 

header("Set-Cookie:test=1393832059; expires=".gmdate('D, d M Y H:i:s \G\M\T', time()-1));

  这里用到了 gmdate,用来生成格林威治标准时间,以便排除时差的影响。

cookie 的有效路径

    cookie 中的路径用来控制设置的 cookie 在哪个路径下有效,默认为 '/' ,在所有路径下都有,当设定了其他路径之后,则只在设定的路径以及子路径下有效,例如:

setcookie('test', time(), 0, '/path');

  上面的设置会使 test 在 /path 以及子路径 /path/abc 下都有效,但是在根目录下就读取不到 test 的 cookie 值。

  一般情况下,大多是使用所有路径的,只有在极少数有特殊需求的时候,会设置路径,这种情况下只在指定的路径中才会传递 cookie 值,可以节省数据的传输,增强安全性以及提高性能。

  当我们了有效路径的时候,不在当前路径的时候则看不到当前 cookie。

session 与 cookie 的异同

    cookie 将数据存储在客户端,建立起用户与服务器之间的联系,通常可以解决很多问题,但是 cookie 仍然具有一些局限:

    cookie 相对不是太安全,容易被盗用导致 cookie欺骗;

  单个 cookie 的值最大只能存储 4k ;

    每次请求都要进行网络传输,占用带宽。

    session 是将用户的会话数据存储在服务端,没有大小限制,通过一个 session_id 进行用户识别, PHP 默认情况下 session id 是通过 cookie 来保存的,因此从某种程度上来说, seesion 依赖于 cookie 。但这不是绝对的, session id 也可以通过参数来实现,只要能将 session id 传递到服务端进行识别的机制都可以使用 session 

session

  在 PHP 中使用 session 非常简单,先执行 session_start 方法开启 session,然后通过全局变量 $_SESSION 进行 session 的读写。

session_start();$_SESSION['name'] ='lavender'; //在这里设置name的session值为RRecho $_SESSION['name'];

    session 会自动的对要设置的值进行 encode 与 decode ,因此 session 可以支持任意数据类型,包括数据与对象等。

session_start();$_SESSION['name'] ='lavender'; //在这里设置name的session值为RRecho $_SESSION['name'];

  默认情况下,session 是以文件形式存储在服务器上的,因此当一个页面开启了 session 之后,会独占这个 session 文件,这样会导致当前用户的其他并发访问无法执行而等待。可以采用缓存或者数据库的形式存储来解决这个问题。

删除与销毁 session

  删除某个 session 值可以使用 PHP 的 unset 函数,删除后就会从全局变量 $_SESSION 中去除,无法访问。

unset($_SESSION['name']);if (isset($_SESSION['name'])) {    echo $_SESSION['name'];}

  使用 unset 删除名为 name 的 session ,再直接输出会有 name 不存在的 Notice 。

 

  如果要删除所有的 session ,可以使用 session_destroy 函数销毁当前 session session_destroy 会删除所有数据,但是 session_id 仍然存在。

session_start();$_SESSION['name'] = 'lavender';$_SESSION['time'] = time();session_destroy();

    session_destroy 并不会立即的销毁全局变量 $_SESSION 中的值,只有当下次再访问的时候, $_SESSION 才为空,因此如果需要立即销毁 $_SESSION ,可以使用 unset 函数。

session_start();$_SESSION['name'] = 'violet';$_SESSION['time'] = time();unset($_SESSION);session_destroy();var_dump($_SESSION); //此时已为空

 

  如果需要同时销毁 cookie 中的 session_id ,通常在用户退出的时候可能会用到,则还需要显式的调用 setcookie 方法删除 session_id 的 cookie 值。

使用 session 来存储用户的登录信息

    session 可以用来存储多种类型的数据,因此具有很多的用途,常用来存储用户的登录信息,购物车数据,或者一些临时使用的暂存数据等。

  用户在登录成功以后,通常可以将用户的信息存储在 session 中,一般的会单独的将一些重要的字段单独存储,然后所有的用户信息独立存储。

$_SESSION['id'] = $row['id']; //$row后加的是数据表字段$_SESSION['email'] = $row['email'];$_SESSION['userinfo'] = $row;


  一般来说,登录信息既可以存储在 sessioin 中,也可以存储在 cookie 中,他们之间的差别在于 session 可以方便的存取多种数据类型,而 cookie 只支持字符串类型,同时对于一些安全性比较高的数据,cookie 需要进行格式化与加密存储,而 session 存储在服务端则安全性较高。

原创粉丝点击