ติดตามเซสชัน Servlet
HTTP เป็นโปรโตคอล "ไร้สัญชาติ" ซึ่งหมายความว่าทุกครั้งที่ลูกค้าจะเรียกหน้าเว็บที่ลูกค้าเปิดการเชื่อมต่อที่แยกจากกันไปยังเว็บเซิร์ฟเวอร์เซิร์ฟเวอร์ไม่บันทึกโดยอัตโนมัติก่อนการร้องขอของลูกค้าใด ๆ จะถูกสงวนไว้
แต่ยังคงมีสามวิธีที่จะรักษาสนทนาเซสชั่นระหว่างลูกค้าเว็บและเว็บเซิร์ฟเวอร์:
คุ้กกี้
เว็บเซิร์ฟเวอร์สามารถกำหนดหมายเลขเซสชั่นที่ไม่ซ้ำกันเป็นเซสชั่นสำหรับแต่ละคุกกี้เว็บไคลเอ็นต์ร้องขอที่ตามมาสำหรับลูกค้าที่สามารถนำมาใช้เพื่อระบุคุกกี้ที่ได้รับ
นี้อาจไม่เป็นวิธีที่มีประสิทธิภาพเพราะเบราว์เซอร์จำนวนมากไม่สนับสนุนคุกกี้ดังนั้นเราจึงไม่แนะนำให้ใช้วิธีนี้ในการรักษาเซสชั่นเซสชั่น
เขตข้อมูลฟอร์มที่ซ่อนอยู่
เว็บเซิร์ฟเวอร์สามารถส่งเขตข้อมูลฟอร์ม HTML ที่ซ่อนอยู่เช่นเดียวกับหมายเลขเซสชั่นเซสชั่นที่ไม่ซ้ำกันดังต่อไปนี้:
<ประเภทขาเข้า = "ซ่อน" name = "SessionID" value = "12345">
รายการนี้หมายความว่าเมื่อส่งแบบฟอร์มชื่อที่ระบุและความคุ้มค่าจะถูกรวมโดยอัตโนมัติใน GET หรือโพสต์ข้อมูล ทุกครั้งเมื่อเว็บเบราว์เซอร์จะส่งกลับคำขอค่า session_id สามารถนำมาใช้เพื่อให้การติดตามเว็บเบราว์เซอร์ที่แตกต่างกัน
นี้อาจจะเป็นวิธีที่มีประสิทธิภาพในการรักษาติดตามเซสชั่นเซสชั่น แต่คลิกที่ไฮเปอร์ลิงค์ธรรมดา (<A HREF...>) ไม่นำไปสู่การส่งแบบฟอร์มเพื่อให้เขตข้อมูลฟอร์มที่ซ่อนไม่สนับสนุนการติดตามเซสชั่นเซสชั่นปกติ
URL ที่เขียนใหม่
คุณสามารถผนวกข้อมูลพิเศษบางอย่างในส่วนท้ายของ URL แต่ละเซสชั่นที่จะระบุตัวระบุเซสชั่นเซสชั่นการใช้งานและข้อมูลที่จัดเก็บในเซสชั่เกี่ยวกับเซิร์ฟเวอร์เซสชั่นที่เกี่ยวข้องจะ
ตัวอย่างเช่น http: //w3cschool.cc/file.htm; sessionid = 12345 ระบุเซสชั่นเซสชั่นที่แนบมาเป็น SessionID = 12345 ตัวระบุสามารถเข้าถึงเว็บเซิร์ฟเวอร์เพื่อแจ้งลูกค้า
URL เขียนใหม่เป็นวิธีที่ดีกว่าที่จะรักษาเซสชั่นเซสชั่นก็สามารถทำงานได้เป็นอย่างดีเมื่อเบราว์เซอร์ไม่สนับสนุนคุกกี้ แต่อุปสรรคที่มีการสร้างขึ้นสำหรับแต่ละ URL ที่จะกำหนดหมายเลขเซสชั่นสำหรับเพจเซสชั่นถึงแม้ว่า เป็นเรื่องง่ายมากหน้าเว็บ HTML แบบคงที่จะมากเกินไป
วัตถุ HttpSession
นอกเหนือไปจากข้างต้นสามวิธี Servlet นอกจากนี้ยังมีอินเตอร์เฟซที่ HttpSession ซึ่งให้ผู้ใช้ในการระบุและเก็บข้อมูลเกี่ยวกับผู้ใช้เมื่อมีการร้องขอหน้ามากกว่าหนึ่งข้ามหรือเยี่ยมชมลักษณะ
ภาชนะ Servlet ใช้อินเตอร์เฟซนี้เพื่อสร้างการสนทนาระหว่างเซสชั่นไคลเอนต์ HTTP และเซิร์ฟเวอร์ HTTP เซสชั่นมีจำนวน จำกัด ระยะเวลาที่กำหนดของเวลาระหว่างการร้องขอหลายหน้าหรือการเชื่อมต่อ
คุณจะมารับ HttpSession วัตถุโดยการเรียก HttpServletRequest วิธีสาธารณะgetSession () ดังต่อไปนี้:
HttpSession เซสชั่น = request.getSession ();
คุณต้องก่อนที่จะส่งเนื้อหาของเอกสารใด ๆ ให้กับลูกค้าเรียกrequest.getSession ()นี่คือบทสรุปของวิธีการที่สำคัญหลายวัตถุ HttpSession มี:
序号 | 方法 & 描述 |
---|---|
1 | public Object getAttribute(String name) 该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null。 |
2 | public Enumeration getAttributeNames() 该方法返回 String 对象的枚举,String 对象包含所有绑定到该 session 会话的对象的名称。 |
3 | public long getCreationTime() 该方法返回该 session 会话被创建的时间,自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。 |
4 | public String getId() 该方法返回一个包含分配给该 session 会话的唯一标识符的字符串。 |
5 | public long getLastAccessedTime() 该方法返回客户端最后一次发送与该 session 会话相关的请求的时间自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。 |
6 | public int getMaxInactiveInterval() 该方法返回 Servlet 容器在客户端访问时保持 session 会话打开的最大时间间隔,以秒为单位。 |
7 | public void invalidate() 该方法指示该 session 会话无效,并解除绑定到它上面的任何对象。 |
8 | public boolean isNew() 如果客户端还不知道该 session 会话,或者如果客户选择不参入该 session 会话,则该方法返回 true。 |
9 | public void removeAttribute(String name) 该方法将从该 session 会话移除指定名称的对象。 |
10 | public void setAttribute(String name, Object value) 该方法使用指定的名称绑定一个对象到该 session 会话。 |
11 | public void setMaxInactiveInterval(int interval) 该方法在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位。 |
ตัวอย่างการติดตามเซสชั่น
ตัวอย่างนี้แสดงวิธีการใช้วัตถุ HttpSession เพื่อให้ได้เวลาการสร้างเซสชั่นเซสชั่นและเวลาเข้าถึงล่าสุด หากมีเซสชั่นเซสชั่นใด ๆ เราจะสร้างเซสชันใหม่โดยการร้องขอของเซสชั่น
package com.w3big.test; import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * Servlet implementation class SessionTrack */ @WebServlet("/SessionTrack") public class SessionTrack extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 如果不存在 session 会话,则创建一个 session 对象 HttpSession session = request.getSession(true); // 获取 session 创建时间 Date createTime = new Date(session.getCreationTime()); // 获取该网页的最后一次访问时间 Date lastAccessTime = new Date(session.getLastAccessedTime()); //设置日期输出的格式 SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String title = "Servlet Session 实例 - 本教程"; Integer visitCount = new Integer(0); String visitCountKey = new String("visitCount"); String userIDKey = new String("userID"); String userID = new String("w3big"); // 检查网页上是否有新的访问者 if (session.isNew()){ title = "Servlet Session 实例 - 本教程"; session.setAttribute(userIDKey, userID); } else { visitCount = (Integer)session.getAttribute(visitCountKey); visitCount = visitCount + 1; userID = (String)session.getAttribute(userIDKey); } session.setAttribute(visitCountKey, visitCount); // 设置响应内容类型 response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String docType = "<!DOCTYPE html>\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 信息</h2>\n" + "<table border=\"1\" align=\"center\">\n" + "<tr bgcolor=\"#949494\">\n" + " <th>Session 信息</th><th>值</th></tr>\n" + "<tr>\n" + " <td>id</td>\n" + " <td>" + session.getId() + "</td></tr>\n" + "<tr>\n" + " <td>创建时间</td>\n" + " <td>" + df.format(createTime) + " </td></tr>\n" + "<tr>\n" + " <td>最后访问时间</td>\n" + " <td>" + df.format(lastAccessTime) + " </td></tr>\n" + "<tr>\n" + " <td>用户 ID</td>\n" + " <td>" + userID + " </td></tr>\n" + "<tr>\n" + " <td>访问统计:</td>\n" + " <td>" + visitCount + "</td></tr>\n" + "</table>\n" + "</body></html>"); } }
รวบรวมก่อนหน้าServlet SessionTrack และสร้างรายการที่เหมาะสมในไฟล์ web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app> <servlet> <!-- 类名 --> <servlet-name>SessionTrack</servlet-name> <!-- 所在的包 --> <servlet-class>com.w3big.test.SessionTrack</servlet-class> </servlet> <servlet-mapping> <servlet-name>SessionTrack</servlet-name> <!-- 访问的网址 --> <url-pattern>/TomcatTest/SessionTrack</url-pattern> </servlet-mapping> </web-app>
ในแถบที่อยู่เบราว์เซอร์ให้ใส่http: // localhost: 8080 / TomcatTest/ SessionTrack, เมื่อคุณเรียกใช้การแสดงผลดังต่อไปนี้:
พยายามที่จะเรียก Servlet เดียวกันอีกครั้งก็จะแสดงผลต่อไปนี้:
ลบข้อมูลเซสชันเซสชัน
เมื่อคุณเสร็จสิ้นข้อมูลเซสชันของผู้ใช้เซสชั่นคุณมีตัวเลือกต่อไปนี้:
- นำคุณลักษณะเฉพาะ:คุณสามารถเรียกโมฆะสาธารณะ removeAttribute (ชื่อ String) วิธีการที่จะเอาค่าเฉพาะที่เกี่ยวข้องกับคีย์
- ลบเซสชั่นเซสชั่นทั้งหมด: คุณสามารถเรียกโมฆะสาธารณะโมฆะ ()วิธีการทิ้งเซสชั่นเซสชั่นทั้งหมด
- เซสชั่นตั้งเวลาหมดอายุเซสชั่น:คุณสามารถเรียกโมฆะ setMaxInactiveInterval สาธารณะ (ช่วง int)วิธีการตั้งค่าหมดเวลาเซสชั่นที่แยกต่างหาก
- ผู้ใช้ออกจากระบบ: ถ้าคุณกำลังใช้เซิร์ฟเล็ต 2.4 เซิร์ฟเวอร์ที่สนับสนุนคุณสามารถโทรออกจากระบบออกจากระบบเว็บเซิร์ฟเวอร์ของลูกค้าและผู้ใช้ทุกคนที่อยู่ในเซสชั่นเซสชั่นทั้งหมดเป็นที่ไม่ถูกต้อง
- การกำหนดค่า web.xml: ถ้าคุณกำลังใช้ Tomcat นอกเหนือไปจากวิธีการข้างต้นคุณสามารถกำหนดค่าหมดเวลาเซสชั่นเซสชั่นในไฟล์ web.xml ดังต่อไปนี้:
<session-config> <session-timeout>15</session-timeout> </session-config>
ตัวอย่างของเวลาดังกล่าวข้างต้นออกเป็นนาที Tomcat จะแทนที่ค่าเริ่มต้น 30 นาทีหมดเวลา
getMaxInactiveInterval ใน Servlet ใน () วิธีการส่งกลับเซสชั่นเซสชั่นหมดเวลาในไม่กี่วินาที ดังนั้นถ้าหมดเวลาเซสชั่นการกำหนดค่าในเซสชั่นเวลา web.xml 15 นาทีแล้ว getMaxInactiveInterval () จะกลับมา 900