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