首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Codeigniter 3应用程序缺陷:单击浏览器的back按钮会触发signout()函数

Codeigniter 3应用程序缺陷:单击浏览器的back按钮会触发signout()函数
EN

Stack Overflow用户
提问于 2017-10-13 19:33:33
回答 2查看 129关注 0票数 0

我在Codeigniter 3中创建了一个注册和登录应用程序。我一直在努力解决这个问题:登录后,用户被重定向到主页,但单击浏览器的back按钮会触发signout()函数,而不是从Signin页面重定向到主页。

签名控制器有以下代码:

代码语言:javascript
运行
复制
class Signin extends CI_Controller {

  public function __construct()
  {
    parent::__construct();
  }

  public function index()
  {
    $this->load->view('signin');
  }

  public function signin()
  {  
    $this->form_validation->set_rules('email', 'Email', 'required|trim|valid_email');
    $this->form_validation->set_rules('password', 'Password', 'required');
    $this->form_validation->set_error_delimiters('<p class="error">', '</p>');
    if ($this->form_validation->run())
    {
      $email = $this->input->post('email');
      $password = $this->input->post('password');
      $this->load->model('Usermodel');
      $current_user = $this->Usermodel->user_login($email, $password);
      // Unset the current user's data
      if ($current_user) {
       $this->session->set_userdata(
         array(
          'user_id' => $current_user->id,
          'user_email' => $current_user->email,
          'user_first_name' => $current_user->fname,
          'is_logged_in' => TRUE
          )
         );
       redirect('home');  
     } else {
        $this->session->set_flashdata("signin_failure", "Incorrect email or password");
        redirect('signin'); 
      }
    }
    else
    {
     $this->load->view('signin');
   }
  }

  public function signout(){
    // Unset the current user's data
    $this->session->unset_userdata('user_id');
    $this->session->unset_userdata('user_email');
    $this->session->unset_userdata('user_first_name');
    $this->session->unset_userdata('is_logged_in');

    // Load the signin view
    $this->load->view('signin'); 
  }
}

在导航栏(header.php视图)中,我在需要时使用is_logged_in显示Sigin、Register按钮:

代码语言:javascript
运行
复制
<div id="navbar" class="collapse navbar-collapse">
    <ul class="nav navbar-nav navbar-right">
      <?php if($this->session->userdata('is_logged_in')) : ?>
      <li class="dropdown">
        <a class="dropdown-toggle" data-toggle="dropdown" href="#"><span class="glyphicon glyphicon-user"></span> Welcome, <?php echo $this->session->userdata('user_first_name'); ?>
        <span class="caret"></span></a>
        </a>
        <ul class="dropdown-menu">
          <li><a href="#"><span class="glyphicon glyphicon-phone"></span> My contacts</a></li>
          <li><a href="#"><span class="glyphicon glyphicon-phone-alt"></span> All contacts</a></li>
          <li><a href="<?php echo base_url('index.php/Signin/signout'); ?>" title="Signout"><span class="glyphicon glyphicon-log-out"></span> Signout</a></li>
        </ul>
      </li>
      <?php else: ?>
      <li><a href="#"><span class="glyphicon glyphicon-log-in"></span> Signin</a></li>
      <li><a href="#"><span class="glyphicon glyphicon-user"></span> Register</a></li>
      <?php endif;?>
    </ul>
 </div>

在使用了一次Signout按钮之后,用户再次登录,单击浏览器的back按钮将加载http://localhost/ciauth/index.php/Signin/signout并触发signout()函数。

我做错了什么?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-13 19:54:42

您需要在index & signin方法的顶部添加下面提到的行。

代码语言:javascript
运行
复制
if ($this->session->userdata('is_logged_in')==TRUE)
    redirect('home');
票数 0
EN

Stack Overflow用户

发布于 2017-10-13 21:22:27

问题发生在这里:

代码语言:javascript
运行
复制
$current_user = $this->Usermodel->user_login($email, $password);

if($current_user)
{
  #is always !$current_user because $email and $password is empty. you should build condition with userdata first. if userdata not false or whatever condition comparing..and then, how you you pass output(return) in model $this->Usermodel->user_login($email, $password)??
}
else
{
  #so it going here.
  redirect('signin');
}

用新的建议更新。

代码语言:javascript
运行
复制
public function signin() {  
   $this->form_validation->set_rules('email', 'Email', 'required|trim|valid_email');
   $this->form_validation->set_rules('password', 'Password', 'required');
   $this->form_validation->set_error_delimiters('<p class="error">', '</p>');

   if ($this->form_validation->run()) { // that's mean user come here after submit form..
      $email = $this->input->post('email');
      $password = $this->input->post('password');
      $this->load->model('Usermodel');
      $current_user = $this->Usermodel->user_login($email, $password);

      if ($current_user) { #maksure you function user_login() in Usermodel will not return FALSE if success login with $email and #password (must return something or TRUE). Then MUST return FALSE if failed to login.
         // re-set back the current user's data
         $this->session->set_userdata(
            array(
               'user_id' => $current_user->id,
               'user_email' => $current_user->email,
               'user_first_name' => $current_user->fname,
               'is_logged_in' => TRUE
            )
         );
         redirect('home'); 

      } else {

         $this->session->set_flashdata("signin_failure", "Incorrect email or password");
         redirect('signin'); 

      }
   } else { // user come here not after submit login form. possible click browsers button..

      $user_id = $this->session->userdata('is_logged_in');
      if($user_id){ // if return TRUE user already login..
         print_r('hello ' . $this->session->userdata('user_first_name') . ', youre already login.. do something below');
         #do something..
      } else {
         #you need to sign in with this form because you're not login.
         $this->load->view('signin');
      }

   }

} // end of function..
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46736865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档