2011-12-23 21 views
6

Tôi có một bộ điều khiển logout trong CodeIgniter:Thoát CodeIgniter

<?php 

class Logout extends MY_Controller { 

    function index() 
    { 

     $this->session->sess_destroy(); 
     redirect('index.php'); 
    } 
} 

này ghi tôi ra nhưng khi tôi gọi một bộ điều khiển sau khi khai thác gỗ, như "/ trang web/addnewpost", này chỉ ghi lại tôi trong một lần nữa, như nếu sassion chưa bị phá hủy trước đó. Tại sao chuyện này đang xảy ra?

+0

xóa chuyển hướng. tạo một tập lệnh khác chỉ chứa 'var_dump ($ _ SESSION)' và gọi tập lệnh đó sau khi đăng xuất để kiểm tra xem phiên thực sự có bị phá hủy – xbonez

+0

phần đăng nhập của bạn không? (trong đó bạn kiểm tra phiên) – ALH

+0

@xbonez - Sửa lỗi nếu tôi sai ở đây, nhưng tôi nghĩ CodeIgniter không sử dụng phiên PHP gốc. – Tyil

Trả lời

11

đề nghị Thực hiện theo ALex, nhưng sử dụng mã CI :). Ý tôi là, hãy thử đặt riêng từng dữ liệu phiên. Tôi đọc một lần về một vấn đề trong phiên bản 2.0.3 Tôi nghĩ, nhưng tôi không nhớ bây giờ và tôi không có thời gian để tìm kiếm các tài liệu tham khảo. Đó là trong diễn đàn của họ, mặc dù, và đề nghị là như nhau: bỏ từng phần tử phiên một.

$this->session->unset_userdata('data_one'); 
$this->session->unset_userdata('data_two'); 
$this->session->unset_userdata('data_three'); 
$this->session->unset_userdata('data_one'); 
$this->session->sess_destroy(); 
redirect('home','refresh'); // <!-- note that 
//you should specify the controller(/method) name here 

Bạn cần để chuyển hướng vì phiên CI chỉ là cookie, không phải là mẹ đẻ mảng phiên php.

Một điều khác ... đảm bảo lỗi không nằm trong phương thức đăng nhập của bạn, thao tác này sẽ ghi lại bạn dù bạn có đăng xuất thành công hay không!

+0

WOrks cảm ơn! –

2

Cố gắng xóa một cách rõ ràng mục như thế này:

$this->Session->delete('User'); 
$this->Session->destroy(); 
$this->Cookie->delete("User"); 
$this->Cookie->destroy(); 
$this->Auth->logout(); 
$this->redirect('whereever'); 
1

Sự cố của tôi phải làm với bộ nhớ đệm ở phía máy chủ. Nhanh nhất tôi có thể sửa chữa nó là bằng cách thêm văn bản ngẫu nhiên để liên kết logout:

<?php 
    $this->load->helper('string'); 
    echo anchor('/home/logout/'.random_string(), 'logout'); 
?> 

home/logout chứa mã giống như function index trong câu hỏi.

Vì vậy, bạn biết rằng redirect('/', 'refresh') không hoạt động đối với tôi, nhưng tôi lại thử nghiệm nhanh.

Tôi đoán rằng phương pháp random_string() có thể được thay thế bằng cách xuất các tiêu đề buộc bộ nhớ cache bị xóa vv Như bạn có thể đoán, tôi không thể làm điều đó ngay bây giờ vì tôi siêu bận. Có lẽ sau này.

1

Bạn cũng có thể thử đặt "logged_in" theo cách thủ công hoặc bất kỳ thứ gì bạn gọi là phiên thành sai. Sau đó, phá hủy tất cả dữ liệu phiên khác.

$this->session->set_userdata('logged_in', FALSE); 
    $this->session->session_destroy(); 
    redirect('index'); 
0

trước tiên, chúng tôi phải tải thư viện phiên để xử lý phiên hơn là không đặt sessionID và hủy phiên. Tôi đang sử dụng mã này để hủy đặt phiên của tôi và đăng xuất an toàn.

$this->load->library('session'); 
$this->session->set_userdata('user_id', FALSE); 
$this->session->sess_destroy(); 
$this->load->view('your URL'); 
+0

Vui lòng không đăng câu trả lời chỉ có mã. Bao gồm một số giải thích về những gì bạn đã thay đổi, tại sao nó hoạt động, v.v. –