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