HTTP เป็นโปรโตคอลไร้สถานะ ซึ่งหมายความว่าทุกครั้งที่ไคลเอนต์ดึงข้อมูลเว็บเพจ การเชื่อมต่อเซิร์ฟเวอร์แยกต่างหากจะถูกเปิดขึ้น ดังนั้นเซิร์ฟเวอร์จึงไม่บันทึกข้อมูลใด ๆ จากคำขอของไคลเอนต์ก่อนหน้านี้
มีสามวิธีในการรักษาเซสชันไคลเอ็นต์-เซิร์ฟเวอร์:
เว็บเซิร์ฟเวอร์สามารถกำหนด ID เซสชันที่ไม่ซ้ำกันเป็นคุกกี้เพื่อเป็นตัวแทนของไคลเอนต์แต่ละรายและระบุคำขอที่ตามมาจากไคลเอนต์นั้น
นี่อาจไม่ใช่วิธีที่มีประสิทธิภาพ เนื่องจากหลายครั้งเบราว์เซอร์ไม่จำเป็นต้องรองรับคุกกี้ ดังนั้นเราไม่แนะนำให้ใช้วิธีนี้เพื่อรักษาเซสชัน
เว็บเซิร์ฟเวอร์สามารถส่งฟิลด์ฟอร์ม HTML ที่ซ่อนอยู่และ ID เซสชันที่ไม่ซ้ำได้ เช่นนี้
<input type="hidden" name="sessionid" value="12345">
รายการนี้หมายความว่าเมื่อมีการส่งแบบฟอร์ม ชื่อและค่าที่ระบุจะถูกรวมไว้ในข้อมูล GET หรือ POST โดยอัตโนมัติ เมื่อใดก็ตามที่เบราว์เซอร์ส่งคำขอ ค่าของ session_id จะสามารถใช้เพื่อบันทึกการติดตามของเบราว์เซอร์ต่างๆ
วิธีการนี้อาจเป็นวิธีที่มีประสิทธิภาพ แต่การคลิกไฮเปอร์ลิงก์ในแท็ก <A HREF> จะไม่สร้างเหตุการณ์การส่งแบบฟอร์ม ดังนั้นฟิลด์แบบฟอร์มที่ซ่อนไว้จึงไม่รองรับการติดตามเซสชันสากล
คุณสามารถเพิ่มข้อมูลเพิ่มเติมหลังจากแต่ละ URL เพื่อแยกความแตกต่างเซสชัน และเซิร์ฟเวอร์สามารถเชื่อมโยงตัวระบุเซสชันตามข้อมูลนี้
ตัวอย่างเช่น http://w3cschool.cn/file.htm;sessionid=12345 ตัวระบุเซสชันคือ sessionid=12345 เซิร์ฟเวอร์สามารถใช้ข้อมูลนี้เพื่อระบุไคลเอ็นต์ได้
ในการเปรียบเทียบ การเขียน URL ใหม่เป็นวิธีที่ดีกว่า และจะทำงานได้แม้ว่าเบราว์เซอร์จะไม่รองรับคุกกี้ แต่ข้อเสียคือคุณต้องระบุรหัสเซสชันแบบไดนามิกสำหรับแต่ละ URL แม้ว่าจะเป็นหน้า HTML แบบธรรมดาก็ตาม
นอกเหนือจากวิธีการข้างต้นแล้ว JSP ยังใช้อินเทอร์เฟซ HttpSession ที่เซิร์ฟเล็ตจัดเตรียมไว้ให้เพื่อระบุผู้ใช้และจัดเก็บข้อมูลการเข้าถึงทั้งหมดของผู้ใช้รายนี้
ตามค่าเริ่มต้น JSP อนุญาตให้มีการติดตามเซสชัน และออบเจ็กต์ HttpSession ใหม่จะถูกสร้างอินสแตนซ์โดยอัตโนมัติสำหรับไคลเอ็นต์ใหม่ การปิดใช้งานการติดตามเซสชันจำเป็นต้องปิดอย่างชัดเจน ซึ่งทำได้โดยการตั้งค่าของแอตทริบิวต์เซสชันในคำสั่งเพจเป็นเท็จ ดังนี้:
<%@ เซสชันเพจ = "false" %>
กลไก JSP เปิดเผยอ็อบเจ็กต์เซสชันพื้นฐานแก่นักพัฒนา เนื่องจากมีการระบุออบเจ็กต์เซสชัน นักพัฒนาจึงสามารถจัดเก็บหรือดึงข้อมูลได้อย่างง่ายดาย
ตารางต่อไปนี้แสดงวิธีการที่สำคัญบางอย่างของวัตถุเซสชัน:
ส.น | วิธีการและคำอธิบาย |
---|---|
1 | วัตถุสาธารณะ getAttribute(ชื่อสตริง) ส่งคืนวัตถุที่ผูกกับชื่อที่ระบุในวัตถุเซสชัน หรือเป็นค่าว่างหากไม่มีอยู่ |
2 | public Enumeration getAttributeNames() ส่งคืนชื่ออ็อบเจ็กต์ทั้งหมดในอ็อบเจ็กต์เซสชัน |
3 | public long getCreationTime() ส่งคืนเวลาที่อ็อบเจ็กต์เซสชันถูกสร้างขึ้น หน่วยเป็นมิลลิวินาที เริ่มตั้งแต่เช้าตรู่ของวันที่ 1 มกราคม 1970 |
4 | public String getId() ส่งคืน ID ของวัตถุเซสชัน |
5 | public long getLastAccessedTime() ส่งคืนเวลาเข้าถึงล่าสุดของลูกค้าในหน่วยมิลลิวินาที เริ่มตั้งแต่เช้าตรู่ของวันที่ 1 มกราคม 1970 |
6 | public int getMaxInactiveInterval() ส่งคืนช่วงเวลาสูงสุดเป็นวินาที ในระหว่างที่คอนเทนเนอร์เซิร์ฟเล็ตจะเปิดเซสชันไว้ |
7 | public void invalidate() ทำให้เซสชันเป็นโมฆะและยกเลิกการเชื่อมโยงวัตถุใด ๆ ที่เชื่อมโยงกับเซสชัน |
8 | public boolean isNew( ส่งคืนไม่ว่าจะเป็นลูกค้าใหม่ หรือลูกค้าปฏิเสธที่จะเข้าร่วมเซสชั่นหรือไม่ |
9 | โมฆะสาธารณะ RemoveAttribute(ชื่อสตริง) ลบวัตถุที่มีชื่อที่ระบุในเซสชัน |
10 | โมฆะสาธารณะ setAttribute (ชื่อสตริง ค่าวัตถุ) ใช้ชื่อและค่าที่ระบุเพื่อสร้างวัตถุและผูกเข้ากับเซสชัน |
11 | โมฆะสาธารณะ setMaxInactiveInterval(int ช่วง) ใช้เพื่อระบุเวลาเป็นวินาที ในระหว่างที่คอนเทนเนอร์เซิร์ฟเล็ตจะทำให้เซสชันใช้งานได้ |
ตัวอย่างนี้อธิบายวิธีการใช้วัตถุ HttpSession เพื่อรับเวลาการสร้างและเวลาการเข้าถึงล่าสุด เราจะเชื่อมโยงวัตถุเซสชันใหม่กับวัตถุคำขอหากไม่มีอยู่
<%@ page import="java.io.*,java.util.*" %><% // รับเวลาการสร้างเซสชัน Date createTime = new Date(session.getCreationTime()); // รับเวลาของ วันที่เข้าชมหน้าสุดท้าย LastAccessTime = วันที่ใหม่ (session.getLastAccessedTime()); String title = "ยินดีต้อนรับกลับสู่เว็บไซต์ของฉัน"; Integer visitCount = new Integer(0); new String("visitCount"); String userIDKey = new String("userID"); String userID = new String("ABCD"); // ตรวจสอบว่ามีผู้เข้าชมเว็บเพจใหม่หรือไม่ (session.isNew() ){ title = "ยินดีต้อนรับสู่เว็บไซต์ของฉัน"; session.setAttribute(userIDKey, userID); session.setAttribute(visitCountKey, visitCount); } visitCount = (จำนวนเต็ม)session.getAttribute(visitCountKey); visitCount = visitCount + 1; userID = (String)session.getAttribute(userIDKey); session.setAttribute(visitCountKey, visitCount); </title></head><body><center><h1>การติดตามเซสชัน</h1></center><table align="center"> <tr bgcolor="#949494"> <th>ข้อมูลเซสชัน</th> <th>ค่า</th></tr> <tr> <td>id</td> <td><% out.print( session. getId()); %></td></tr> <tr> <td>เวลาในการสร้าง</td> <td><% out.print(createTime); %></td></tr> < ตร> <td>เวลาที่เข้าถึงล่าสุด</td> <td><% out.print(lastAccessTime); %></td></tr> <tr> <td>รหัสผู้ใช้</td> <td><% out.print(userID); %></td></tr> <tr> <td>จำนวนการเข้าชม</td> <td><% out.print(visitCount); ตร> </ตาราง> </ร่างกาย></html>
ลองเข้าถึง http://localhost:8080/main.jsp ผลลัพธ์ต่อไปนี้จะได้รับเมื่อทำงานเป็นครั้งแรก:
เยี่ยมชมอีกครั้งและคุณจะได้รับผลลัพธ์ดังต่อไปนี้:
หลังจากประมวลผลข้อมูลเซสชันของผู้ใช้แล้ว คุณจะมีตัวเลือกต่อไปนี้:
ลบแอตทริบิวต์เฉพาะ:
เรียกเมธอด public void removeAttribute(String name) เพื่อลบแอ็ตทริบิวต์ที่ระบุ
ลบเซสชันทั้งหมด:
เรียกเมธอด public void invalidate() เพื่อทำให้เซสชันทั้งหมดเป็นโมฆะ
กำหนดระยะเวลาที่ถูกต้องของเซสชัน:
เรียกเมธอด setMaxInactiveInterval(int Interval) สาธารณะเป็นโมฆะเพื่อตั้งค่าการหมดเวลาของเซสชัน
ผู้ใช้ออกจากระบบ:
เซิร์ฟเวอร์ที่รองรับเซิร์ฟเล็ตเวอร์ชัน 2.4 สามารถเรียกใช้เมธอด logout() เพื่อออกจากระบบผู้ใช้และทำให้เซสชันที่เกี่ยวข้องทั้งหมดใช้ไม่ได้
กำหนดค่าไฟล์ web.xml:
หากคุณใช้ Tomcat คุณสามารถกำหนดค่าไฟล์ web.xml ได้ดังต่อไปนี้:
<เซสชัน-config> <เซสชัน-หมดเวลา>15</เซสชัน-หมดเวลา> </เซสชัน-config>
การหมดเวลาเป็นนาที และการหมดเวลาเริ่มต้นใน Tomcat คือ 30 นาที
เมธอด getMaxInactiveInterval() ใน Servlet ส่งคืนการหมดเวลาเป็นวินาที หากกำหนดค่า 15 นาทีใน web.xml เมธอด getMaxInactiveInterval() จะส่งกลับ 900