Servlets - การติดตามเซสชัน
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 ซ้ำคือคุณจะต้องสร้าง URL ทุกรายการแบบไดนามิกเพื่อกำหนดรหัสเซสชันแม้ในกรณีของหน้า HTML คงที่แบบธรรมดา
วัตถุ HttpSession
นอกเหนือจากสามวิธีที่กล่าวมาแล้ว servlet ยังมี HttpSession Interface ซึ่งเป็นวิธีการระบุผู้ใช้ผ่านการร้องขอมากกว่าหนึ่งเพจหรือเยี่ยมชมเว็บไซต์และเพื่อจัดเก็บข้อมูลเกี่ยวกับผู้ใช้นั้น
คอนเทนเนอร์ servlet ใช้อินเทอร์เฟซนี้เพื่อสร้างเซสชันระหว่างไคลเอ็นต์ HTTP และเซิร์ฟเวอร์ HTTP เซสชันจะยังคงอยู่ในช่วงเวลาที่กำหนดในการเชื่อมต่อมากกว่าหนึ่งการร้องขอหรือการร้องขอเพจจากผู้ใช้
คุณจะได้รับวัตถุ HttpSession โดยเรียกใช้วิธีสาธารณะ getSession() ของ HttpServletRequest ดังต่อไปนี้ -
HttpSession session = request.getSession();
คุณต้องโทรrequest.getSession ()ก่อนที่คุณจะส่งเนื้อหาเอกสารใด ๆ ไปยังไคลเอนต์ นี่คือบทสรุปของวิธีการที่สำคัญที่มีอยู่ในวัตถุ HttpSession -
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
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 เพื่อค้นหาเวลาสร้างและเวลาที่เข้าถึงล่าสุดสำหรับเซสชัน เราจะเชื่อมโยงเซสชันใหม่กับคำขอหากไม่มีอยู่แล้ว
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// Extend HttpServlet class
public class SessionTrack extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Create a session object if it is already not created.
HttpSession session = request.getSession(true);
// Get session creation time.
Date createTime = new Date(session.getCreationTime());
// Get last access time of this web page.
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 web page.
if (session.isNew()) {
title = "Welcome to my website";
session.setAttribute(userIDKey, userID);
} else {
visitCount = (Integer)session.getAttribute(visitCountKey);
visitCount = visitCount + 1;
userID = (String)session.getAttribute(userIDKey);
}
session.setAttribute(visitCountKey, visitCount);
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " +
"transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + title + "</h1>\n" +
"<h2 align = \"center\">Session Infomation</h2>\n" +
"<table border = \"1\" align = \"center\">\n" +
"<tr bgcolor = \"#949494\">\n" +
" <th>Session info</th><th>value</th>
</tr>\n" +
"<tr>\n" +
" <td>id</td>\n" +
" <td>" + session.getId() + "</td>
</tr>\n" +
"<tr>\n" +
" <td>Creation Time</td>\n" +
" <td>" + createTime + " </td>
</tr>\n" +
"<tr>\n" +
" <td>Time of Last Access</td>\n" +
" <td>" + lastAccessTime + " </td>
</tr>\n" +
"<tr>\n" +
" <td>User ID</td>\n" +
" <td>" + userID + " </td>
</tr>\n" +
"<tr>\n" +
" <td>Number of visits</td>\n" +
" <td>" + visitCount + "</td>
</tr>\n" +
"</table>\n" +
"</body>
</html>"
);
}
}
รวบรวม servlet ด้านบน SessionTrackและสร้างรายการที่เหมาะสมในไฟล์ web.xml ขณะนี้เรียกใช้http: // localhost: 8080 / SessionTrackจะแสดงผลลัพธ์ต่อไปนี้เมื่อคุณเรียกใช้เป็นครั้งแรก -
Welcome to my website
Session Infomation
Session info
value
id
0AE3EC93FF44E3C525B4351B77ABB2D5
Creation Time
Tue Jun 08 17:26:40 GMT+04:00 2010
Time of Last Access
Tue Jun 08 17:26:40 GMT+04:00 2010
User ID
ABCD
Number of visits
0
ตอนนี้ลองเรียกใช้ servlet เดียวกันเป็นครั้งที่สองมันจะแสดงผลลัพธ์ต่อไปนี้
Welcome Back to my website
Session Infomation
info type
value
id
0AE3EC93FF44E3C525B4351B77ABB2D5
Creation Time
Tue Jun 08 17:26:40 GMT+04:00 2010
Time of Last Access
Tue Jun 08 17:26:40 GMT+04:00 2010
User ID
ABCD
Number of visits
1
การลบข้อมูลเซสชัน
เมื่อคุณดำเนินการกับข้อมูลเซสชันของผู้ใช้เสร็จแล้วคุณมีหลายตัวเลือก -
Remove a particular attribute- คุณสามารถเรียกใช้วิธีลบโมฆะสาธารณะ (ชื่อสตริง)เพื่อลบค่าที่เกี่ยวข้องกับคีย์เฉพาะได้
Delete the whole session- คุณสามารถเรียกpublic void invalidate () method เพื่อทิ้งทั้งเซสชัน
Setting Session timeout- คุณสามารถเรียกใช้เมธอด 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