PHP基础知识6——COOKIE和SESSION

本文介绍了HTTP协议的无状态特性及其对用户登录状态保持的影响。详细讲解了Cookie和Session的区别,Cookie作为浏览器端的数据存储,而Session是服务器端的数据容器。通过示例展示了PHP如何操作Cookie和Session,包括查看、设置与应用。最后阐述了Cookie和Session在登录状态保持中的应用,以及它们在实现会话管理中的关键作用。
摘要由CSDN通过智能技术生成

HTTP协议特点:

无状态的, 多次请求之间没有相关性

即同一用户请求同一网站的不同页面,服务器无法识别是否是同一用户发起的请求。因此,用户无法进行连续的业务逻辑。

如:登录,已在A页面登录,请求B页面,提示未登录。

cookie 和 session 区分:

  • cookie: 在浏览器端的 存储数据的 容器

  • session 在服务器端的 存储数据的 容器

1. cookie

  • 在浏览器端的 存储数据的 容器

  • 可以使用js对cookie进行操作

  • cookie 允许服务器脚本(PHP脚本)在浏览器端存储数据

  • cookie特点:在cookie中数据设置后,浏览器再次请求服务器指定页面时,会自动携带cookie中的数据到服务器,在服务器中可以获取cookie中的数据;

浏览器查看cookie数据

js操作cookie(了解)

// 设置cookie
document.cookie = 'name=zs'; 
document.cookie = 'pwd=123';   

// 获取cookie中的值
document.cookie;

jquery.cookie.js插件 操作cookie

//向页面中引入插件js文件,基于jquery的 
$.cookie('weight',100,{expires:7});//设置   expires 过期时间
$.cookie('name');//获取
$.removeCookie('name');//删除	

$.cookie(键,值,{expires:过期天数})
$.cookie(键) //获取 

PHP操作cookie(服务器端操作cookie)

	//设置cookie
	setcookie('名称','值'); 
	setcookie('名称','值','有效期');
	//删除cookie  将过期时间设置为之前的时间即可
	setcookie('名称','',time()-1000); 
	//获取cookie  
	//$_COOKIE是PHP的超全局变量,内部存放有浏览器传过来的cookie数据,$_COOKIE只能用于获取数据
	$_COOKIE['名称'];

注意点:

  • cookie中的数据 可以被同一个网站的页面所共享

  • 不同浏览器的cookie 不能共享

  • cookie的数据存储在浏览器中,每次请求服务器,在请求报文中携带cookie的数据,发送给服务器

  • 服务器端无法直接操作cookie,是通过在服务器端设置响应头的的方式,通知浏览器对cookie进行设置

  • cookie中的数据有效期,不设置是会话级别的, 浏览器关闭,会话结束,数据销毁

  • cookie存储容量小,约4kb

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>

  <script>
    // cookie: 浏览器端的存储空间
    // 通过原生来操作 cookie   (了解)

    // 1. 设置, 要求 键值对, 通过 = 分隔
    // document.cookie = "name=pengpeng";
    // document.cookie = "age=18";
    // document.cookie = "desc=shuai";
    // 2. 获取, document.cookie 一次性将所有的 cookie 都获取, 以字符串的形式返回
    //    通过 "; " 分隔, name=pengpeng; age=18; desc=shuai
    // console.log( document.cookie );

    // 通过 js 获取很麻烦 (练习原生)
    // 作用: 从 document.cookie 中取出想要的 cookie 值
    //       name=pengpeng; age=18; desc=shuai
    // 需求: 传递 age, 返回 18, 传递 desc, 返回 shuai
    function getValue( key ) { 
      var str = document.cookie;  // name=pengpeng; age=18; desc=shuai
      var arr = str.split("; "); //  ["name=pengpeng", "age=18", "desc=shuai"]

      for ( var i = 0; i < arr.length; i++ ) {
        var k = arr[i].split("=")[0];  // name
        var v = arr[i].split("=")[1];  // pengpeng

        if ( key === k ) {  // 遍历, 如果传进来的 key 和 遍历时的 键 相等, 将值返回
          return v;
        }
      }
    }
    console.log( getValue( "age" ) ); 
  </script> 
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>

  <script src="./jquery-1.12.2.js"></script>
  <script src="./jquery.cookie.js"></script>
  <script>
    
    // cookie 可以多个页面共享
    // 通过 插件, jquery.cookie.js 可以辅助我们操作 cookie

    // 1. 设置 cookie:  $.cookie(key, value)
    $.cookie( "name", "dapp" );
    $.cookie("age", 18);

    // 2. 获取:  $.cookie(key)
    console.log( $.cookie( "name" ) ); 

    // 3. 删除: $.removeCookie( key )
    $.removeCookie( "age" );

    // 4. 过期时间, 如果不设置过期时间, 默认 cookie 是会话级别的, 关闭浏览器, 就会被销毁
    $.cookie( key, value, { expires: 过期天数 } );
    $.cookie( "name", "pengpeng" );
    $.cookie( "name", "pengpeng", { expires: 7 });
 
  </script>
</body>
</html>
<?php
  // 注意: 空格, 等号, 分号, 存储的cookie值中不要出现以上特殊字符

  // 1. 设置cookie
  setcookie(key, value);
  setcookie( "desc", "hello_kitty" );

  // 2. 获取
  // $_COOKIE 超全局变量, 可以用于获取所有的 cookie 信息
  // 返回一个关联数组
  echo '<pre>';
  print_r( $_COOKIE );
  echo '</pre>';
  echo $_COOKIE['desc'];

  // 3. 设置cookie过期时间
  // setcookie( key, value, 时间戳(什么时候到期, 以1970年开始的秒数) )
  setcookie( "name", "pengpeng", time() + 7*24*3600 );

  // 4. 如果设置 cookie 为过去的时间, 就会删除, 销毁该 cookie
  setcookie( "name", "ppp", time() - 1 );


  // setcookie( "name", "pp" );

  // 浏览器在每次请求时, 都会将cookie中的数据进行携带
  echo '<pre>';
  print_r( $_COOKIE );
  echo '</pre>';

  // 服务器不能直接操作cookie, 但是可以设置响应头
  // 在响应头, Set-Cookie: name=ppp
  // 将来浏览器端, 接收到请求, 查看响应头, 并根据 set-cookie 在浏览器端自动设置 cookie
  // setcookie( "name", "ppp" );


// 思考题:
// 1. cookie 的存储容量   4k

// 2. 同一个网站中可不可以共享 cookie  可以

// 3. cookie 是浏览器中 存储数据的 容器, 为什么服务器可以获取 cookie 中的数据 ?
//    因为 cookie 在请求时, 会将 cookie 中的数据, 携带在请求头中
//    服务器就可以读取请求头的内容, 从而间接的获取到 cookie 中的数据

// 4. cookie 是浏览器中 存储数据的 容器, 为什么服务器可以设置 cookie 中的数据 ?
//    setcookie 设置的是响应头, set-cookie: name=pp
//    将来通知浏览器进行设置 cookie
?>

2. session

  • 在服务器端存储数据的容器

  • session容器是一个数组的形式,通过超全局变量$_SESSION 进行取值和设置

  • session在使用前,必须先 session_start 开启session 机制

  • session中的数据可以被当前网站所共享

session的基本操作

开启session机制(使用session前必须调用此方法)

session_start(); //开启session会话或者重用已经创建的会话。

注意点:

  1. 会在服务器中自动对每个第一次访问的用户, 随机生成一个sessionID

  2. 再根据 sessionID, 自动创建一个session会话文件,我们可以在其中存储该用户的数据

  3. 响应时, 在响应头中设置set-cookie, 存放该用户的sessionID

  4. 将来浏览器端根据响应头, 将sessionId 存到 cookie 中, 并在下一次请求时携带

下次访问时, 服务器端就会根据 sessionId 找到该用户的会话文件, 我们可以从session中读取用户信息, 实现会话保持

设置和获取session中的数据(通过超全局变量$_SESSION进行操作):

//设置
$_SESSION['键']='值'; 
//删除
unset($_SESSION['键']); 
//清空session
$_SESSION=[]; 
//直接删除session会话文件,PHP脚本将无法读取session数据
session_destroy();
 //获取session的id
session_id();
<?php

  // 1. session 服务器端存储数据的容器
  // 2. session 可以在服务器端多个页面进行共享

  // $_SESSION 超全局变量, 是一个关联数组
  // 通过 $_SESSION 可以获取当前请求用户的 session 数据
  // 每个用户都有自己的 session 空间


  // 开启 session 机制
  session_start();

  // echo '<pre>';
  // print_r( $_SESSION );
  // echo '</pre>';

  // // 1. 存储
  $_SESSION['name'] = 123;
  $_SESSION['age'] = 18;

  // // 2. 修改
  $_SESSION['name'] = 456;

  // // 3. 获取
  echo $_SESSION['name'];

  // // 4. 删除
  unset($_SESSION['age']);

  echo '<pre>';
  print_r( $_SESSION );
  echo '</pre>';
?>
<?php
  // 清空用户的登录状态, 让用户是第一次访问
  // 1. 清空 cookie
  // 2. 删除服务器端的 session 文件
  // session_start();

  // 开始了 session 机制后
  // 1. 如果当前用户, 是第一次访问该服务器, 会自动生成一个sessionid (随机字符串)
  // echo session_id();

  // 2. 根据这个生成的 sessionid, 服务器就会为该用户开启一块session存储空间
  //    新建一个 session文件, 这个session文件的文件名就是 sessionid, 可以用来存数据
  // $_SESSION['name'] = 'pengpeng';

  // 3. 将 sessionid 传递回浏览器端, 
  //    通过设置响应头: Set-Cookie: PHPSESSID=e54nnd2r7ohgulbm7moq5pb736;
  //    将来将 sessionid 设置 在 cookie 中

  // 4. 浏览器端解析响应头, 设置 sessionId 到 cookie 中

  // 5. 第二次访问, cookie 里面存储的数据, 会在请求时携带, 把 sessionId 携带着了

  // 6. 后面服务器端根据 sessionId 就可以找到对应的 session 文件, 认识该用户了

?>

3. COOKE 和SESSION的应用--登录状态保持

登录模块的基本思路:

  1. 如果用户登录成功,在服务器中记录用户的登录状态

    • session_start(), 对于第一次访问的用户, 会自动生成 sessionId, 并创建session文件,

    • 我们需要在session文件中,记录当前用户的信息

    • 通过响应头,给浏览器的cookie设置sessionID

  2. 后续访问其他页面(个人中心),浏览器会自动发送cookie中存放的sessionID到服务器

  3. 服务器会浏览器传递根据sessionID,找到对应的session文件,查看其中是否存放有当前用户的信息

    • 是: 用户已登录 ,正常浏览

    1. 否:用户未登录,跳转到登录页

if($name=='zs'&&$pwd=='666'){  
  // 登录成功, 将该用户唯一标识存到 session 中
  // 该用户数据库中 id 为 1
  $id = 1;
  session_start();
  $_SESSION['userid']=$id;
}
session_start();
if(!empty($_SESSION['userid'])){
  //正常浏览
}else{
  header('location:./04-login.html');
  die();//后面代码不执行
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值