Latest web development tutorials

ติดตามเซสชัน 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 มี:

序号方法 & 描述
1public Object getAttribute(String name)
该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null。
2public Enumeration getAttributeNames()
该方法返回 String 对象的枚举,String 对象包含所有绑定到该 session 会话的对象的名称。
3public long getCreationTime()
该方法返回该 session 会话被创建的时间,自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。
4public String getId()
该方法返回一个包含分配给该 session 会话的唯一标识符的字符串。
5public long getLastAccessedTime()
该方法返回客户端最后一次发送与该 session 会话相关的请求的时间自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。
6public int getMaxInactiveInterval()
该方法返回 Servlet 容器在客户端访问时保持 session 会话打开的最大时间间隔,以秒为单位。
7public void invalidate()
该方法指示该 session 会话无效,并解除绑定到它上面的任何对象。
8public boolean isNew()
如果客户端还不知道该 session 会话,或者如果客户选择不参入该 session 会话,则该方法返回 true。
9public void removeAttribute(String name)
该方法将从该 session 会话移除指定名称的对象。
10public void setAttribute(String name, Object value)
该方法使用指定的名称绑定一个对象到该 session 会话。
11public 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