当前位置:首页 > 网站技术 > 后端技术 > 正文内容

PHP入门基础之会话控制基础和实战

binadmin2020-07-15后端技术46

1、会话控制基础

1.png

会话是具有逻辑关联的多个简单交互的集合

简单交互模型

逻辑关联

http是无状态协议

每个请求都是单独处理的,协议无法识别当前用户。

有状态vs无状态  (跟朋友吃饭【不用二次介绍】 vs 去银行办理业务【每次都要个人信息验证】)



2、会话控制的内容

控制会话的开始与结束

识别并处理会话内的请求

更新会话的状态



3、会话控制的方式

使用cookie实现会话控制

    保存在客户端(浏览器)

    用于存储用户关键信息

    通过HTTP请求/响应头传输

使用session实现会话控制

    保存在服务端

    用于存储用户相关信息

    通过保存在客户端的session ID 来定位session内容

使用其他方案实现会话控制    

    json web token

    Authorized token

    Access token + Secret token



4、基于cookie的会话控制

    cookie能做什么

    标记用户

    标记客户端

    存储简单信息


cookie的工作原理

    在http响应中设置cookie

    在cookie的有效期内,每次请求都会携带cookie的值

    服务器识别并处理cookie的内容

    

设置setcookie

setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" 
[, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] ) : bool


cookie的生命周期

    在http响应中设置cookie

      通过set-cookie指令设置cookie

      可以设置cookie的内容、有效期、有效路径等内容

    在HTTP请求中携带cookie

      只可访问域名相同,路径匹配并在有效期内的cookie

      通过cookie指令发送具有访问权限的cookie值

      多个cookie的值用分号;隔开   

    cookie失效

      cookie过期

      用户手动删除cookie

      服务器清除cookie的有效性


5、基于session的会话控制

    session能做什么 

    标记用户--同cookie

    标记客户端--同cookie

    存储信息--比cookie更强大


session的工作原理

    在HTTP响应中设置cookie,并在临时文件中保存session值

    通过客户端请求中的cookie定位到对应的session文件

    读取并处理session的内容


session的生命周期

    启用并设置session

        在HTTP响应中设置客户端的唯一cookie

        将对应的session内容写入临时文件

    读取并处理session

        客户端在HTTP请求中携带cookie的值

        服务端通过cookie值定位到session文件

        读取并处理session内容

       2.jpg

    session 失效/清除

        cookie过期(关闭浏览器)

        用户手动删除cookie

        服务端删除session文件或清空session内容


session的使用

    session的配置--php.ini

    3.jpg


    如果不使用cookie的session时 

      session.use_only_cookies = 0

    就可以用url传递session的参数


    启用session

      bool session_start([array $options = array()]);

    设置/修改内容

      

      $session = array(

          'user' => 'admin',

          'active' => 1

      );


      $_SESSION['admin]= $session;

      $_SESSION['test']='test';


    获取/设置session NAME

    string session_name([string $name]);


    获取/设置session ID

    string session_id([string $id]);


    获取/设置 session 文件的保存路径

    string session_save_path([string $path]);


    设置session中的cookie参数

    bool session_set_cookie_params(int $lifetime[,

    string $path[, string $domain [, bool $secure =FLASE [, bool $httponly = FALSE]]]]);


    清空session的内容

    1.清空session数据:bool session_unset( void );

    2.赋空值(session文件还在)

    3.删除session文件:bool session_destroy( void )



6、cookie与session的比较


    相同点

    是HTTP协议的一个补充机制,可以实现会话控制

    可以标记用户、客户端,可以存储数据


    存储方式不同

    cookie将数据存储在客户端(浏览器)

    session将数据存储在服务端(PHP临时目录)

    

    工作方式不同

    cookie利用HTTP协议直接传输会话数据

    session利用session ID 来定位会话数据


    存储方式不同

    cookie可以存储简单数据,比如字符串

    session可以存储复杂数据,比如数组、对象



7、会话控制实战


    利用session + cookie 实现 用户登录与退出


login.php---登录页面

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.0/dist/css/bootstrap.min.css" 
    integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
</head>
<body>
<div>
    <div class="card col-12 mt-5 ">
        <div>
            <h1 class="col-12 mt-4 d-flex justify-content-center">用户登录</h1>
            <div class="col-12 mt-4 d-flex justify-content-center">
                <form method='post' action="action.php">
                <input type="hidden" name="action" value="login">
                    <div>
                        <label for="username">用户名</label>
                        <input type="text" id="username" name="username" placeholder="请输入用户名">
                    </div>
                    <div>
                        <label for="password">密码</label>
                        <input type="password" id="password" name="password" placeholder="请输入密码">
                    </div>
                    <div class="form-group form-check">
                        <input type="checkbox" id="remember" name="remember">
                        <label for="remember">在这台电脑上记住我的登录状态 </label>
                    </div> 
                    <button type="submit" class="btn btn-primary">提交</button>
                </form>
            </div>
            
        </div>
        
  </div>
</div>
</body>
</html>

action.php---验证登陆操作


<?php
    session_start();
    // 由于action有时用post方法传递,也有可能用get方法传递,所以使用超全局变量requset
    switch($_REQUEST['action']){
        // 如果action是login,执行登录步骤
        case 'login':
            // 获取用户名、密码、是否选择记住登陆
            $username=$_POST['username'];
            $password=$_POST['password']; 
            $remember=$_POST['remember'];
            // 拿到验证账户数组
            $user =getUser();
        
            if($username !=$user['username']){
              //登录失败
              sendLogin();   
            }
            if($password !=$user['password']){
                //登录失败
                sendLogin();
            }

            // 如果选择了记住登陆信息,则为true
            if($remember){
                rememberLogin($username);
            }
            // 把拿到的usernam赋值给$_SESSION['username']
            $_SESSION['username'] =$username;
            header('location:index.php');
            break;
        // 如果action是login,执行退出登陆步骤
        case 'logout':
            session_unset();
            setcookie('username', time()-1);
            header('location:login.php');
            break;
    }
   
// 验证用户和密码
 function getUser(){
    return array(
        'username'=>'imooc',
        'password'=>'123456'
    );
 }
// 登陆失败
 function sendLogin(){
     $response ="<script>
     alert('用户名或密码错误!');
     window.location='login.php';
     </script>";
     echo $response;
     die;
 }
// 是否记住登陆状态
 function rememberLogin($username){
     setcookie('username',$username,time()+7*24*3600);
 }
?>

index.php---首页

<?php 
 session_start();
 
//  验证cookie是否存在
if(rememberedLogin()){
    $_SESSION['username'] = $_COOKIE['username'];
}
 if(!hasLoggedIn()){
    header('location:login.php');
     die;
 }
 function hasLoggedIn(){
     return isset($_SESSION['username']) && validateUsername($_SESSION['username']);
 }
 function validateUsername($username){
     return $username == 'imooc';
 } 
 function rememberedLogin(){
     return isset($_COOKIE['username']) && validateUsername($_COOKIE['username']);
 }
?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    shouye 
    <a href="action.php?action=logout">
        <button class="btn btn-outline-dange my-2" type="button">
            注销
        </button>
    </a>
</body>
</html>

以上代码实操完全正确!

标签: php
分享给朋友:

相关文章

PHPCMS里Apache服务器的伪静态和定制404页面

PHPCMS里Apache服务器的伪静态和定制404页面

1、首先网站根目录要有.htaccess文件,我做的网站服务器是Apache,所以这里就先不讲nginx服务器环境下了,听说nginx环境更简单。 2、然后直接在.htaccess文件配置网...

PHP入门基础之文件操作函数封装

PHP入门基础之文件操作函数封装

1、php创建函数的注释使用vscode 编辑器,安装vs docblocker , 输入/** 回车如下    /**  * [create_fi...

 PHP入门基础之PHP操作MySQL数据库

PHP入门基础之PHP操作MySQL数据库

1、PHP操作MySQL数据库的三种方式1.PHP mysql扩展PHP2.0版本开始引入,仅提供面向过程的接口通过调用函数实现例子:<?php     ...

PHP入门之图像信息处理(验证码、水印、缩略图)

PHP入门之图像信息处理(验证码、水印、缩略图)

PHP处理图像信息要使用GD库(imageMagick是另外一种图像处理工具)1、gd_info:检测服务器支持的图像格式var_dump(gd_info()); // array(13)&n...

实现PHPCMS里提交表单发送邮件功能

实现PHPCMS里提交表单发送邮件功能

使用phpcms自带的邮件发送功能实现前台页面表单提交时发送邮件1、首先在phpcms后台找到邮箱配置2、修改相关配置信息。我这里建议使用163的邮件服务器,因为我刚开始用的就是QQ,但是不好用。记得...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

分享:

支付宝

微信