JSP - การติดตามเซสชัน
ในบทนี้เราจะพูดถึงการติดตามเซสชันใน JSP HTTP เป็นโปรโตคอล "ไร้สถานะ" ซึ่งหมายความว่าทุกครั้งที่ไคลเอนต์เรียกค้นเว็บเพจไคลเอนต์จะเปิดการเชื่อมต่อแยกกับเว็บเซิร์ฟเวอร์และเซิร์ฟเวอร์จะไม่เก็บบันทึกคำขอของไคลเอ็นต์ก่อนหน้าโดยอัตโนมัติ
การบำรุงรักษาเซสชันระหว่างเว็บไคลเอนต์และเซิร์ฟเวอร์
ตอนนี้ให้เราพูดถึงตัวเลือกสองสามอย่างในการรักษาเซสชันระหว่างไคลเอนต์เว็บและเว็บเซิร์ฟเวอร์ -
คุ้กกี้
เว็บเซิร์ฟเวอร์สามารถกำหนดรหัสเซสชันที่ไม่ซ้ำกันเป็นคุกกี้ให้กับเว็บไคลเอ็นต์แต่ละรายและสำหรับคำขอที่ตามมาจากไคลเอ็นต์จะสามารถรับรู้ได้โดยใช้คุกกี้ที่ได้รับ
นี่อาจไม่ใช่วิธีที่มีประสิทธิภาพเนื่องจากบางครั้งเบราว์เซอร์ไม่รองรับคุกกี้ ไม่แนะนำให้ใช้ขั้นตอนนี้เพื่อรักษาเซสชัน
ฟิลด์แบบฟอร์มที่ซ่อนอยู่
เว็บเซิร์ฟเวอร์สามารถส่งฟิลด์ฟอร์ม HTML ที่ซ่อนอยู่พร้อมกับรหัสเซสชันที่ไม่ซ้ำกันดังต่อไปนี้ -
<input type = "hidden" name = "sessionid" value = "12345">
รายการนี้หมายความว่าเมื่อส่งแบบฟอร์มชื่อและค่าที่ระบุจะรวมอยู่ในไฟล์ GET หรือ POSTข้อมูล. ทุกครั้งที่เว็บเบราว์เซอร์ส่งคำขอกลับไฟล์session_id สามารถใช้ค่าเพื่อติดตามเว็บเบราว์เซอร์ต่างๆ
นี่อาจเป็นวิธีที่มีประสิทธิภาพในการติดตามเซสชัน แต่การคลิกลิงก์ไฮเปอร์เท็กซ์ปกติ (<A HREF...>) จะไม่ส่งผลให้มีการส่งแบบฟอร์มดังนั้นฟิลด์แบบฟอร์มที่ซ่อนอยู่จึงไม่สามารถรองรับการติดตามเซสชันทั่วไปได้
การเขียน URL ใหม่
คุณสามารถเพิ่มข้อมูลเพิ่มเติมบางส่วนต่อท้าย URL แต่ละรายการได้ ข้อมูลนี้ระบุเซสชัน เซิร์ฟเวอร์สามารถเชื่อมโยงตัวระบุเซสชันนั้นกับข้อมูลที่จัดเก็บเกี่ยวกับเซสชันนั้น
ตัวอย่างเช่นด้วย http://tutorialspoint.com/file.htm;sessionid=12345ตัวระบุเซสชันจะแนบเป็น sessionid = 12345 ซึ่งสามารถเข้าถึงได้ที่เว็บเซิร์ฟเวอร์เพื่อระบุไคลเอ็นต์
การเขียน URL ใหม่เป็นวิธีที่ดีกว่าในการรักษาเซสชันและทำงานกับเบราว์เซอร์เมื่อไม่รองรับคุกกี้ ข้อเสียเปรียบคือคุณจะต้องสร้างทุก URL แบบไดนามิกเพื่อกำหนดรหัสเซสชันแม้ว่าหน้าจะเป็นหน้า HTML แบบคงที่แบบธรรมดา
วัตถุเซสชัน
นอกเหนือจากตัวเลือกที่กล่าวถึงข้างต้น JSP ยังใช้ servlet ที่มีให้ HttpSession Interface อินเทอร์เฟซนี้มีวิธีระบุตัวผู้ใช้
- คำขอหน้าเดียวหรือ
- เยี่ยมชมเว็บไซต์หรือ
- จัดเก็บข้อมูลเกี่ยวกับผู้ใช้นั้น
โดยค่าเริ่มต้น JSPs จะเปิดใช้งานการติดตามเซสชันและอ็อบเจ็กต์ HttpSession ใหม่ถูกสร้างอินสแตนซ์สำหรับไคลเอ็นต์ใหม่แต่ละตัวโดยอัตโนมัติ การปิดใช้งานการติดตามเซสชันจำเป็นต้องปิดการใช้งานอย่างชัดเจนโดยตั้งค่าแอตทริบิวต์เซสชันคำสั่งเพจเป็นเท็จดังนี้ -
<%@ page session = "false" %>
เอ็นจิน JSP เปิดเผยอ็อบเจ็กต์ HttpSession ไปยังผู้เขียน JSP ผ่านทางนัย sessionวัตถุ. ตั้งแต่session ออบเจ็กต์ถูกจัดเตรียมให้กับโปรแกรมเมอร์ JSP แล้วโปรแกรมเมอร์สามารถเริ่มจัดเก็บและดึงข้อมูลจากอ็อบเจ็กต์ได้ทันทีโดยไม่ต้องเริ่มต้นหรือ getSession().
นี่คือบทสรุปของวิธีการที่สำคัญที่มีอยู่ในวัตถุเซสชัน -
ส. | วิธีการและคำอธิบาย |
---|---|
1 |
public Object getAttribute(String name) เมธอดนี้จะส่งคืนอ็อบเจ็กต์ที่ถูกผูกไว้กับชื่อที่ระบุในเซสชันนี้หรือ null ถ้าไม่มีอ็อบเจ็กต์ถูกผูกไว้ภายใต้ชื่อ |
2 |
public Enumeration getAttributeNames() วิธีนี้จะส่งคืนอ็อบเจ็กต์ Enumeration ของ String ที่มีชื่อของอ็อบเจ็กต์ทั้งหมดที่เชื่อมโยงกับเซสชันนี้ |
3 | public long getCreationTime() วิธีนี้จะคืนค่าเวลาที่สร้างเซสชันนี้โดยวัดเป็นมิลลิวินาทีนับตั้งแต่เที่ยงคืน 1 มกราคม 1970 GMT |
4 | public String getId() วิธีนี้ส่งคืนสตริงที่มีตัวระบุเฉพาะที่กำหนดให้กับเซสชันนี้ |
5 | public long getLastAccessedTime() วิธีนี้ส่งคืนครั้งสุดท้ายที่ไคลเอ็นต์ส่งคำขอที่เกี่ยวข้องกับเซสชันนี้เป็นจำนวนมิลลิวินาทีตั้งแต่เที่ยงคืน 1 มกราคม 1970 GMT |
6 | public int getMaxInactiveInterval() วิธีนี้จะคืนค่าช่วงเวลาสูงสุดเป็นวินาทีที่คอนเทนเนอร์ servlet จะเปิดเซสชันนี้ไว้ระหว่างการเข้าถึงไคลเอ็นต์ |
7 | public void invalidate() วิธีนี้ทำให้เซสชันนี้เป็นโมฆะและเลิกผูกวัตถุใด ๆ ที่ผูกไว้กับมัน |
8 | public boolean isNew() วิธีนี้จะคืนค่าจริงหากลูกค้ายังไม่ทราบเกี่ยวกับเซสชันหรือหากลูกค้าเลือกที่จะไม่เข้าร่วมเซสชัน |
9 | public void removeAttribute(String name) วิธีนี้จะลบอ็อบเจ็กต์ที่ผูกกับชื่อที่ระบุออกจากเซสชันนี้ |
10 | public void setAttribute(String name, Object value) วิธีนี้ผูกอ็อบเจ็กต์กับเซสชันนี้โดยใช้ชื่อที่ระบุ |
11 | public void setMaxInactiveInterval(int interval) วิธีนี้ระบุเวลาเป็นวินาทีระหว่างคำขอของไคลเอ็นต์ก่อนที่คอนเทนเนอร์ servlet จะทำให้เซสชันนี้เป็นโมฆะ |
ตัวอย่างการติดตามเซสชัน
ตัวอย่างนี้อธิบายถึงวิธีการใช้วัตถุ HttpSession เพื่อค้นหาเวลาสร้างและเวลาที่เข้าถึงล่าสุดสำหรับเซสชัน เราจะเชื่อมโยงเซสชันใหม่กับคำขอหากไม่มีอยู่แล้ว
<%@ page import = "java.io.*,java.util.*" %>
<%
// Get session creation time.
Date createTime = new Date(session.getCreationTime());
// Get last access time of this Webpage.
Date lastAccessTime = new Date(session.getLastAccessedTime());
String title = "Welcome Back to my website";
Integer visitCount = new Integer(0);
String visitCountKey = new String("visitCount");
String userIDKey = new String("userID");
String userID = new String("ABCD");
// Check if this is new comer on your Webpage.
if (session.isNew() ){
title = "Welcome to my website";
session.setAttribute(userIDKey, userID);
session.setAttribute(visitCountKey, visitCount);
}
visitCount = (Integer)session.getAttribute(visitCountKey);
visitCount = visitCount + 1;
userID = (String)session.getAttribute(userIDKey);
session.setAttribute(visitCountKey, visitCount);
%>
<html>
<head>
<title>Session Tracking</title>
</head>
<body>
<center>
<h1>Session Tracking</h1>
</center>
<table border = "1" align = "center">
<tr bgcolor = "#949494">
<th>Session info</th>
<th>Value</th>
</tr>
<tr>
<td>id</td>
<td><% out.print( session.getId()); %></td>
</tr>
<tr>
<td>Creation Time</td>
<td><% out.print(createTime); %></td>
</tr>
<tr>
<td>Time of Last Access</td>
<td><% out.print(lastAccessTime); %></td>
</tr>
<tr>
<td>User ID</td>
<td><% out.print(userID); %></td>
</tr>
<tr>
<td>Number of visits</td>
<td><% out.print(visitCount); %></td>
</tr>
</table>
</body>
</html>
ตอนนี้ใส่รหัสด้านบน main.jsp และพยายามเข้าถึง http://localhost:8080/main.jsp. เมื่อคุณเรียกใช้ URL คุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
ยินดีต้อนรับสู่เว็บไซต์ของฉัน
Session Information
ข้อมูลเซสชัน | มูลค่า |
---|---|
id | 0AE3EC93FF44E3C525B4351B77ABB2D5 |
เวลาสร้าง | อ. 08 มิ.ย. 17:26:40 GMT + 04: 00 2010 |
เวลาเข้าถึงล่าสุด | อ. 08 มิ.ย. 17:26:40 GMT + 04: 00 2010 |
รหัสผู้ใช้ | เอบีซีดี |
จำนวนการเข้าชม | 0 |
ตอนนี้ลองเรียกใช้ JSP เดียวกันเป็นครั้งที่สองคุณจะได้รับผลลัพธ์ต่อไปนี้
ยินดีต้อนรับกลับสู่เว็บไซต์ของฉัน
Session Information
ประเภทข้อมูล | มูลค่า |
---|---|
id | 0AE3EC93FF44E3C525B4351B77ABB2D5 |
เวลาสร้าง | อ. 08 มิ.ย. 17:26:40 GMT + 04: 00 2010 |
เวลาเข้าถึงล่าสุด | อ. 08 มิ.ย. 17:26:40 GMT + 04: 00 2010 |
รหัสผู้ใช้ | เอบีซีดี |
จำนวนการเข้าชม | 1 |
การลบข้อมูลเซสชัน
เมื่อคุณดำเนินการกับข้อมูลเซสชันของผู้ใช้เสร็จแล้วคุณมีหลายตัวเลือก -
Remove a particular attribute - คุณสามารถโทร public void removeAttribute(String name) วิธีการลบค่าที่เกี่ยวข้องกับคีย์เฉพาะ
Delete the whole session - คุณสามารถโทร public void invalidate() วิธีการทิ้งเซสชันทั้งหมด
Setting Session timeout - คุณสามารถโทร public void setMaxInactiveInterval(int interval) วิธีการตั้งค่าระยะหมดเวลาสำหรับแต่ละเซสชัน
Log the user out - เซิร์ฟเวอร์ที่รองรับ servlets 2.4 คุณสามารถโทร logout เพื่อล็อกไคลเอนต์ออกจากเว็บเซิร์ฟเวอร์และทำให้เซสชันทั้งหมดที่เป็นของผู้ใช้ทั้งหมดเป็นโมฆะ
web.xml Configuration - หากคุณใช้ Tomcat นอกเหนือจากวิธีการข้างต้นคุณสามารถกำหนดค่าการหมดเวลาของเซสชันในไฟล์ web.xml ได้ดังนี้
<session-config>
<session-timeout>15</session-timeout>
</session-config>
การหมดเวลาจะแสดงเป็นนาทีและแทนที่การหมดเวลาเริ่มต้นซึ่งเป็น 30 นาทีใน Tomcat
getMaxInactiveInterval( )วิธีการใน servlet ส่งคืนช่วงหมดเวลาสำหรับเซสชันนั้นเป็นวินาที ดังนั้นหากกำหนดค่าเซสชันของคุณใน web.xml เป็นเวลา 15 นาทีgetMaxInactiveInterval( ) ส่งคืน 900