Thời gian đọc: 13 phút
Trong CodeIgniter, thư viện Session giúp bạn dễ dàng lưu trữ và truy xuất thông tin về người dùng giữa các yêu cầu HTTP. Thư viện này hoạt động tương tự như các session trong PHP, nhưng cung cấp một số tính năng mở rộng giúp việc quản lý session an toàn và linh hoạt hơn.
Trong bài viết này, chúng ta sẽ tìm hiểu cách sử dụng thư viện Session của CodeIgniter bao gồm các khái niệm, cách cài đặt, và các ví dụ cụ thể.
Mặc định, CodeIgniter sử dụng session theo kiểu Cookie-based, nghĩa là toàn bộ dữ liệu session được lưu trữ trong cookie của trình duyệt. Bạn cũng có thể cấu hình để lưu session vào cơ sở dữ liệu, điều này giúp dữ liệu session an toàn hơn và dễ quản lý hơn khi bạn muốn chia sẻ session giữa nhiều server.
/application/config/config.php
.Dưới đây là một số cài đặt cơ bản trong file config.php
:
$config['sess_driver'] = 'files'; // Kiểu lưu trữ session: files, database, redis, memcached
$config['sess_cookie_name'] = 'ci_session'; // Tên cookie session
$config['sess_expiration'] = 7200; // Thời gian session hết hạn (giây)
$config['sess_save_path'] = NULL; // Đường dẫn lưu trữ file session
$config['sess_match_ip'] = FALSE; // Có so khớp IP không (thêm bảo mật)
$config['sess_time_to_update'] = 300; // Thời gian (giây) để cập nhật ID session
$config['sess_regenerate_destroy'] = FALSE; // Có hủy dữ liệu session cũ khi ID thay đổi không
Nếu bạn muốn lưu trữ session vào cơ sở dữ liệu, bạn cần thực hiện những bước sau:
sess_driver
thành 'database'
.
CREATE TABLE `ci_sessions` (
`id` varchar(128) NOT NULL,
`ip_address` varchar(45) NOT NULL,
`timestamp` int(10) unsigned DEFAULT 0 NOT NULL,
`data` blob NOT NULL,
PRIMARY KEY (id),
KEY `ci_sessions_timestamp` (`timestamp`)
);
sess_save_path
trong config.php
với tên bảng đã tạo:
$config['sess_save_path'] = 'ci_sessions'; // Tên bảng lưu trữ session
CodeIgniter tự động tải thư viện session, nhưng nếu bạn muốn tải thư viện này một cách thủ công, bạn có thể thêm dòng sau vào controller của mình:
$this->load->library('session');
Thường thì bạn không cần phải thực hiện thao tác này vì thư viện session đã được tải mặc định.
Để lưu trữ dữ liệu vào session, bạn có thể sử dụng phương thức set_userdata()
.
// Lưu trữ một giá trị vào session
$this->session->set_userdata('username', 'nguyenvanA');
// Lưu trữ nhiều giá trị vào session
$session_data = array(
'username' => 'nguyenvanA',
'email' => '[email protected]',
'logged_in'=> TRUE
);
$this->session->set_userdata($session_data);
Để truy xuất dữ liệu đã lưu trong session, bạn có thể sử dụng phương thức userdata()
.
// Truy xuất một giá trị từ session
$username = $this->session->userdata('username');
echo $username; // In ra: nguyenvanA
// Kiểm tra nếu người dùng đã đăng nhập
if ($this->session->userdata('logged_in')) {
echo "Người dùng đã đăng nhập";
}
Để xóa một hoặc nhiều giá trị trong session, bạn có thể sử dụng phương thức unset_userdata()
.
// Xóa một giá trị session
$this->session->unset_userdata('username');
// Xóa nhiều giá trị session
$this->session->unset_userdata(array('username', 'email'));
Để xóa toàn bộ dữ liệu session và làm mới session, bạn có thể sử dụng phương thức sess_destroy()
.
$this->session->sess_destroy();
Lệnh này sẽ xóa tất cả dữ liệu session và khởi động lại session mới.
Flashdata là một tính năng đặc biệt trong CodeIgniter cho phép bạn lưu trữ dữ liệu session chỉ tồn tại trong yêu cầu HTTP kế tiếp, sau đó nó sẽ tự động bị xóa. Điều này rất hữu ích khi bạn cần truyền thông báo (message) hoặc dữ liệu tạm thời giữa các trang mà không muốn dữ liệu này tồn tại lâu hơn.
Để thiết lập flashdata, bạn sử dụng phương thức set_flashdata()
.
// Thiết lập flashdata
$this->session->set_flashdata('message', 'Đăng nhập thành công');
Để truy xuất flashdata, bạn sử dụng phương thức flashdata()
.
// Truy xuất flashdata
$message = $this->session->flashdata('message');
echo $message; // In ra: Đăng nhập thành công
Nếu bạn muốn giữ flashdata tồn tại thêm một yêu cầu HTTP nữa, bạn có thể sử dụng phương thức keep_flashdata()
.
$this->session->keep_flashdata('message');
CodeIgniter có thể kiểm tra địa chỉ IP của người dùng để đảm bảo rằng session không bị chiếm dụng từ một địa chỉ IP khác. Điều này có thể được bật trong file config.php
:
$config['sess_match_ip'] = TRUE;
Để tăng tính bảo mật, bạn có thể mã hóa dữ liệu session trước khi lưu trữ vào cookie. Điều này được bật sẵn trong CodeIgniter nếu bạn sử dụng session dựa trên cơ sở dữ liệu hoặc memcached
/redis
.
Để tránh tấn công session fixation, bạn có thể cấu hình để thay đổi ID session định kỳ, đảm bảo rằng ID session của người dùng không bị cố định. Bạn có thể cấu hình điều này trong file config.php
:
$config['sess_time_to_update'] = 300; // Đổi ID session sau mỗi 300 giây
Session thường được sử dụng để lưu trữ thông tin người dùng đã đăng nhập, chẳng hạn như ID người dùng, tên đăng nhập, và trạng thái đăng nhập (logged_in
).
// Thiết lập thông tin người dùng sau khi đăng nhập thành công
$session_data = array(
'user_id' => $user_id,
'username' => $username,
'logged_in' => TRUE
);
$this->session->set_userdata($session_data);
Một ứng dụng phổ biến khác của session là lưu trữ dữ liệu giỏ hàng cho các ứng dụng thương mại điện tử.
// Thêm sản phẩm vào giỏ hàng
$cart = $this->session->userdata('cart');
$cart[] = array(
'product_id' => 123,
'quantity' => 2,
'price' => 50000
);
$this->session->set_userdata('cart', $cart);
Thư viện Session trong CodeIgniter là một công cụ mạnh mẽ và linh hoạt giúp bạn dễ dàng quản lý dữ liệu phiên người dùng. Từ việc lưu trữ thông tin đăng nhập, giỏ hàng cho đến quản lý flashdata, thư viện này cung cấp đầy đủ các tính năng cần thiết để làm việc với session trong các ứng dụng web.
Bạn có thể mở rộng và tùy chỉnh session theo nhu cầu của mình bằng cách cấu hình và sử dụng các phương thức phù hợp. Điều quan trọng là luôn luôn đảm bảo rằng session của bạn được bảo mật, đặc biệt là trong các ứng dụng yêu cầu đăng nhập hoặc quản lý thông tin nhạy cảm.
Để xử lý vấn đề về việc session lưu trong thư mục ../php/sessions
có thể làm đầy dung lượng sau một thời gian sử dụng, bạn có thể thay đổi tên cookie session mặc định từ ci_session
sang một tên khác (ví dụ: vne_session
) mà không ảnh hưởng đến session đăng nhập của người dùng. Điều này giúp bạn quản lý session tốt hơn và tránh việc cookie mặc định (ci_session
) gây đầy dung lượng.
Dưới đây là hướng dẫn chi tiết cách thực hiện:
CodeIgniter sử dụng một cấu hình session cookie mặc định có tên là ci_session
. Bạn có thể thay đổi tên này trong file /application/config/config.php
.
/application/config/config.php
và tìm đến dòng cấu hình sess_cookie_name
:
$config['sess_cookie_name'] = 'ci_session'; // Tên mặc định của session cookie
vne_session
:
$config['sess_cookie_name'] = 'vne_session'; // Đổi tên session cookie thành vne_session
Với việc thay đổi này, CodeIgniter sẽ sử dụng vne_session
làm tên cookie mới cho session, giúp phân biệt các phiên đăng nhập của người dùng với các session mặc định.
ci_session
Nếu bạn muốn xóa cookie session mặc định ci_session
sau khi đã thay đổi thành tên mới (ví dụ: vne_session
), bạn có thể thực hiện điều này một cách thủ công thông qua code. Dưới đây là cách để xóa cookie ci_session
nhưng vẫn giữ lại session đăng nhập với tên mới vne_session
.
ci_session
một cách thủ côngBạn có thể sử dụng hàm set_cookie()
của PHP hoặc của chính CodeIgniter để xóa cookie session ci_session
.
Ví dụ trong CodeIgniter, bạn có thể sử dụng hàm set_cookie()
:
// Xóa cookie 'ci_session'
delete_cookie('ci_session');
Hoặc sử dụng cú pháp PHP để hủy session cookie:
// Xóa cookie PHP session
if (isset($_COOKIE['ci_session'])) {
unset($_COOKIE['ci_session']);
setcookie('ci_session', '', time() - 3600, '/'); // Xóa cookie bằng cách đặt thời gian hết hạn đã qua
}
Trong một số trường hợp, nếu bạn cấu hình session để lưu trữ trong file (tức là sử dụng sess_driver = 'files'
), bạn có thể cần phải xóa các file session cũ được lưu trữ trong thư mục ../php/sessions
. CodeIgniter không tự động xóa các file session cũ, vì vậy bạn có thể sử dụng một cron job để định kỳ xóa chúng.
Ví dụ, sử dụng lệnh sau để xóa các file session cũ hơn 7 ngày trên server:
find /path/to/php/sessions -type f -mtime +7 -delete
Lệnh trên sẽ tìm và xóa tất cả các file session cũ hơn 7 ngày trong thư mục /path/to/php/sessions
.
vne_session
)Sau khi thay đổi tên cookie session thành vne_session
, bạn có thể tiếp tục sử dụng session trong ứng dụng của mình như bình thường mà không ảnh hưởng đến hoạt động đăng nhập của người dùng. Tất cả các session liên quan đến người dùng sẽ được lưu trữ trong cookie vne_session
.
Bạn vẫn có thể lưu trữ thông tin đăng nhập người dùng trong session với cookie mới vne_session
:
// Thiết lập thông tin người dùng sau khi đăng nhập thành công
$session_data = array(
'user_id' => $user_id,
'username' => $username,
'logged_in' => TRUE
);
$this->session->set_userdata($session_data);
Dữ liệu session trên sẽ được lưu vào cookie vne_session
thay vì ci_session
.
Để kiểm tra xem người dùng có đang đăng nhập hay không, bạn có thể sử dụng dữ liệu session như bình thường, và session sẽ được lưu trong cookie vne_session
:
// Kiểm tra trạng thái đăng nhập
if ($this->session->userdata('logged_in')) {
echo "Người dùng đã đăng nhập";
}
Bạn có thể kiểm soát thời gian session tồn tại bằng cách cấu hình sess_expiration
trong file config.php
. Điều này giúp giảm dung lượng file session lưu trữ trên server:
$config['sess_expiration'] = 7200; // Session sẽ hết hạn sau 2 giờ (7200 giây)
Để tránh tấn công session fixation (giữ cố định session ID), bạn có thể cấu hình để định kỳ thay đổi ID session, đảm bảo tính bảo mật:
$config['sess_time_to_update'] = 300; // Thay đổi ID session sau mỗi 300 giây
Thay vì lưu trữ session vào file hệ thống, bạn có thể cấu hình để lưu session vào cơ sở dữ liệu. Điều này giúp bạn dễ dàng quản lý session và tránh làm đầy dung lượng server. Cấu hình trong config.php
:
$config['sess_driver'] = 'database';
$config['sess_save_path'] = 'ci_sessions'; // Tên bảng lưu trữ session
Bạn sẽ cần tạo một bảng session trong cơ sở dữ liệu như đã hướng dẫn ở trên.
Bằng cách thay đổi tên session cookie từ ci_session
thành vne_session
, bạn có thể tránh được việc session cookie mặc định làm đầy dung lượng hệ thống. Đồng thời, bạn cũng có thể quản lý session đăng nhập người dùng với tên cookie khác mà vẫn đảm bảo tính bảo mật và hiệu quả.
Ngoài ra, việc xóa cookie session cũ và định kỳ dọn dẹp file session trên server sẽ giúp bạn kiểm soát dung lượng tốt hơn, đặc biệt trong các hệ thống lớn với nhiều người dùng.