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