Latest web development tutorials

تتبع الدورة بريمج

HTTP هو "عديمي الجنسية" بروتوكول، وهذا يعني أنه في كل مرة العميل باسترداد صفحات، يفتح العميل اتصال منفصل إلى ملقم ويب، لا تسجل الملقم تلقائيا قبل محجوزة أي طلبات العميل.

لكن لا تزال هناك ثلاث طرق للحفاظ على محادثة جلسة العمل بين عميل ويب وملقم ويب:

بسكويت

يمكن تعيين خادم الويب معرف جلسة عمل فريدة من نوعها الدورة لكل المعلومات عميل ويب، طلبات اللاحقة للعميل يمكن استخدامها لتحديد ملفات تعريف الارتباط الواردة.

هذا قد لا يكون وسيلة فعالة، وذلك لأن العديد من المتصفحات لا تدعم الكعكة، لذلك نحن لا نوصي باستخدام هذه الطريقة للحفاظ على جلسة الدورة.

حقول النموذج المخفية

خادم الويب يمكن أن ترسل خفية على حقول النموذج HTML، فضلا عن معرف جلسة جلسة فريدة من نوعها، على النحو التالي:

<نوع الإدخال = "مخفي" اسم = قيمة "جلسة الهوية" = "12345">

هذا الدخول يعني أنه عندما يتم إرسال النموذج، الاسم المحدد وقيمة ستدرج تلقائيا في البيانات GET أو POST. في كل مرة عندما يرسل مستعرض ويب إعادة الطلب، ويمكن استخدام قيمة SESSION_ID للحفاظ مختلفة تتبع مستعرض ويب.

هذا قد يكون وسيلة فعالة للحفاظ على وتتبع الدورة الدورة، ولكن الضغط على الرابط التشعبي التقليدية (<A HREF...>) لا يؤدي إلى تقديم النموذج، وبالتالي فإن حقول النموذج مخفية لا تدعم تتبع جلسة الدورة العادية.

إعادة كتابة عنوان

يمكنك إلحاق بعض البيانات الإضافية على كل نهاية URL لتعريف جلسة جلسة معرف جلسة الدورة والبيانات المخزنة جلسة حول جلسة العمل المقترنة الخادم سوف.

على سبيل المثال http: //w3cschool.cc/file.htm، جلسة الهوية = 12345، ويرد معرف جلسة الدورة بصفة جلسة الهوية = 12345، معرف يمكن الوصول إلى ملقم ويب التعرف على العميل.

URL إعادة كتابة هو أفضل وسيلة للحفاظ على جلسة الدورة، يمكن أن تعمل بشكل جيد جدا عندما المتصفح لا يدعم الكوكيز، ولكن يتم إنشاء العيب بشكل حيوي لكل عنوان URL لتعيين معرف جلسة للصفحة الدورة، حتى لو هو بسيط جدا وصفحات HTML الثابتة، قد تكون أيضا.

الأشياء HttpSession

بالإضافة إلى ثلاث طرق المذكورة أعلاه، كما توفر بريمج واجهة HttpSession، الذي يوفر للمستخدم لتحديد وتخزين المعلومات عن المستخدم عند طلب عبر أكثر من صفحة واحدة أو زيارة الطريقة.

حاوية بريمج لاستخدام هذه الواجهة لإنشاء محادثة جلسة العمل بين عميل 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>"); 
	}
}

ترجمةبريمج 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: // المضيف المحلي: 8080 / TomcatTest/ SessionTrack، عند أول تشغيل تظهر النتائج التالية:

محاولة تشغيل نفس بريمج مرة أخرى، وسوف تظهر النتائج التالية:


حذف بيانات الجلسة الدورة

عند الانتهاء من بيانات جلسة عمل المستخدم الدورة، لديك الخيارات التالية:

  • إزالة سمة محددة: يمكنك استدعاء الأسلوبremoveAttribute الفراغ الجمهور (سلسلة الاسم)لإزالة قيمة محددة ترتبط مع مفتاح.
  • حذف الدورة جلسة كاملة: يمكنك استدعاء الأسلوبيبطل باطلا العام ()لتجاهل الدورة جلسة بأكملها.
  • جلسة جلسة تحديد وقت انتهاء الصلاحية: يمكنك استدعاء الأسلوبالعام باطل setMaxInactiveInterval (الفترة كثافة العمليات)لاقامة مهلة جلسة جلسة منفصلة.
  • المستخدمين تسجيل الخروج: إذا كنتتستخدم بدعم الخادم بريمج 2.4، يمكنك استدعاءالخروجإلى خروج العميل خادم الويب، وجميع المستخدمين الذين ينتمون إلى كل جلسة جلسة أنها غير صالحة.
  • التكوين web.xml: إذا كنت تستخدم قط، بالإضافة إلى الأساليب المذكورة أعلاه، يمكنك تكوين مهلة جلسة جلسة في ملف web.xml، على النحو التالي:
  <session-config>
    <session-timeout>15</session-timeout>
  </session-config>

أمثلة من الوقت المذكور أعلاه من غير دقيقة، وسوف القط تجاوز الافتراضي 30 دقيقة المهلة.

getMaxInactiveInterval في بريمج في طريقة () إرجاع جلسة جلسة المهلة، في ثوان. لذلك، إذا كان مكونا مهلة جلسة في وقت جلسة web.xml من 15 دقيقة، ثم getMaxInactiveInterval () سيعود 900.