วันจันทร์ที่ 13 กันยายน พ.ศ. 2553

การใช้ session จดจำข้อมูล

เราสามารถใช้วัตถุแฝง session จดจำข้อมูลได้คล้ายกับคุ๊กกี้ แต่แทนที่จะซ่อนข้อมูลเก่าไว้
ในฮาร์ดดิสก์ของผู้เยี่ยมชมจะใช้การเก็บข้อมูลไว้บนฝั่งเวบเซิร์ฟเวอร์แทน ข้อดีของการทำ
แบบนี้ก็คือ ในบางครั้งผู้เยี่ยมชมที่เป็นห่วงเรื่องของความปลอดภัยและความเป็นส่วนตัวจึง
กำหนดให้เบราเซอร์บนเครื่องคอมพิวเตอร์ของตนไม่ให้รับคุ๊กกี้จากเวบไซต์ การใช้ session
ทำงานแทนคุ๊กกี้จะไม่มีปัญหาตรงจุดนี้เพราะไม่มีการหยอดคุ๊กกี้ลงบนเบราเซอร์ของผู้เยี่ยม
ชมแต่ประการใด
อย่างไรก็ดี วัตถุแฝง session มี scope เป็นแบบ session ดังนั้นจึงจดจำข้อมูลของผู้เยี่ยม
ชมได้เฉพาะชั่วขณะที่ผู้เยี่ยมชมยังติดต่อกับเวบไซต์อยู่หรือตราบเท่าที่ยังไม่ปิดเบราเซอร์
เมื่อผู้เยี่ยมชมปิดการทำงานของเบราเซอร์ข้อมูลเหล่านั้นก็จะหายไป ดังนั้นการใช้ session
เก็บข้อมูลอาจจะไม่เหมาะกับการจดจำชื่อสมาชิกและรหัสลับอย่างในกรณีของคุ๊กกี้ในตัว
อย่างที่ผ่านมา แต่จะเหมาะกับการใช้จดจำว่าผู้เยี่ยมชมรายใดได้ล็อกอินไปแล้วบ้าง ตราบ
เท่าที่ผู้เยี่ยมชมรายนั้นยังไม่ปิดเบราเซอร์ผู้เยี่ยมชมไม่ต้องล็อกอินอีก

เราจะลองใช้ session กับระบบสมาชิกที่เราได้สร้างไว้ก่อนหน้านี้ โดย session จะทำหน้าที่
จดจำเบราเซอร์ที่ล็อกอินแล้ว เมื่อเวลาที่ผู้เยื่ยมชมต้องการข้ามไปดูเวบหน้าอื่น เวบหน้า
นั้นๆ จะตรวจสอบว่าผู้เยี่ยมชมล็อกอินแล้วหรือยังด้วยการสืบค้นจาก session
วัตถุแฝง session มีแมธธอสชื่อ setAttribute() และ getAttribute() ซึ่งใช้บันทึกและเรียกดู
ข้อมูลอะไรก็ได้ ดูไปแล้วก็คล้ายกับคุ๊กกี้ ลองพิจารณาโปรแกรมที่ปรับปรุงใหม่ต่อไปนี้

<% String username = request.getParameter("username");
String password = request.getParameter("password");
%>
<html>
<title>Login</title>
<body>
<% if (username.equals("Songkarn")&&password.equals("12345")) {
session.setAttribute("isLoggedin","yes");
%>
Login successful.
<% } else { %>
Login failed.
<% } %>
</body>
</html>

โปรแกรมนี้เหมือนกับโปรแกรมที่ 8-2 เพียงแต่เมื่อพบว่าชื่อและรหัสสมาชิกถูกต้อง ให้สร้าง
ตัวเก็บข้อมูลชื่อ isLoggedin ขึ้นมาโดยกำหนดให้มีค่าเท่ากับ yes ด้วยคำสั่ง setAttribute()
ตัวเก็บข้อมูลนี้จะคงอยู่ตราบเท่าที่ผู้เยี่ยมชมผู้นี้ยังไม่ปิดการทำงานของเบราเซอร์
คราวนี้เวบหน้าใดก็ตามที่เราไม่ต้องการให้ผู้เยี่ยมชมดูได้โดยไม่ล็อกอินก่อน ก็สามารถ
ตรวจสอบการล็อกอินของผู้ที่เข้ามาด้วยการใช้แมธธอส getAttribute() เพื่อตรวจดูว่า
session ของผู้เยี่ยมชมรายนั้นๆ มีตัวเก็บข้อมูลชื่อ isLoggedin อยู่หรือไม่ และมีค่าเท่ากับ
yes หรือเปล่า
ลองสร้างไฟล์ .jsp ขึ้นมาไฟล์หนึ่งโดยสมมติว่าเป็นเวบเพจหน้าที่ต้องการมีการล็อกอินก่อน
ซึ่งจะดูได้ ดังนี้


<% String isLoggedin = new String();
if (session.getAttribute(“isLoggedin”)!=null) isLoggedin =
(String)session.getAttribute(“isLoggedin”);
%>
<html>
<title>Sample Page</title>
<body>
<% if (isLoggedin.equals(“yes”)) { %>
Welcome. You are authorized to view this page. <br>
The money in your account is now $500.00.
<% } else { %>
Sorry. You haven’t logged in.<br>
<a href=”login03.jsp”>Click here to log in.</a>
<% } %>
</body>
</html>

ในส่วนต้นของโปรแกรมนี้เป็นการตรวจสอบดูว่ามีตัวเก็บข้อมูลของ session ที่ชื่อ
isLoggedin อยู่หรือไม่ ถ้ามี ให้รับค่าของมันมาใส่ไว้ในตัวแปรสตริงชื่อเดียวกัน จากนั้นทำ
การตรวจสอบดูว่ามีค่าเป็น yes หรือไม่ ถ้าใช่ก็ให้แสดงเวบเพจหน้านั้น แต่ถ้าไม่ ก็ให้เตือน
ผู้เยี่ยมชมว่ายังไม่ได้ล็อกอินแทน
ลองสร้างไฟล์ชื่อ login03.jsp ขึ้นมาโดยมีเนื้อหาเหมือนโปรแกรมที่ 8-1 แต่เปลี่ยนพารา
มิเตอร์ action ให้มีค่าเป็น auth03.jsp ดังนี้

<% String username = new String();
String password = new String();
%>
<html>
<title>Login</title>
<body>
<form method="post" action="auth03.jsp">
Username : <input type="text" name="username" value="<%=username%>"><br>
Password : <input type="password"
name="password"value="<%=password%>"><br>
<input type="submit">
</form>
</body>
</html>

ลองใส่ชื่อ Songkarn และรหัสลับ 12345 ลงไปแล้วคลิก Submit Query มันจะเรียกไฟล์
auth03.jsp มาตอบสนอง

ตอนนี้ session ได้สร้างและเก็บ isLoggedin ที่มีค่าเท่ากับ yes ไว้แล้ว ให้ลองทดสอบโดย
การเรียกไฟล์ sample01.jsp จะได้ผลดังนี้

แต่ถ้าลองปิดเบราเซอร์แล้วเปิดใหม่ แล้วเรียกไฟล์ sample01.jsp อีกที คราวนี้จะพบว่าเข้า
ไม่ได้แล้ว เพราะ isLoggedin ตัวที่มีอยู่ตายไปพร้อมกับการปิดเบราเซอร์ ผู้เยี่ยมชมต้องทำ
การล็อกอินใหม่
แน่นอนระบบล็อกอินจริงๆ มีความซับซ้อนกว่านี้ นี่เป็นเพียงตัวอย่างเพื่อให้เข้าใจว่าเราจะ
ใช้ session จดจำข้อมูลได้อย่างไรเท่านั้น