Lập trình như tự đá vào mặt mình, sớm hay muộn mũi bạn cũng sẽ chảy máu. Jim McCarthy
STDIO Những ngày đầu khi mới làm quen với lập trình web, tôi thường nghe được từ những người bạn xung quanh nói về session, cookie và tôi luôn thắc mắc nó là gì, chức năng của nó dùng để làm gì, cài đặt và sử dụng nó như thế nào và vai trò quan trọng của nó đối với một website.
Nội dung bài viết

Giới thiệu

Những ngày đầu khi mới làm quen với lập trình web, tôi thường nghe được từ những người bạn xung quanh nói về session, cookie và tôi luôn thắc mắc nó là gì, chức năng của nó dùng để làm gì, cài đặt và sử dụng nó như thế nào và vai trò quan trọng của nó đối với một website.

Tiền đề bài viết

Trải qua một số dự án thực tế về web cùng với những người bạn và hiểu được những khó khăn trong việc tiếp cận với lập trình web. Với mong muốn chia sẻ kiến thức, tôi viết bài này nhằm mục đích gỡ bỏ những thắc mắc về khái niệm session, cookie mà những lập trình viên gặp phải và hiểu rõ hơn về ứng dụng của nó.

Đối tượng hướng đến

Bài viết này hướng đến các bạn lập trình viên bước đầu học tập và đam mê lập trình web bằng ngôn ngữ PHP.

Session là gì?

Chúng ta thường thấy khi ta đăng nhập vào một trang web thì ta chỉ cần phải đăng nhập một lần và sau một khoảng thời gian nhất định ta không cần phải đang nhập lại cho dù ta có tắt trang web đó đi, đó chính là một ứng dụng của session. Nhưng chỉ là tắt một tab,còn nếu ta tắt hẳn trình duyệt thì session sẽ mất. Còn tại sao tài khoản của ta lại được lưu trên hoặc đã được đăng nhập sẵn trên web mỗi lần ta mở trình duyệt thì tôi sẽ trình bày chi tiết trong phần cookie.

Session được hiểu với nghĩa là một phiên làm việc, là một khoảng thời gian tương tác giữa người sử dụng và website. Session được tạo ra bởi website do người lập trình quy định và được lưu trữ tại server, thời gian sống của session ngắn hoặc do website quyết định. Session giúp ta lưu trữ thông tin về user, các biến, giá trị trong khoảng thời gian ta tương tác với website. Sau khi ta tắt trình duyệt web tức là đã kết thúc một phiên làm việc thì session sẽ tự động hủy.

Sử dụng session

  • Để sử dụng được session thì trên mỗi trang page.php ta phải gọi hàm session_start(); ở đầu file php
  • Để khai báo một "biến" ta làm như sau $_SESSION['username'] = 'stdio_member'; ta có session với khóa username có giá trị là stdio_member
  • Để hủy một session với khóa đã biết ví dụ username, ta gọi hàm unset($_SESSION['username']);
  • Để kiểm tra session tồn tại với khóa cho trước ví dụ username, ta gọi hàm isset($_SESSION['username']); hàm này sẽ trả về true nếu username đã tồn tại và ngược lại
  • Để lấy giá trị của session cho trước ví dụ username, ta chỉ cần truyền đúng khóa username vào "mảng" session như sau $_SESSION['username']

Demo

[1] Tạo form đăng nhập trong trang signin_page.php có nội dung như sau

<html>
	<head>
		<title>Login</title>
	</head>
	<body>
		<form method="post" action="doSignin.php">
			<input name="username" placeholder="Username" type="text" />
			<input name="password" placeholder="Password" type="password" />
			<input name="submit" value="Login" type="submit"/>
		</form>
	</body>
</html>

ss_1

[2] Tạo trang xử lý đăng nhập doSignin.php

<?php
	session_start();
	ob_start();

	// TODO: CHECK SIGNED IN
	if (isset($_SESSION['statusLogin'])
			&& $_SESSION['statusLogin'] == 'YES')
	{
		header("location:user_info.php");
	}
	
	// TODO: SIGN IN
	isSignedin = DoSignIn($_POST['username'], $_POST['password']);
	
	if (isSignedin == TRUE)
	{
		$_SESSION['statusLogin'] = 'YES';
	}
?>

Nếu $_SESSION['statusLogin'] chưa tồn tại thì trang web sẽ xử lý việc đăng nhập signin_page.php còn nếu đã tồn tại thì ta được phép vào trang user_info.php. Sau khi ta submit form đăng nhập thì dữ liệu username và password sẽ được truyền tới trang doSignin.php. Giả sử username và password đúng với dữ liệu trong database thì web sẽ cho phép ta đang nhập và tạo ra session có tên 'statusLogin' và lưu trữ trên server.

Chú ý: ob_start(); là một hàm hỗ trợ cache dữ liệu. Nhiệm vụ lưu trữ dữ liệu và truyền dữ liệu sang trang khác đồng thời chuyển hướng đến trang đó bằng dòng code sau header("location:addressOfPage.php");

Cookie là gì?

  • Khác với session, cookie được tạo ra và lưu trữ tại client nói rõ hơn là tại máy tính hoặc các thiết bị khác của chúng ta. Một cookie được tạo ra có thời gian sống nhất định tùy thuộc vào người lập trình ,chức năng và vai trò của nó trong website.
  • Chức năng của cookie khá giống với session. Một ứng dụng đơn giản, dễ hiểu nhất của cookie là tự động đăng nhập tài khoản hoặc lưu thông tin username và password trên website mà khi ta tắt trình duyệt web thậm chí restart máy thì cookie vẫn không bị hủy. Cookie được gửi tự động lên server khi ta truy cập vào website để thực hiện việc đăng nhập.

Cách khởi tạo cookie

setcookie('cookie_name', 'hoang', time()+7200);

'cookie_name' là tên của key, và  'hoang' là value, time()+7200 là thời gian tồn tại của cookie, trong trường hợp này time() là thời gian hiện tại và được cộng thêm 2 tiếng, tức là cookie này sẽ có thời gian sống là 2 tiếng.

Để hủy một cookie ta cũng sử dụng lại dòng code trên trên nhưng là đặt thời gian là time()-7200.

setcookie('cookie-name', 'hoang', time()-7200);

Xét một ví dụ về cookie

[1] Tạo một form đăng nhập signin_page.php

<html>
	<head>
		<title>Login</title>
	</head>
	<body>
		<form method="post" action="doSignin.php">
			<input name="username" placeholder="Username" type="text"/>
			<input name="password" placeholder="Password" type="password"/>
			<label>
				<input name="remember" type="checkbox" value="" />
				Remember Me
			</label>
			<input type="submit" name="submit" value="Login"/>
		</form>
	</body>
</html>

Trong trường hợp này tại phần xử lý doSignin.php chúng ta kiểm tra xem nếu $_POST['remember'] tồn tại tức là ở bên form đăng nhập chúng ta có chọn vào checkbox Remember Me thì website sẽ tạo ra một cookie để lưu trữ vào máy tính. Còn nếu không thì chỉ tạo ra một session (xem lại phần Session).

ss_2

[2] Tiếp đến tạo một trang doSignin.php

<?php
	session_start();
	ob_start();
	
	// TODO: CHECK SIGNED IN
	if ((isset($_SESSION['ss_statusLogin']) &&
			$_SESSION['ss_statusLogin'] == 'YES) ||
		(isset($_COOKIE['cc_statusLogin']) &&
			$_COOKIE['cc_statusLogin'] == 'YES))
	{
		header("location:user_info.php");
	}
	
	// TODO: SIGN IN
	isSignedin = DoSignIn($_POST['username'], $_POST['password']);
	
	if (isSignedin == TRUE)
	{
		if(isset($_POST['remember']))
		{
			setcookie('cc_statusLogin', 'YES', time()+7200);
		}
		else
		{
			$_SESSION['ss_statusLogin'] = 'YES';
		}
	}
?>

Ta có thể tạo thêm trang user_info.php và trong trang này ta có thể kiểm tra đăng nhập trước khi hiện thông tin của họ bằng đoạn mã sau:

<?php
	session_start();
	ob_start();
	
	// TODO: CHECK SIGNED IN
	if ((!isset($_SESSION['ss_statusLogin']) ||
			$_SESSION['ss_statusLogin'] == 'NO') &&
		(!isset($_COOKIE['cc_statusLogin']) ||
			$_COOKIE['cc_statusLogin'] == 'NO'))
	{
		header("location:signin_page.php");
	}

	// SIGNED IN, SHOW INFO
?>

Ở trên thời gian sống của cookie là 1 tuần, mỗi lần truy cập vào trang web cookie sẽ được gửi lên server và đăng nhập vào hệ thống bằng chính cookie này.

Bạn cần hỗ trợ các dự án kết nối không dây?

Quí doanh nghiệp, cá nhân cần hỗ trợ, hợp tác các dự án IoT, kết nối không dây. Vui lòng liên hệ, hoặc gọi trực tiếp 0942.111912.

  • TỪ KHÓA
  • Arduino
  • ESP32
  • ESP8266
  • Wifi
  • Bluetooth
  • Zigbee
  • Raspberry Pi
THẢO LUẬN
ĐÓNG