当前位置: 首页 > 知识库问答 >
问题:

codeigniter中的会话工作不正常

栾烨华
2023-03-14

我不知道Codeigniter中会话的实际错误是什么。我的另一个项目很好地使用了这段代码。但在这种情况下,我遇到了问题。

对于登录会话,我的代码是:

 $data = array(
               'username' => $this->input->post('username'),
               'admin_logged_in' => true,
               'logged_in' =>true

             );
 $this->session->set_userdata($data);

我将会话检查为:

 if ($this->session->userdata('admin_logged_in') == true) { 
     // code
    }

在进入控制器之前,我会像上面一样检查会话,如果会话不正确,则重定向到登录页面。

注销:

 function logout() {
        if ($this->session->userdata('admin_logged_in') == TRUE) {
            $useremail = $this->session->userdata('username');
        $data = array(
                'username' => $useremail,
                'admin_logged_in' => true,
                'logged_in' =>true
            );
        $this->session->unset_userdata($data);
        $this->session->sess_destroy();
        redirect('login');
     }
  }

但是上面的代码不适合我。当我注销时,页面被成功地重定向到注销页面,但是会话没有被破坏,因为我可以访问需要会话设置的所有页面。请帮帮我。

我有一个奇怪的问题。当我登录系统并注销时。并尝试访问需要会话的方法。如果我写的方法名没有索引,我就可以访问。php。若我用索引写方法名,我就无法访问需要会话的方法。php。示例:BnW需要设置会话才能继续。如果我登录并注销,如果我在borwser URL中写入以下内容:

 example.com/index.php/bnw      //it redirects to login page.
 example.com/bnw                //it logs in directly.
  • 不删除索引。php来自。htaccess给会话带来问题

共有3个答案

汪修诚
2023-03-14

我认为在您的logout()函数中,它不会进入if块,因此会话根本不会被破坏

文件中说

注意:如果您试图访问的项目不存在,函数将返回FALSE(布尔值)。

它并没有说它返回真值

所以改变吧

if ($this->session->userdata('admin_logged_in') == TRUE)

if ($this->session->userdata('admin_logged_in') != FALSE)

并检查会话在sess\u destroy()之后是否真的被销毁

 $this->session->sess_destroy();
 $admin_logged_in = $this->session->userdata('admin_logged_in');
 echo "-----------------> $admin_logged_in";

薛寒
2023-03-14

config/autoload中。php

$autoload['libraries'] = array('session');

您的. htaccess应该是(应该放在应用程序文件夹之外)

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php/$1 [L] 
</IfModule>

config/config中。php

if 2.0(第247行)

$config['sess_cookie_name']     = 'ci_session';
$config['sess_expiration']      = 7200;
$config['sess_expire_on_close'] = FALSE;
$config['sess_encrypt_cookie']  = FALSE;
$config['sess_use_database']    = FALSE;
$config['sess_table_name']      = 'ci_sessions';
$config['sess_match_ip']        = FALSE;
$config['sess_match_useragent'] = TRUE;
$config['sess_time_to_update']  = 0;

如果3.0(第358行)

$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = NULL;
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 0;
$config['sess_regenerate_destroy'] = FALSE;

内部控制器

function logout()
{
    $result = $this->model_name->check_login();
    if ( $result == TRUE )
    {

        if(!empty($log))
        {
            $this->session->sess_destroy();
            $this->index();//your logging should be here
        }
        else
        {
            //some code here
        }
    }
    else
    {
        $this->index();
    }
}

模型中

public function check_login()
{
    $log = $this->session->all_userdata();

    if (isset($log['admin_logged_in']))
    {
        if($log['admin_logged_in'] == true)
        {
            return true;
        }
        else
        {
            return false;
        }
    } else
    {
        return false;
    }
}

每个控制器检查会话是否已设置。如果设置了加载视图,则直接使用索引函数。所以这将阻止用户通过URL直接访问

用于检查登录的示例代码

$result = $this->model_name->check_login();
if($result==true)
    {
        //load your views as usual
    }
else
    {
        //load index function
        $this->index();
    }

索引功能(在控制器中)

public function index()
    {
        $this->load->view('admin/logging');//load your loginf view here
    }
杜曜灿
2023-03-14

把这个放到你的注销功能中,它对我有用

$user_data = $this->session->all_userdata();
        foreach ($user_data as $key => $value) {
            if ($key != 'session_id' && $key != 'ip_address' && $key != 'user_agent' && $key != 'last_activity') {
                $this->session->unset_userdata($key);
            }
        }
    $this->session->sess_destroy();
 类似资料:
  • 我正在使用CodeIgniter3.0。6.目前正在一页网站上工作,该网站具有搜索功能。我在codeigniter的配置文件中启用了csrf_保护选项,并使用form_open()函数创建表单。 当我按下submit按钮时,搜索功能运行良好,但在提交表单后,当我刷新页面时(使用任何刷新页面的功能,如从keybord或浏览器刷新),CSRF不工作,并显示错误“您请求的操作不允许”。 注意:我使用po

  • 我已经在Codeigniter上编写了一个简单的身份验证过程,但存在一个问题。 由于某些原因,当用户浏览站点时,会话会被混淆,并模拟另一个随机用户。 我只是做: 我通过

  • 这里的问题是我试图通过ajax登录到我的系统。让我给你的第一个解释一下。 当我的用户输入他的登录详细信息时,它将通过Ajax请求发送到服务器,然后在验证后,我创建一个会话条目,并保存用户ID和登录标志等信息。 然后我通过Json将这些值返回给用户,由一段javascript处理,并将用户重定向到仪表板。 如果用户未经身份验证,则显示错误。 但现在这里发生的是。当我创建会话变量时以及当用户重定向到仪

  • 我正在使用CodeIgniter和RestServer实现构建一个APIhttps://github.com/chriskacerguis/codeigniter-restserver 我想使用会话身份验证模式,所以我在配置/rest.php中设置了这个: 在config/config中。php: 我有一个控制器身份验证,其代码如下: 会话存储在数据库中,并包含来自$user的数据。pr回显数据(

  • 一旦我们开始使用这个,Vaadin就会崩溃并停止工作。当为了调试而用内存中的映射替换外部缓存时,它会再次工作。 这似乎是由引起的,因为它将存储为会话属性。是,Javadoc显示: VaadinSession中的所有内容都应该是可序列化的,以确保与使用序列化持久化会话数据的方案兼容。 注意:我们也有一个使用Vaadin8的应用程序版本,这里也发生了同样的事情。这个问题似乎是由Vaadin Sprin

  • 我正在使用codeigniter。我有个奇怪的问题。我在用户登录时设置会话,并将其重定向到新页面。我观察到,会话有时设置,有时不设置。我尝试过使用codeigniter会话 以下是配置文件的外观: