zoukankan      html  css  js  c++  java
  • 探究php中的会话技术cookie与session

    会话: 在一次联通过程中(浏览器没有关闭),所进行的多次请求(请求了多个脚本)
    会话技术: 在浏览器不关闭的情况下, 对一个网站进行多次访问, 整个的访问过程称之为一次会话. 因为HTTP协议的无状态和无连接, 导致虽然浏览器没有关闭,但是在多个脚本之间请求的时候, 脚本之间无法实现数据的共享: 会话技术就是为了解决在浏览器进行多次请求的过程中,能够实现数据跨脚本共享.

    会话技术分类

    会话技术因为有两个不同的技术,实现的目标也不怎么一致: 整个将会话技术分为两类.

    • cookie技术: cookie是一种服务器将数据保存到浏览器, 然后浏览器能够将数据重新携带回服务器,从而实现服务器识别浏览器的多次请求的技术.
    • session技术: session是一种将数据保存在服务器端,实现跨脚本共享数据的技术. session技术依赖cookie存在.

    cookie技术

    cookie技术: 将数据保存到浏览器的技术.

    cookie技术的实现: HTTP协议中提供了一对cookie操作协议

    • set-cookie: HTTP响应, 允许服务器把数据通过HTTP协议携带给浏览器.
    • cookie: HTTP请求, 允许浏览器将服务器保存的数据携带给服务器.

    1. header设置cookie

    header函数用来修改HTTP协议的: HTTP响应
    header('set-cookie:cookie名字=值');

    // 直接设置cookie
    header('set-cookie:name=jason'); // 设置一个名字为name的cookie,值为jason

    查看浏览器保存的cookie

    验证: 会话技术cookie会失效(被浏览器清除): 关闭浏览器再重新打开

    header没有办法很好的控制cookie, header可以实现任何http协议的修改.

    2. setcookie函数

    PHP提供了一个专门设置cookie的函数: setcookie
    setcookie(名字,值);

    // 直接设置cookie
    setcookie('name','jason'); // 设置一个名字为name的cookie,值为jason

    3. 获取cookie

    浏览器能够在访问同一个网站的时候,会自动将以前的cookie数据携带给服务器.

    Apache不能获取cookie数据, 只能PHP来做.
    PHP会将所有的cookie数据(浏览器携带的)保存到超全局预定义数组中: $_COOKIE

    // $_COOKIE自动接收
    var_dump($_COOKIE);

    4. cookie生命周期

    生命周期: cookie会在什么时间内失效(失效的cookie才会被浏览器清除)
    默认的: cookie的生命周期是会话技术(浏览器关闭)

    setcookie函数的第三个参数: 就是用来设置cookie的生命周期: 没有给定第三个参数, 是因为第三个参数有默认值: 0, 就代表会话技术(浏览器关闭)
    第三个参数是时间戳: 生命长度

    // 设置cookie(默认生命周期)
    setcookie('cookie','cookie');
    
    // 显示的指定生命周期为会话结束
    setcookie('default','default',0);
    
    // 指定生命周期:10秒之后就过期
    setcookie('ten',10,10);
    // 错误: 代表早在1970年1月1日,0点0分10秒过期
    
    // 合理10秒
    setcookie('active_ten',10,time() + 10);
    
    var_dump($_COOKIE);
    /*输出结果证明: 10秒的cookie已经过期: 获取一次
    array (size=4)
      'name' => string 'jason' (length=5)
      'cookie' => string 'cookie' (length=6)
      'default' => string 'default' (length=7)
      'active_ten' => string '10' (length=2)*/

    5. cookie作用范围

    cookie作用域: 默认的, cookie只针对自己所在目录及其子目录生效, 上级目录不能访问.

    通常的解决方案是: cookie整站有效: 网站根目录: setcookie的第四个参数.

    // 设置一个简单cookie:当前目录有效
    setcookie('local','local',0);
    
    // 设置全局cookie:整站有效
    setcookie('global','global',0,'/');

    6. cookie跨域

    cookie对不同的主机名可以共享, 但是默认的不支持.

    域名: Domain Name, IP地址的别名
    顶级域名: .com / .cn / .net / .org
    一级域名: 在顶级域名的左边,增加一个字段: baidu.com / itcast.cn /apache.org / php.net
    二级域名: 在一级域名又增加一个字段: www.itcast.cn / gz.itcast.cn / bj.itcast.cn

    cookie跨域: cookie可以在不同的二级域名下共享数据. 通过setcookie的第五个参数来实现.指定方式是共享的一级域名

    // cookie跨域
    setcookie('wwwglobal','global',0,'/','shop.com');
    // 表示只要是以shop.com结尾的主机都可以共享当前数据

    7. cookie特性

    cookie特性主要是从$_COOKIE中处理

    • cookie设置是通过setcookie函数实现: 没有办法存储数组: setcookie不论名字还是值都只能是普通数据(字符串数据)
    • $_COOKIE永远是一维数组: 但是可以想办法让$_COOKIE变成二维数组(不是手动修改)
    • 在服务器端(PHP)不要修改$_COOKIE里面的内容: 修改无效

    session技术

    session技术: 将数据保存在服务器端,实现跨脚本共享数据.
    session技术依赖cookie实现.

    session默认的将数据保存到文件中: 文件不会随着脚本执行的结束而删除, 就可以实现将数据放到文件中, 下一个脚本又从文件中读取数据.

     

    session文件的保存位置: 默认没有指定,就是操作系统的临时目录(C:/windows/temp)

    1. session原理

    session在PHP中有一套内部机制, 只需要用户(程序员)去简单的触发即可.

    2. 实现session

    session要使用: 基本上使用手动模式

    (1)激活session系统: 开启session: session机制对外提供了一个操作接口: 函数session_start()

    // 开启session
    session_start();

    开启session后,系统不管用户存不存东西,都会给一把"钥匙"

    (2)存储数据: 系统提供了一个专门存储数据的容器,只要用户将数据保存到对应的容器中,系统就会自动的将容器内部的内容,保存到session文件中. $_SESSION

    // 将数据存放到容器中
    $_SESSION['name'] = 'jason';

    注意: session序列化是选择性序列化: 不会对$_sESSION中的下标序列化,只对值进行序列化

    (3)使用session数据: 跨脚本: 在一个新的脚本中,拿着”钥匙”开锁后就可以取出里面的内容.

    // 访问$_SESSION
    var_dump($_SESSION);
    /*输出结果
    array (size=1)
      'name' => string 'jason' (length=5)*/

    注意: 即便只是访问$_SESSION,系统提示session文件被修改

    3. session实现具体原理

    session机制内部有很多功能, 内部自己协调.

    开启session: session_start()

    1. 激活session: session机制开始工作
    2. 获取sessionID: PHPSESSID
      • 第一次: 系统自动生成,而且会将sessionID保存到cookie
      • 第二次: 从cookie中获取sessionID
    3. 初始化变量$_SESSION: 空数组
    4. 系统会拿着sessionID取到session文件夹寻找对应的session文件(没有就创建一个)
    5. 将session文件中保存的数据进行反序列化保存到$_SESSION中
    6. session系统会设定一个监听程序: 监听脚本执行结束

    使用session: $_SESSION

    脚本执行结束: session机制监听到脚本要结束了: 将$_SESSION中的数据进行序列化,然后写入到sessionID对应的session文件.

    证明: session在开启之后, 一个脚本中一定会对session文件操作两次

    4. 删除session

    删除session指的是删除session对应的文件.

    session_destroy(): 删除当前sessionID对应的session(凡是要操作session需要先开启session)

    // 开启session
    session_start();
    
    // 删除session
    session_destroy();

    5. session常用配置

    session的表现特性都是由php.ini中进行配置实现的(大部分都是用默认配置)

    (1)session默认是必须使用cookie实现

    (2)session名字: cookie对应的sessionID名字叫做: PHPSESSID

    (3)session默认是需要手动开启, 自动session关闭掉了

    使用自动session: 不需要手动开启session(session_start()不用了)

    因为不是所有的地方都需要使用session: session会产生session文件占用服务器的磁盘空间(从来不用自动session)

    (4)session的生命周期其实受cookie的影响: 默认的cookie的生命周期是会话结束

    (5)session对应的ID(cookie)的作用范围都是网站根目录

    (6)session数据的序列化方式使用PHP的序列化实现.

    (7)session垃圾回收机制: 一旦触发垃圾回收,系统会自动一次性清理所有的过期的session

    (8)session有自己的生命周期: 1440秒

    (9)session可以通过配置实现将sessionid信息绑定到URL(a标签中)

     

    6. session特点

    session是利用$_SESSION来进行数据保存.
    $_SESSION中不允许使用索引下标 

  • 相关阅读:
    appium自动化测试搭建
    How to install Qt Creator on Ubuntu 18.04
    Luci
    OpenWrt 根文件系统启动过程分析
    shell 杂烩
    OpenWrt Luci 调试日志输出的一种方法
    jQuery实现购物车计算价格的方法
    js实现购物车添加,减少数量
    golang-键盘录入数据
    JAVA存储机制(栈、堆、方法区详解)
  • 原文地址:https://www.cnblogs.com/chenjiacheng/p/6522327.html
Copyright © 2011-2022 走看看