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

คุ๊กกี้

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

Cookie
คุ๊กกี้เป็นวัตถุบนเจเอสพี คลาสที่นิยามคุ๊กกี้ได้แก่คลาส Cookie ซึ่งมีวิธีการตั้งชื่อคุ๊กกี้และ
กำหนดค่าให้กับคุ๊กกี้ด้วยการประกาศวัตถุของคลาสคุ๊กกี้ ตัวอย่างเช่น
Cookie cookie = new Cookie(“name”, “Songkarn”);
เป็นการประกาศวัตถุชื่อ cookie ของคลาส Cookie โดยให้คุ๊กกี้นี้มีชื่อเรียกว่า name และมี
ค่าเท่ากับ Songkarnเวลาเราจะหยอดคุ๊กกี้ลงบนเบราเซอร์ของผู้เยี่ยมชม เราอาศัยแมธธอสของวัตถุแฝง
response ชื่อ addCookie() ซึ่งจะทำให้เบราเซอร์สร้างไฟล์คุ๊กกี้ที่เก็บค่าของคุ๊กกี้เอาไว้บน
ฮาร์ดดิสก์ของผู้เยี่ยมชม แต่ก่อนจะหยอดคุ๊กกี้จำเป็นที่จะต้องกำหนดวันหมดอายุของคุ๊กกี้
ก่อน คุ๊กกี้ทุกอันที่เราหยอดจะมีวันหมดอายุของมันอยู่เพื่อมิให้ข้อมูลในคุ๊กกี้เก่าเกินไป อายุ
ของคุ๊กกี้นับเป็นวินาทีนับจากวินาทีที่หยอดคุ๊กกี้ และเราใช้แมธธอส setMaxAge() ของ
คลาส Cookie ในการกำหนดวันหมดอายุ เช่น
cookie.setMaxAge(60*60*24*30);
เป็นการกำหนดให้คุ๊กกี้ที่ชื่อ cookie มีอายุ 30 วันนับจากวันที่หยอด
ตัวอย่างง่ายๆ สมมติว่าเวบไซต์ของคุณมีระบบสมาชิก ซึ่งทุกครั้งที่ผู้เยี่ยมชมเข้ามาในเวบ
ไซต์จะต้องระบุชื่อสมาชิกและรหัสผ่าน ถ้าผู้เยี่ยมชมเข้ามาทุกวันวันละหลายหน บางทีผู้
เยี่ยมชมอาจรู้สึกรำคาญที่ต้องคอยกรอกชื่อสมาชิกอยู่ตลอดเวลา เราจะลองแก้ปัญหานี้ด้วย
การใช้คุ๊กกี้ในการจดจำชื่อสมาชิกในการกรอกรหัสผ่านครั้งแรกของผู้เยี่ยมชม เพื่อที่ในการ
เยี่ยมชมครั้งต่อไปจะมีชื่อสมาชิกและรหัสเก่าโผล่ออกมารอไว้เลย ผู้เยี่ยมชมเพียงแต่กดปุ่ม
ยืนยันอย่างเดียวก็พอ
เริ่มด้วยการสร้างแบบฟอร์มระบบสมาชิกก่อน

<html>
<title>Login</title>
<body>
<form method=”post” action=”auth01.jsp”>
Username : <input type=”text” name=”username”><br>
Password : <input type=”password” name=”password”><br>
<input type=”submit”>
</form>
</body>
</html>

จากนั้นก็สร้างไฟล์ auth01.jsp ขึ้นมารับมือ ลองดูแบบที่ยังไม่มีคุ๊กกี้ก่อนเพื่อความเข้าใจ

<% String username = request.getParameter(“username”);
String password = request.getParameter(“password”);
%>
<html>
<title>Login</title>
<body>
<% if (username.equals(“Songkarn”)&&password.equals(“12345”)) { %>
Login successful.
<% } else { %>
Login failed.
<% } %>
</body>
</html>

โปรแกรมนี้รับค่า username และ password จากฟอร์มมาเปรียบเทียบ ถ้าชื่อสมาชิกคือ
songkarn และ รหัสผ่านคือ 12345 มันจะแสดงข้อความว่าล็อกอินสำเร็จ มิฉะนั้นจะแสดงข้อ
ความว่าการล็อกอินล้มเหลว (ระบบสมาชิกจริงๆ ซับซ้อนกว่านี้มาก แต่เรายังไม่ขอลงราย
ละเอียด เพราะบทนี้เราสนใจแต่เรื่องการทำคุ๊กกี้)

ที่นี้เราจะเติมคุ๊กกี้ลงไปเพื่อให้ระบบสมาชิกจดจำชื่อสมาชิกที่เคยล็อกอินได้ด้วย เริ่มจากการ
หยอดคุ๊กกี้ก่อนดังนี้

<% String username = request.getParameter("username");
String password = request.getParameter("password");
Cookie cookie = new Cookie("username",username);
cookie.setMaxAge(60*60*24*30);
response.addCookie(cookie);
cookie = new Cookie("password",password);
cookie.setMaxAge(60*60*24*30);
response.addCookie(cookie);
%>
<html>
<title>Login</title>
<body>
<% if (username.equals("Songkarn")&&password.equals("12345")) { %>
Login successful.
<% } else { %>
Login failed.
<% } %>
</body>
</html>

โปรแกรมนี้แทนที่จะรับข้อมูลจากฟอร์มมาเฉยๆ ก็จดใส่คุ๊กกี้ลงไปด้วย คุ๊กกี้ทั้งสองตัวจะมี
อายุอยู่บนเครื่องคอมพิวเตอร์ของนายสงกรานต์เป็นเวลา 30 วัน
คราวนี้ก็มาแก้ฟอร์มสมาชิกใหม่ให้มองหาคุ๊กกี้ในเครื่องคอมพิวเตอร์ก่อน ถ้าพบคุ๊กกี้ที่มีชื่อ
ว่า username และ password ก็ให้นำมากรอกไว้ในแบบฟอร์มรอไว้ให้เลย ดังนี้

<% String username = new String();
String password = new String();
Cookie[] cookies;
Cookie cookie;
cookies = request.getCookies();
if (cookies!=null) {
for (int i = 0; i < cookies.length; i++) {
cookie = cookies[i];
if ("username".equals(cookie.getName())) {
username = cookie.getValue();
}
if ("password".equals(cookie.getName())) {
password = cookie.getValue();
}
}
}
%>
<html>
<title>Login</title>
<body>
<form method="post" action="auth02.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>

วัตถุแฝง request มีแมธธอสชื่อ getCookies() ซึ่งจะคืนค่าของคุ๊กกี้ทุกตัวในฮาร์ดดิสก์ของผู้
เยี่ยมชมมาให้ในรูปของอะเรย์ Cookies[ ] หน้าที่ของเราก็คือตรวจสอบดูว่ามีคุ๊กกี้ตัวไหน
บ้างที่มีชื่อว่า username หรือ password ถ้าพบก็ให้นำค่าของมันมากำหนดค่าให้กับ ตัว
แปรสตริงที่เราสร้างขึ้นมาชื่อว่า username และ password แมธธอสที่ใช้ในการอ่านชื่อและ
ค่าของคุ๊กกี้ได้แก่ getName() และ getValue() ตามลำดับ เมื่อได้ค่าของ username และ
password ซึ่งเหมือนกับชื่อสมาชิกและรหัสผ่านที่เคยใช้แล้ว เราก็นำค่าของมันมากำหนดให้
เป็นค่าปกติของฟอร์มด้วยการกำหนดให้กับพารามิเตอร์ value เช่นนี้แล้ว หากผู้เยี่ยมชม
กลับเข้ามาตอบคำถามในหน้าเดิมอีก ชื่อเก่าของผู้เยี่ยมชมจะปรากฏขึ้นเองในช่องของชื่อผู้
ตอบคำถาม ทำให้ผู้เยี่ยมชมไม่ต้องเสียเวลากรอกชื่อสมาชิกและรหัสซ้ำอีก


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