Session check Not working Properly - CodeIgniter

I have setlogincontroller as the default controller

In my modelMembership, I have a function checkLogin() that returnstrueif the session has valid data.

The methodcheckLogin()is working fine.

I call thecheckLogin()method in the constructor as below.

The method checkLogin() works fine, but am not sure why when I loadLogin/postSigninthe method is not redirected to Application.

P.S: Once I refresh the page, it automatically redirects. Therefore am sure there is some error in the logic.

Any help would be appreciated

<?php
#File : ../controllers/Login.php

class Login extends CI_Controller{

    #Global Variables and Models to be loaded are initiated here
    public function __construct(){
        parent::__construct();
        /*
        |
        |   Load the Following Models
        |   1.Membership
        |
        */
        $this->load->model('Membership');
        #Check for Login details in the cookie
        #If checkLogin() returns true, it indicates that the user has logged in already
        if($this->Membership->checkLogin())
        {
            #redirect to ../controllers/Application Controller
            Redirect('Application');
        }
    }
    #Loads the Basic Header | Footer | Sidebar  && a Specific view->Signin
    public function index(){
        $this->load->view('include/Header');
        $this->load->view('include/SideBar');
        $this->load->view('Signin');
        $this->load->view('include/Footer');
    }
    /*
    |
    |
    |
    */
    public function  postSignin(){
        #Setting custom delimiters
        $this->form_validation->set_error_delimiters('<div class="form-group col-sm-8 center-block form-error bg-danger text-danger text-center">', '</div>');
        /*
        |
        |   ** Rules **
        |   Email       ->  required, Valid email
        |   Password    ->  required, minimum length=5, maximum length=12
        */      
        $this->form_validation->set_rules('emailid','Email','required|valid_email');
        $this->form_validation->set_rules('password','password','required|min_length[5]|max_length[12]|');
        #if the validation failes
        if ($this->form_validation->run() == FALSE)
        {
            #load the Header | Footer | Sidebar | Signin views again
            $this->load->view('include/Header');
            $this->load->view('include/SideBar');
            $this->load->view('Signin');
            $this->load->view('include/Footer');
        }
        else
        {
            #If checkCredentials() method returns true, it indicates a valid login
            if($this->Membership->checkCredentials())
            {   
                $emailid=$this->input->post('emailid');

                #Create an array to store all the necessary details
                $session_data=array(
                        'user_id'=>$this->Membership->getUserId($emailid),
                        'email'=>$emailid,
                        'first_name'=>$this->Membership->getFirstName($emailid),
                        'last_name'=>$this->Membership->getLastName($emailid),
                    );
                #Set the session data using array formed above
                $this->session->set_userdata($session_data);
                #Redirect to the next controller '../controllers/Application'
                Redirect('Application');        
            }
            #If checkCredentials() returns false, load views and display appropriate message
            else
            {
                #set login-status to 0
                $data['login_status']=0;
                #load the Header | Footer | Sidebar | Signin views again
                $this->load->view('include/Header');
                $this->load->view('include/SideBar');
                $this->load->view('Signin',$data);
                $this->load->view('include/Footer');
            }
        }       
    }
}
?>

You can make core controller that will process that part of code, checking login state. Than you can extend that controller with any off application controller that need login check.

<?php if ( ! defined('BASEPATH')) exit('No direct access allowed');
//this is in APPPATH . 'core/'
class MY_Logincheck extends CI_Controller
{
  public function __construct()
  {
    parent::__construct();
  }

  public function index()
  {
    /*
    |
    |   Load the Following Models
    |   1.Membership
    |
    */
    $this->load->model('Membership');
    #Check for Login details in the cookie
    #If checkLogin() returns true, it indicates that the user has logged in already
    if( ! $this->Membership->checkLogin()) {
        #redirect to ../controllers/Application Controller
        redirect('login', 'refresh');
        exit();// check switched to be firstly seen if not login passed
    }
  }
}

Than

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

class Application extends MY_Logincheck
{
  public function __construct()
  {
    parent::__construct();
  }

  public function index()
  {
    // some code related to application
  }
}

Few things you need to consider. 1.) I am not sure if you would get good routing to Application controller without propper .htaccess file code. 2.) Check some libraries like Ben Edmund's Ion_Auth for CI, it can makes things easier. 3.) Double check if loaded all needed helpers and libraries. 4.) Without model code I can't tell more.

Cachewas the culprit here! I turned it off using these. Now its not going back. Thank you guys for your help.

$this->output->set_header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
$this->output->set_header("Cache-Control: no-store, no-cache, must-revalidate");
$this->output->set_header("Cache-Control: post-check=0, pre-check=0", false);
$this->output->set_header("Pragma: no-cache");
What Others Are Reading