การเก็บสถานะของผู้ติดต่อกับเว็บเซอร์เวอร์ เพื่อให้รู้ใครเป็นใคร เนื่องจากผู้ติดต่อจำนวนมากกับเว็บเซิร์บเวอร์ การเก็บสถานะปัจจุบันของผู้ติดต่อแต่ละราย เพื่อให้ตอบสนองได้ตรงรายเดิม จะต้องมีอะไรบางอย่างจำจดผู้ติดต่อแต่ละรายได้ การทำให้จดจำแต่ละรายขณะที่ติดต่อได้จะต้องเก็บสถานะของผู้ติดต่อไว้ การเก็บสถานะเก็บได้สองทางคือเก็บข้อมูลสถานะไว้ที่เซิร์บเวอร์ กับเก็บไว้ที่ผู้ติดต่อ ซึ่งมีชื่อสถานะว่า Session สำหรับสถานะที่เซิร์บเวอร์ และชื่อว่า Cookies สำหรับการเก็บที่เว็บไคลเอ็นท์ เราจะเริ่มทำความเข้าใจกับ Session ก่อน และต่อด้วย Cookies
Session เป็นเก็บข้อมูลสถานะการใช้งานเว็บไซต์ของผู้ใช้ปัจจุบัน เพื่อแยกใครเป็นผู้ใช้งานในแต่ละเครื่อง ทำให้เซิร์บเวอร์เลือกตอบสนองให้กับผู้ใช้งานปัจจุบันได้อย่างถูกต้อง โดยค่าปริยายแล้ว Laravel เลือกเก็บ Session ในรูปแบบไฟล์ ดูได้ที่ storage/framework/sessions ซึ่งเป็นวิธีอย่างง่าย และเหมาะกับขั้นตอนการพัฒนา หากต้องการเก็บข้อมูล Session ในรูปแบบอื่นที่เหมาะสมกว่าก็ทำได้ เช่น Database, Redis หรือฐานข้อมูลเฉพาะอื่น การเก็บในรูปแบบอื่น เหมาะการกำหนดค่า Authentication
อย่างไรก็ตามคำสั่งการทำงานเก็บ Session ของรูปแบบไฟล์ ก็ยังคงเหมือนเดิม และใช้กับการเก็บข้อมูลแบบอื่น ๆ ได้ ในการศึกษานี้จะใช้รูปแบบการเก็บแบบไฟล์เพื่อความเข้าใจเบื้องต้น
การดำเนินการกับ Session
เราจะสมมุติเหตุการณ์การเข้าระบบ (login) โดยเมื่อเริ่มต้นสร้างเว็บแอปพลิเคชัน จะมีหน้า welcome ให้มา ด้วยแล้ว เมื่อเพิ่มการทำงานจะมีหน้า welcome แสดงเป็นหน้าเริ่มต้น แต่เพื่อทดสอบการใช้งาน session เราจะป้องกันการเข้าหน้า welcome ไม่ให้เปิดทำงานเป็นหน้าแรก โดยผู้ใช้งานจะต้องผ่านการ เข้าระบบก่อน โดยการใส่รหัสผ่าน ในหน้า login เมื่อเข้าระบบผ่าน ก็จะให้เก็บ Session ในชื่อ user ดั้งนั้นแล้ว หากผู้เข้าระบบมี session แล้ว ต่อไป ก็ไม่ต้องผ่านหน้า login อีกต่อไป
Session ในที่นี้คือที่เก็บค่าชั่วคราว โดยค่าปริยายกำหนดไว้ 120 นาที (2 ชั่วโมง) ถึงแม้จะปิดเบราเซอร์แล้วก็ตาม อย่างไรก็ตามเราสามารถเข้าไปแก้ไขจำนวนเวลาได้ที่ไฟล์ config/session.php
'lifetime' => env('SESSION_LIFETIME', 120),
'expire_on_close' => false,
เราจะเริ่มจาก การสร้างหน้าเว็บ login และสร้างเส้นทางเสียใหม่
Code 1. resources/views/login.blade.php
<!doctype html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link type="text/css"
href="bootstrap/css/bootstrap.min.css" rel="stylesheet">
<script src="js/jquery-3.6.3.min.js"></script>
</head>
<body>
<div style="width:500px; margin:20px auto">
<h2>Login</h2>
<form method="POST" action="/login">
@csrf
<div class="mb-3 row">
<label class="col-sm-2 col-form-label">Email</label>
<div class="col-sm-10">
<input type="email" name="email" class="form-control">
</div>
</div>
<div class="mb-3 row">
<label class="col-sm-2 col-form-label">Password</label>
<div class="col-sm-10">
<input type="password" name="password"
class="form-control" autocomplete="off">
</div>
</div>
<div>
<button type="submit" class="btn btn-primary"
style="float:right">Submit</button>
</div>
</form>
</div>
</body>
</html>
สำหรับหน้า login นี้จะมี input รับอีเมล และ รหัสผ่าน แต่ละ input จะมีชื่อเป็น email และ pass ซึ่งชื่อนี้จะถูกส่งไปยังเซิร์บเวอร์ในรูปแบบอาร์เรย์แบบมีคีย์ เตามปกติจะใช้ ชื่อ $_POST['eamil'] แต่สำหรับ Laravel จะใช้ผ่าน Request ซึ่งต้องนำเข้าคลาสนี้ แล้วเรียกใช้ผ่านตัวแปรนี้ เช่น $request→input('email') ดังนั้น การใส่ชื่อในทุก input จึงสำคัญต่อการอ้างอิงตัวแปร
นอกจากนี้ ฟอร์มนี้ จะส่งข้อมูลแบบ POST และส่งไปยังเส้นทาง login ที่กำกับไว้บน