【问题标题】:What causes the session to be recreated or to be gone after a page refresh?是什么导致会话在页面刷新后重新创建或消失?
【发布时间】:2013-08-18 12:32:24
【问题描述】:

我在我的项目中使用 codeigniter,我有一个登录模块,我对每个模块进行身份验证。当会话不存在时,然后重定向到登录页面。所以,这可行,但有时它可能会在我登录然后刷新页面时发生,我被重定向到登录页面(意味着会话消失了)。

请不要试图告诉我使用其他库,例如 php native 等。我只是想知道导致这种情况的问题是什么。

function _admin_login()
{
    $this->form_validation->set_rules($this->login_rules);

    $data['title'] = "Login";
    $data['form_url'] = $this->uri->uri_string();   
    $data['login_btn'] = form_submit('login','Sign In','class="btn btn-large btn-block btn-primary"');


        if($this->form_validation->run($this) == FALSE){

            $data['user'] = form_input('username','','class="input-block-level input-large" placeholder="Username"');
            $data['passw'] = form_password('password','','class="input-block-level input-large" placeholder="Password"');

            $this->template->set('title','Login');
            $this->template->load('template_login','login_view',$data);

        }else{
            $username = $this->input->post('username',true);
            $row = $this->authentication_model->get_user_info($username);

            $this->session->set_userdata('user',$row['user_id']);
            $this->session->set_userdata('username',$row['username']);
            $this->session->set_userdata('login_state',true);
            $this->authentication_model->update_last_login();


                redirect('product');    
        }

}

这是我的登录脚本,如果验证通过,则会话已设置...并且在每个控制器中我都检查了会话脚本。示例如下:

$this->authentication_plugin->check_logged_in();

function check_logged_in()
    {
        if(logged_in() === FALSE){
            set_alert('Login in to view this page!!','error');
            set_bookmark('login_url');
            redirect("login");
        }
    }

function logged_in()
{
    $CI =& get_instance();
    $user = $CI->session->userdata('user');

    if(!$CI->load->library('session')){
            echo "no session is loaded";
            die;
    }

    if(!empty($user)){      
        return true;
    }else{  
        return false;
    }
}

有什么想法吗?谢谢!

【问题讨论】:

  • 您的数据库中是否有重复的用户名?首先我会检查$row = $this->authentication_model->get_user_info($username);
  • if(logged_in() === FALSE) 应该是 if($this->logged_in() === FALSE)
  • logged_in() 是全局库函数.. 没关系
  • jcs - 不只是一个记录..你们以前遇到过这个问题吗?

标签: php codeigniter session


【解决方案1】:
  • 自动加载会话库并将其从登录脚本中删除。 在 config/autoload.php 中寻找 $autoload['libraries'] 添加“会话”

  • 在 config/config.php 中 向下滚动到 cookie 配置并查找 $config['sess_cookie_name'] 确保 cookie 名称中没有下划线。您必须更改 codeigniter 默认名称才能执行此操作。

  • 通过在构造函数中进行会话检查进行测试。它可以快速检查会话是否正常工作。

【讨论】:

  • 太棒了!!谢谢卡塔洛特。这是工作~你的第二个建议对我有帮助。
  • ok~ 我发现导致这个的问题并没有真正改变名称,这是因为我同时运行 2 个应用程序并且使用 ci_session 会话名称相同。也许它有碰撞
  • 在您首次设置应用程序时,为 cookie 名称指定一个唯一值是一个好习惯。并且不要在 cookie 名称中使用下划线。并且 - 尽量不要依赖 cookie。您可以使用令牌传递唯一会话。不吃饼干不哭。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-16
  • 2014-08-16
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 2014-01-15
相关资源
最近更新 更多