2012-01-26 11 views
8

Jestem nowicjuszem w codeigniter. Korzystam z formularza logowania, aby zalogować się jako administrator. Gdy administrator zaloguje się z poprawną nazwą użytkownika i hasłem, zostanie skierowany na stronę główną ze zmienną sesji. Następnie, jeśli kliknie przycisk wylogowania, sesja ma zostać zniszczona i przekierować użytkownika do strony logowania tj. zaloguj się na stronie formularza.codeigniter sess_destroy() nie działa poprawnie, co robię źle?

The 1st kontroler admin:

<?php 
class Admin extends CI_Controller 
{ 
    function index() 
    { 
     $data['main_content'] = 'admin/log_in'; 
     $this -> load -> view('includes/admin/admin_template', $data); 
    } 
    function log_in() 
    { 
     $this->load->model('admin_model'); 
     $query = $this -> admin_model -> validate(); 
     if ($query)// if the user's credentials validated... 
     { 
      $data = array('user_name' => $this -> input -> post('user_name'), 'is_logged_in' => true); 
      $this -> session -> set_userdata($data); 
      redirect('admin/home/admin_home'); 
     } else// incorrect username or password 
     { 
      $this -> index(); 
     } 
    } 
    function log_out() 
    { 
     $this->session->sess_destroy(); 
     redirect('/admin/admin','refresh'); 
    } 
} 

Drugi kontroler jest kontrolerem domu:

<?php 
class Home extends CI_Controller 
{ 
    function __construct() 
    { 
     parent:: __construct(); 
     $this->is_logged_in(); 
    } 
    function is_logged_in() 
    { 
     $is_logged_in = $this -> session -> userdata('is_logged_in'); 
     if (!isset($is_logged_in) || $is_logged_in != true) 
     { 
      $this -> load -> view('admin/forbidden'); 
     } 
    } 
    function admin_home() 
    { 
     $data['main_content'] = 'home_view'; 
     $this->load->view('admin/home_view'); 
    } 
} 

Model jest admin_model:

<?php 
class Admin_model extends CI_Model 
{ 
    function __construct() 
    { 
     parent:: __construct(); 
    } 
    function validate() 
    { 
      $this->db->where('user_name',$this->input->post('user_name')); 
      $this->db->where('password', $this->input->post('password')); 
      $query = $this->db->get('user'); 
      if($query->num_rows==1) 
      { 
       return true; 
      } 
    } 
} 

Teraz niby użytkownikowi wylogować się i zniszczyć sesję, ale jeśli kliknę przycisk "Wstecz" w przeglądarce, mogę uzyskać powrót do strony Ch nie powinno być, a sesja nie jest zniszczona. proszę powiedz mi, co robię źle tutaj. Używam codeigniter 2.1.0.

+0

Po naciśnięciu przycisku wstecz, czy pobieranie strony z pamięci podręcznej? Lub jeśli klikniesz "F5", czy strona się załaduje i pokaże, że jesteś zalogowany? – Jakub

+0

tak, nawet po ponownym załadowaniu pokazuje, że jestem zalogowany – Shabib

+0

, jeśli otworzysz stronę "bezpieczną" w innej przeglądarce (bez danych sesji), czy dostaniesz to samo? – Jakub

Odpowiedz

10

po przejściu przez wszystkie kłopoty i szukają w różnych miejscach i w końcu znaleźć odpowiednie rozwiązanie tego problemu question.the Pojawił się, ponieważ przeglądarka wyświetlała strony z pamięci podręcznej. Nie była to sesja, która powodowała problem i działała prawidłowo. oto rozwiązanie: w kontrolerze domu dodanie funkcji, aby wyczyścić pamięć podręczną i nazywając go w funkcji konstruktora robi trick :) oto kontroler do domu z rozwiązaniem:

<?php 
class Home extends CI_Controller 
{ 
    function __construct() 
    { 
     parent:: __construct(); 
     $this->is_logged_in(); 
     $this->clear_cache(); 
    } 
    function is_logged_in() 
    { 

     if (!$this->session->userdata('is_logged_in')) 
     { 
      redirect('/admin/admin'); 
     } 
    } 
    function clear_cache() 
    { 
     $this->output->set_header("Cache-Control: no-store, no-cache, must-revalidate, no-transform, max-age=0, post-check=0, pre-check=0"); 
     $this->output->set_header("Pragma: no-cache"); 
    } 
    function admin_home() 
    { 
     $data['main_content'] = 'home_view'; 
     $this->load->view('admin/home_view'); 
    } 
} 

teraz podziękowania do tego linku "logout feature in code igniter", oto gdzie znalazłem rozwiązanie i działa idealnie :)

4

Jeśli wylogujesz się, mimo że sesja zostanie zniszczona, sesja userdata pozostanie na czas trwania aktualnej kompilacji strony CI.

Jako środek ostrożności należy zrobić:

function log_out() 
{ 
    $this->session->sess_destroy(); 
    // null the session (just in case): 
    $this->session->set_userdata(array('user_name' => '', 'is_logged_in' => '')); 

    redirect('/admin/admin'); 
} 

Patrz: http://codeigniter.com/forums/viewthread/110993/P130/#662369

+0

dziękuję, ale to nie działa. Nadal mam ten sam problem :( – Shabib

+0

jakikolwiek powód, dla którego robisz przekierowanie "odśwież"?Czemu nie zrobić opartego na lokalizacji jednego po prostu wykonaj 'przekierowanie ('/ admin/admin');' To może być przyczyną problemu, także jeśli wszystko inne zawiedzie, włącz '$ this-> output-> enable_profiler (TRUE);' żeby zobaczyć, co się dzieje. – Jakub

+0

gdzie należy włączyć $ this-> output-> enable_profiler (TRUE) ;? – Shabib

Powiązane problemy