【问题标题】:only some functions of controller cannot access session data in codeigniter只有控制器的某些功能无法访问 codeigniter 中的会话数据
【发布时间】:2015-01-15 06:50:57
【问题描述】:

我是 Codeigniter 的新手。我在一个控制器中设置会话。我可以从另一个控制器的某些功能访问该会话数据。但只有某些功能无法访问会话数据。请帮助我为什么会这样。

我设置会话

$admin_details=array(
    'admin_id'=>$admin_id,
    'admin_name'=>$admin_name,
    'email'=>$email,
    'is_admin_logged_in'=>true,
    'user_type'=>'admin'
    );
$this->session->set_userdata($admin_details);

我通过

访问它
function manage_profile()
{

    if(!$this->session->userdata('is_admin_logged_in'))
    {
        $this->load->view('admin/test');
    }
}

但它正在加载视图“测试”。我已经加载了会话库并设置了加密密钥。它适用于同一控制器中的其他一些功能。

【问题讨论】:

  • 转储您的会话数组并查看它在 manage_profile 函数中返回的内容
  • 它返回..array(5) { ["session_id"]=> string(32) "2e75844ad3cccc256669c52d1a44bf90" ["ip_address"]=> string(15) "123.237.210.195" ["user_agent "]=> string(101) "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36" ["last_activity"]=> int(1421305221) ["user_data" ]=> 字符串(0) "" }
  • 您的代码中的某些内容已取消设置管理员会话。是否有任何其他代码 sn-p 与您的代码相交?
  • 没有。管理员会话重置未在任何地方完成.. 该函数中的 var_dump 函数给出布尔值 FALSE
  • 但仍有一些其他功能可以访问会话数据

标签: php codeigniter session


【解决方案1】:

这是因为当您键入 $this->session->userdata('is_admin_logged_in') 时,您正在访问会话的“容器”。

$admin_details=array( 'admin_id'=>$admin_id, 'admin_name'=>$admin_name, 'email'=>$email, 'is_admin_logged_in'=>true, 'user_type'=>'admin' ); $this->session->set_userdata($admin_details);

您实际上需要这样做: $this->session->set_userdata('name_your_session_something',$admin_details);

然后访问它:

$session = $this->session->userdata('name_your_session_something'); $admin_logged = $session['is_admin_logged_in'];

if(!$admin_logged){ //if admin is not logged in do this }

这是一个简单的数组情况。

所以这应该是代码:

设置会话:

$admin_details=array( 
        'admin_id'=>$admin_id, 
        'admin_name'=>$admin_name, 
        'email'=>$email, 
        'is_admin_logged_in'=>true, 
        'user_type'=>'admin' 
);
$this->session->set_userdata('name_your_session_something',$admin_details);

获取会话:

$session = $this->session->userdata('name_your_session_something'); 
$admin_logged = $session['is_admin_logged_in'];

【讨论】:

  • 我试过 $this->session->set_userdata('login_session',$admin_details);但它不会先设置会话数据。
  • 你的构造中有$this->load->library('session');吗?编辑:我看到你在两个控制器中都这样做了?
  • 问题是当我调用这个函数时,即manage_profile(),会话自动取消。注意:我从iframe调用这个函数
  • 你在做$this->manage_profile吗?在上面也进行了编辑,只需检查您所拥有的即可。如果不是您问题中的代码,您可以发布问题代码吗?
  • 我无法访问 iframe 中的任何会话数据。有什么方法可以访问 i 框架中的会话数据吗?
【解决方案2】:

不知道有没有帮助,但重要的是,

如果您使用 iframe 并使用 ajax 调用获取内容,则可能会发生这种情况。这是因为codeIgniter 中的会话类每$config[‘sess_time_to_update’] 分钟更新一次会话信息。

这是一个非常有用的安全功能,可以阻止会话劫持。 如果您通过 AJAX 获取详细信息,则会更新会话并生成新的会话 id,但不会更新浏览器中的 cookie。因此,下次浏览器请求新页面时,它会发送一个带有错误会话 id 的 cookie,并且会话变得无效导致会话数据丢失。

This thread 可能会帮助您克服这种情况。

感谢真正找到解决方案的人。 谢谢。

第 1 步: 在 constants.php (application/config/) 中,您必须添加以下行来定义 AJAX 请求。

// Define Ajax Request
 define('IS_AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
//  

第 2 步: 在(应用程序/库)下创建一个名为 MY_Session.php 的新文件

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class MY_Session extends CI_Session 
{

/**
* Update an existing session
*
* @access    public
* @return    void
*/
    function sess_update()
    {
       // skip the session update if this is an AJAX call!
       if ( !IS_AJAX )
       {
           parent::sess_update();
       }
    } 

}

/* End of file MY_Session.php */
/* Location: ./application/libraries/MY_Session.php */ 

【讨论】:

    猜你喜欢
    • 2018-07-21
    • 2013-12-25
    • 2023-03-14
    • 2021-09-18
    • 2021-06-07
    • 2016-06-12
    • 2019-02-05
    • 1970-01-01
    • 2020-01-13
    相关资源
    最近更新 更多