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

معالجة ملفات الكوكيز Servlet

الكوكي هو ملف نصي يتم تخزينه على جهاز الكمبيوتر الخاص بالعميل ويحتفظ بمعلومات تتبع متنوعة. يدعم Java Servlet بوضوح HTTP Cookie.

يتضمن التعرف على المستخدم العودة ثلاث خطوات:

  • سيقوم سكربت الخادم بإرسال مجموعة من الكوكي إلى المتصفح. على سبيل المثال: الاسم، العمر أو الرقم التعريفي إلخ.

  • سيحتفظ المتصفح بهذه المعلومات على جهاز الكمبيوتر المحلي للاستخدام في المستقبل.

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

سيشرح هذا الفصل كيفية تعيين أو إعادة تعيين الكوكي، وكيفية الوصول إليه، وكيفية حذفه.

يتطلب معالجة الكوكي في servlet الترميز والتفكير في النصوص الصينية، مثل الطريقة التالية:

String str = java.net.URLEncoder.encode("الصينية"،"UTF-8"); // الترميز
String str = java.net.URLDecoder.decode("النص الم编码","UTF-8"); // الترميز

تحليل الكوكي

عادةً يتم تعيين الكوكي في معلومات رأس HTTP (على الرغم من أن JavaScript يمكنه أيضًا تعيين كوكي مباشرة في المتصفح). يرسل servlet الذي يتم تعيين الكوكي المعلومات التالية في رأسه:

HTTP/1.1 200 OK
Date: Fri, 04 Feb 2000 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name=xyz; expires=Friday, 04-Feb-07 22:03:38 GMT; 
                 path=/; domain=oldtoolbag.com
Connection: close
Content-Type: text/html

كما ترون، يحتوي رأس Set-Cookie على زوج من الاسم القيمة، تاريخ GMT، المسار والمجال. يتم ت编码 الاسم والقيمة عبر URL. هوامش expires هي تعليمات تخبر المتصفح بأنه يجب "نسخ الذاكرة" للكوكي بعد تاريخ ووقت محدد.

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

GET / HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)
Host: zink.demon.co.uk:1126
Accept: image/gif, */*
Accept-Encoding: gzip
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8
Cookie: name=xyz

يُمكن للServlet الوصول إلى الكوكي من خلال طريقة الطلب request.getCookies() لزيارة الكوكي، سيعود هذا الطريقة الكوكي مجموعة من الأُسس.

Servlet Cookie Method

يُوجد قائمة مفيدة من الطرق التي يمكن استخدامها لمعالجة الكوكي في Servlet.

الترتيبالطريقة & الوصف
1public void setDomain(String pattern)
يُحدد هذا الطريقة المجال الذي يُطبق الكوكي عليه، مثل oldtoolbag.com.
2public String getDomain()
يُرجع هذا الطريقة المجال الذي يُطبق الكوكي عليه، مثل oldtoolbag.com.
3public void setMaxAge(int expiry)
يُحدد هذا الطريقة وقت انتهاء صلاحية الكوكي (بالثواني). إذا لم يتم ذلك، سيُبقى الكوكي قائمًا فقط في جلسة الدخول الحالية.
4public int getMaxAge()
يُرجع هذا الطريقة عمر الكوكي الأقصى (بالثواني). في الحالة الافتراضية، -1 يعني أن الكوكي سيُبقى قائمًا حتى إغلاق المتصفح.
5public String getName()
يُرجع هذا الطريقة اسم الكوكي. لا يمكن تغيير الاسم بعد إنشائه.
6public void setValue(String newValue)
يُحدد هذا الطريقة القيمة المُرتبطة بكوكي.
7public String getValue()
يُسقط هذا الطريقة القيمة المُرتبطة بكوكي.
8public void setPath(String uri)
يُحدد هذا الطريقة مسار تطبيق الكوكي. إذا لم تُحدد مسارًا، فإن جميع URLs تحت نفس الدليل الحالي (بما في ذلك الدلائل الفرعية) ستعود بكوكي.
9الافتراضية مسار()
يتم الحصول على المسار الذي ينطبق عليه الكوكي.
10الافتراضية إرسالآمن(boolean علم)
يتم تعيين هذا الطريقة قيمة بولية تعبر عن ما إذا كان يجب إرسال الكوكي فقط عبر الاتصالات المشفرة (SSL).
11الافتراضية تعليق(String غرض)
تعيين تعليق الكوكي. يمكن أن تكون هذه التعليقات مفيدة جدًا عند عرض الكوكي على المستخدم من قبل المتصفح.
12الافتراضية تعليق()
الحصول على التعليق لكوكي، إذا لم يكن لديه تعليق، فسيتم رد null.

تعيين كوكي من خلال Servlet

يتم تعيين كوكي من خلال Servlet في ثلاث خطوات:

(1) إنشاء كائن كوكي:يمكنك استدعاء بناء كوكي باستخدام اسم الكوكي وقيمة الكوكي، كلاهما قيم نصية.

كوكي كوكي = جديد كوكي("مفتاح","قيمة");

تذكر، يجب ألا تحتوي الأسماء أو القيم على مسافات أو أي من الأحرف التالية:

[ ] ( ) = , " / ? @ : ;

(2) تعيين فترة الصلاحية القصوى:يمكنك استخدام setMaxAge لتحديد وقت الصلاحية للكوكي (بالثواني). سينشأ كوكي بهذا الحد الأقصى لفترة الصلاحية 24 ساعة.

cookie.setMaxAge(60*60*24);

(3) إرسال كوكي إلى رأس استجابة HTTP:يمكنك استخدام response.addCookie لإضافة كوكي إلى رأس استجابة HTTP، كما يلي:

response.addCookie(cookie);

مثال على الاستخدام

لنعدل مثال بيانات النموذج، لتعيين كوكي لاسم العائلة واسم المستخدم.

package com.w3codebox.test;
import java.io.IOException;
import java.io.PrintWriter;
استيراد java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * فئة تنفيذ Servlet هلوسيرفلت
 */
@WebServlet("/HelloForm")
الافتراضية فئة هلوفرم extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    الافتراضية هلوفرم() {
        super();
        // TODO كود تم إنشاؤه تلقائيًا
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        // إنشاء كوكي لاسم العائلة واسم المستخدم      
        اسم الكوكي = جديد كوكي("اسم",
                URLEncoder.encode(request.getParameter("name"), "UTF-8")); // تحويل الصينية إلى رمز
        Cookie url = new Cookie("url",
                      request.getParameter("url"));
        
        // ضبط تاريخ انتهاء الصلاحية لكل من Cookie لمدة 24 ساعة
        name.setMaxAge(60*60*24); 
        url.setMaxAge(60*60*24); 
        
        // إضافة Cookieين إلى رأس الاستجابة
        response.addCookie(name);
        response.addCookie(url);
        
        // إعداد نوع المحتوى للإجابة
        response.setContentType("text/html;charset=UTF-8");
        
        PrintWriter out = response.getWriter();
        String title = "مثال إعداد Cookie";
        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>
" +
                "<ul>
" +
                "		<li><b>اسم الموقع:</b> ":"
                + request.getParameter("name") + "
</li>" +
                "		<li><b>عنوان الموقع:</b> ":"
                + request.getParameter("url") + "
</li>" +
                "</ul>
" +
                "</body></html>");
        }
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }
}

تجميع Servlet أعلاه HelloForm، وأنشئ المدخل المناسب في ملف web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet> 
    <!-- اسم الكلاس --)  
    <servlet-name>HelloForm</servlet-name>
    <!-- المجلد الذي يحتوي عليه --)
    <servlet-class>com.w3codebox.test.HelloForm</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloForm</servlet-name>
    <!-- عنوان الوجهة --)
    <url-pattern>/TomcatTest/HelloForm</url-pattern>
  </servlet-mapping>
</web-app>

آخر محاولة لاستدعاء Servlet باستخدام صفحة HTML.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>موقع تعليمي أساسي (oldtoolbag.com)</title>
</head>
<body>
<form action="/TomcatTest/HelloForm" method="GET">
اسم الموقع: <input type="text" name="name">
<br />
عنوان الموقع: <input type="text" name="url" /><br>
<input type="submit" value="إرسال" />
</form>
</body>
</html>

احفظ محتوى HTML المذكور أعلاه في ملف /TomcatTest/test.html.

لنذهب إلى http://localhost:8080/TomcatTest/test.html، وسنرى ما يلي:

بعد الضغط على "إرسال"، سيكون التأثير كالتالي:

ملاحظة:بعض المسارات المذكورة أعلاه يجب تعديلها بناءً على مسار مشروعك الفعلي.

قراءة الكعكة عبر Servlet

لقراءة الكعكة، يجب عليك تنفيذ HttpServletRequest من getCookies( ) يخلق javax.servlet.http.Cookie مجموعة من العناصر. ثم نلقي دائرة على الصفيف، ونستخدم getName() وgetValue() لاستدعاء كل كعكة وأي قيمة مرتبطة بها.

مثال على الاستخدام

دعونا نقرأ الكعكة التي تم تعيينها في المثال السابق

package com.w3codebox.test;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Servlet implementation class ReadCookies
 */
@WebServlet("/ReadCookies")
public class ReadCookies extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ReadCookies() {
        super();
        // TODO كود تم إنشاؤه تلقائيًا
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        Cookie cookie = null;
        Cookie[] cookies = null;
        // الحصول على مصفوفة من الكوكي المتعلقة بالمنطقة
        cookies = request.getCookies();
         
         // إعداد نوع المحتوى للإجابة
         response.setContentType("text/html;charset=UTF-8");
    
         PrintWriter out = response.getWriter();
         String title = "مثال حذف كعكة";
         String docType = "<!DOCTYPE html>\n";
         out.println(docType +
                   "<html>\n"
                   "<head><title>" + title + "</title></head>\n"
                   "<body bgcolor=\"#f0f0f0\">\n"
          if( cookies != null ){
            out.println("<h2>أسماء و القيم الكوكي</h2>");
            for (int i = 0; i < cookies.length; i++){
               cookie = cookies[i];
               if((cookie.getName( )).compareTo("name") == 0 ){
                    cookie.setMaxAge(0);
                    response.addCookie(cookie);
                    out.print("تم حذف الكوكي: " + 
                                 cookie.getName() + "><br/>");
               }
               out.print("اسم المعامل: " + cookie.getName() + ",");
               out.print("القيمة المحددة: " + URLDecoder.decode(cookie.getValue(), "utf-8") + "<br/>");
            }
         } else {
             out.println(
               "<h2 class=\"tutheader\">لم يتم العثور على كوكي</h2>
         }
         out.println("</body>");
         out.println("</html>");
        }
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }
}

تجميع Servlet أعلاه ReadCookies، وأنشئ المدخل المناسب في ملف web.xml. جرب تشغيل http://localhost:8080/TomcatTest/ReadCookies، سيتم عرض النتيجة التالية:


إزالة الكوكي عبر Servlet

إزالة الكوكي بسيطة للغاية. إذا كنت ترغب في إزالة كوكي، فإنك بحاجة إلى اتباع الخطوات الثلاث التالية:

  • اقرأ كوكي موجود، واقمله في كائن Cookie.

  • استخدم setMaxAge() يُضبط عمر الكوكي إلى صفر لإزالة الكوكي الحالي.

  • أضف هذا الكوكي إلى رأس الاستجابة.

مثال على الاستخدام

النموذج التطبيقي التالي سيقوم بإزالة الكوكي الحالي الذي يُدعى "url"، عند تشغيل Servlet ReadCookies التالي، سيُرجع url كـ null.

package com.w3codebox.test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Servlet implementation class DeleteCookies
 */
@WebServlet("/DeleteCookies")
public class DeleteCookies extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public DeleteCookies() {
        super();
        // TODO كود تم إنشاؤه تلقائيًا
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        Cookie cookie = null;
        Cookie[] cookies = null;
        // الحصول على مصفوفة من الكوكي المتعلقة بالمنطقة
        cookies = request.getCookies();
        
            // إعداد نوع المحتوى للإجابة
        response.setContentType("text/html;charset=UTF-8");
   
        PrintWriter out = response.getWriter();
        String title = "مثال على حذف الكوكي";
        String docType = "<!DOCTYPE html>\n";
        out.println(docType +
                  "<html>\n"
                  "<head><title>" + title + "</title></head>\n"
                  "<body bgcolor=\"#f0f0f0\">\n"
         if( cookies != null ){
           out.println("<h2>أسماء و القيم الكوكي</h2>");
           for (int i = 0; i < cookies.length; i++){
              cookie = cookies[i];
              if((cookie.getName()).compareTo("url") == 0 ){
                   cookie.setMaxAge(0);
                   response.addCookie(cookie);
                   out.print("تم حذف الكوكي: " + 
                                cookie.getName() + "><br/>");
              }
              out.print("اسم المعامل: " + cookie.getName() + ",");
              out.print("قيمة المعامل: " + cookie.getValue() + " <br/>");
           }
        } else {
            out.println(
              "<h2 class=\"tutheader\">لم يتم العثور على كوكي</h2>
        }
        out.println("</body>");
        out.println("</html>");
        }
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }
}

تجميع Servlet أعلاه DeleteCookies، وأضف عنصرًا مناسبًا في ملف web.xml. ابدأ التشغيل الآن http://localhost:8080/TomcatTest/DeleteCookies، سيتم عرض النتيجة التالية: