English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تتبع الجلسة Servlet

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

ومع ذلك، هناك ثلاث طرق لتحقيق تتبع جلسة الدردشة بين عميل الويب ومخدم الويب:

الـ Cookies

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

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

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

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

<input type="hidden" name="sessionid" value="12345">

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

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

URL 重写

您可以在每个 URL 末尾追加一些额外的数据来标识 session 会话,服务器会把该 session 会话标识符与已存储的有关 session 会话的数据相关联。

例如,http://oldtoolbag.com/file.htm;sessionid=12345,session 会话标识符被附加为 sessionid=12345,标识符可被 Web 服务器访问以识别客户端。

URL 重写是一种更好的维持 session 会话的方式,它在浏览器不支持 cookie 时能够很好地工作,但是它的缺点是会动态生成每个 URL 来为页面分配一个 session 会话 ID,即使是在很简单的静态 HTML 页面中也会如此。

HttpSession 对象

除了上述的三种方式,Servlet 还提供了 HttpSession 接口,该接口提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式。

Servlet 容器使用这个接口来创建一个 HTTP 客户端和 HTTP 服务器之间的 session 会话。会话持续一个指定的时间段,跨多个连接或页面请求。

您会通过调用 HttpServletRequest 的公共方法 getSession() 来获取 HttpSession 对象,如下所示:

HttpSession session = request.getSession();

你需要在向客户端发送任何文档内容之前调用 request.getSession()。下面总结了 HttpSession 对象中可用的几个重要的方法:

序号方法 & 描述
1public Object getAttribute(String name)
该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null。
2public Enumeration getAttributeNames()
该方法返回 String 对象的枚举,String 对象包含所有绑定到该 session 会话的对象的名称。
3public long getCreationTime()
يحدد هذا الطريقة وقت إنشاء جلسة الدخول، من منتصف الليل من تاريخ 1 يناير 1970، بالأمثلة.
4public String getId()
يحدد هذا الطريقة نص يحتوي على معرف فريد يتم تخصيصه للجلسة.
5public long getLastAccessedTime()
يحدد هذا الطريقة الوقت الذي أرسل العميل آخر طلب يتعلق بالجلسة، من منتصف الليل من تاريخ 1 يناير 1970، بالأمثلة.
6public int getMaxInactiveInterval()
يحدد هذا الطريقة أطول فترة من الزمن التي يمكن أن تبقى جلسة الدخول مفتوحة عند زيارة العميل، بالثواني.
7public void invalidate()
يحدد هذا الطريقة جلسة الدخول غير صالحة، ويحلل جميع العناصر المربوطة بها.
8public boolean isNew()
إذا لم يكن العميل يعلم عن جلسة الدخول، أو إذا اختر العميل عدم المشاركة في جلسة الدخول، فإن هذا الطريقة يعود بالصحيفة.
9public void removeAttribute(String name)
ي�除 عنصر معين من جلسة الدخول باستخدام الاسم المحدد.
10public void setAttribute(String name, Object value)
يستخدم هذا الطريقة لربط عنصر إلى جلسة الدخول باستخدام الاسم المحدد.
11public void setMaxInactiveInterval(int interval)
يحدد هذا الطريقة وقت العميل بين الطلبات بينما يستمر كائن الجلسة في Servlet كونتينر.

مثال تتبع الجلسة

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

package com.w3codebox.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("w3codebox");
        if(session.getAttribute(visitCountKey)  ==  null)  {
            session.setAttribute(visitCountKey,  new  Integer(0));
        }
    
        //  التحقق من وجود زائر جديد على الصفحة
        if  (session.isNew()){
            title  =  "Servlet  معلومات  الجلسة  -  موقع دروس أساسية";
             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>رقم المستخدم</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.w3codebox.test.SessionTrack</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>SessionTrack</servlet-name>
    <!-- موقع الوصول --></servlet-mapping>
    <url-pattern>/TomcatTest/SessionTrack</url-pattern>
  </servlet-mapping>
</web-app>

أدخل العنوان في شريط عنوان المتصفح http://localhost:8080/TomcatTest/SessionTrack، عندما تشغلها لأول مرة سيظهر لك النتيجة التالية:

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

حذف بيانات جلسة Session

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

  • إزالة الخاصية المحددة:يمكنك استدعاء public void removeAttribute(String name) طريقة لحذف القيمة المرتبطة بكليه.

  • حذف الجلسة برمتها:يمكنك استدعاء public void invalidate() public void invalidate()

  • لإلغاء الجلسة بأكملها.يمكنك استدعاء public void setMaxInactiveInterval(int interval) لإعداد وقت انتهاء الجلسة بشكل منفرد.

  • لإلغاء تسجيل الخروج للمستخدم:إذا كنت تستخدم خادم يدعم servlet 2.4، يمكنك استدعاء logout لإلغاء تسجيل الخروج للعميل من الخادم الويب، وإبطال جميع الجلسات الخاصة بجميع المستخدمين.

  • تكوين web.xml:إذا كنت تستخدم Tomcat، بالإضافة إلى الطريقة المذكورة أعلاه، يمكنك تكوين وقت انتهاء الجلسة في ملف web.xml كما يلي:

  <session-config>
    <session-timeout>15</session-timeout>
  </session-config>

تمثل وقت انتهاء الجلسة في مثال أعلاه بمقياس الدقائق، وستغطي على وقت انتهاء الجلسة الافتراضي البالغ 30 دقيقة في Tomcat.

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