【问题标题】:Understanding codeigniter sessions了解 codeigniter 会话
【发布时间】:2011-11-09 19:53:24
【问题描述】:

我正在尝试使用 codeigniter 构建一个基本的登录脚本,但有些东西我不明白...

您如何在并且仅在您登录之后初始化会话?

会员区的每一个构造函数中都要$this->load->library('sessions')吗?

我迷路了:P

【问题讨论】:

    标签: php codeigniter session


    【解决方案1】:

    将会话类放入自动加载器配置中,在application/config/autoload.php

    $autoload['libraries'] = array('session' /* , ... */);
    

    然后在每个控制器中自动可用:

    $session_id = $this->session->userdata('session_id');
    

    并且您可以在每次登录之后(并且仅在之后!)初始化会话数据。

    它被称为session 而不是sessions。所以如果你不想自动加载(not 自动加载会话库没有多大意义,但无论如何,做你想做的事),使用正确的库名让它工作;)

    【讨论】:

    • 其他一些答案更好,因为除非您创建需要登录的网站(例如 gmail),否则即使您未登录的用户也会无缘无故地获得会话。
    【解决方案2】:

    最好的方法是创建您自己的扩展 CI_Controller 的 Controller 类。

    基本上当你说:

    class Controller_name extends CI_Controller {}
    

    你可以把它改成

    class Controller_name extends My_Controller {}
    

    My_Controller 将执行身份验证,如果页面不需要用户登录,则使用标准 CI_Controller 类。

    更新:

    这是我在工作中写的,没有代码示例来更好地展示这一点。

    /applications/core/ 中创建MY_Controller.php 并使用以下代码。

    <?php
    
    class  MY_Controller  extends  CI_Controller  {
    
        function __construct() {
            parent::__construct();
    
            // Verify logged in status.
            if ( ! $this->session->userdata('loggedIn') ) redirect('/login');
        }
    }
    

    然后在您的login 控制器中设置一个名为loggedIn 的会话变量。我通常会将此值设为用户 ID,以便快速引用它。

    现在,如果您想让任何控制器要求用户登录,请扩展您的新 MY_Controller 类。

    <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
    
    class Dashboard extends MY_Controller {
    
        /* Your Code */
    
    }
    

    如果用户没有loggedIn 作为会话变量,那么他们将被重定向到login 控制器。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      自动加载 Codeigniter 会话时要小心,尤其是当您使用 MySQL 作为高负载网站的会话存储时。除了明显减慢(最终)读/写活动之外,Codeigniter 将始终为机器人提供会话,尤其是谷歌机器人。根据您自己在 Google 网站管理员工具中的网站设置,这可能会导致性能下降。

      我发现会话存储最有效的方式是 Memcache。我尝试过 MongoDB,但这有时也弊大于利。我使用位于here 的 Codeigniter 的 Memcache 开源了我自己的会话管理。

      Memcache 拥有自己的内部垃圾收集器,其功能比 Codeigniter 的更强大,因此您不必担心存储空间的大小。如果需要,您可以简单地增加 Memcache 内存大小。对于具有超过 100 个并发请求/秒的高负载网站,我建议使用 ~4GB。

      祝你好运!

      【讨论】:

        【解决方案4】:

        您可以创建一个新的控制器类来扩展“CI_controller”。您需要使用“MY_”前缀命名它并将其放入“/system/application/libraries/”文件夹中。在您的自定义控制器的构造中,您开始会话。如果您的控制器需要身份验证,则扩展自定义类,否则扩展“CI_controller”类。

        【讨论】:

          【解决方案5】:

          我喜欢使用库来处理与会话数据的所有交互。将库添加到您的自动加载配置中,您可以根据需要从代码中的任何位置引用它。

          我建议查看现有的身份验证库(例如 Ion_Auth - 我最喜欢的起点),然后从那里构建或决定可以将哪些经验教训应用于您自己的需求。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-04-30
            • 2014-09-10
            • 1970-01-01
            • 1970-01-01
            • 2023-03-16
            相关资源
            最近更新 更多