English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
الكوكي هو ملف نصي يتم تخزينه على جهاز الكمبيوتر الخاص بالعميل ويحتفظ بمعلومات تتبع متنوعة. يدعم 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.
الترتيب | الطريقة & الوصف |
---|---|
1 | public void setDomain(String pattern) يُحدد هذا الطريقة المجال الذي يُطبق الكوكي عليه، مثل oldtoolbag.com. |
2 | public String getDomain() يُرجع هذا الطريقة المجال الذي يُطبق الكوكي عليه، مثل oldtoolbag.com. |
3 | public void setMaxAge(int expiry) يُحدد هذا الطريقة وقت انتهاء صلاحية الكوكي (بالثواني). إذا لم يتم ذلك، سيُبقى الكوكي قائمًا فقط في جلسة الدخول الحالية. |
4 | public int getMaxAge() يُرجع هذا الطريقة عمر الكوكي الأقصى (بالثواني). في الحالة الافتراضية، -1 يعني أن الكوكي سيُبقى قائمًا حتى إغلاق المتصفح. |
5 | public String getName() يُرجع هذا الطريقة اسم الكوكي. لا يمكن تغيير الاسم بعد إنشائه. |
6 | public void setValue(String newValue) يُحدد هذا الطريقة القيمة المُرتبطة بكوكي. |
7 | public String getValue() يُسقط هذا الطريقة القيمة المُرتبطة بكوكي. |
8 | public void setPath(String uri) يُحدد هذا الطريقة مسار تطبيق الكوكي. إذا لم تُحدد مسارًا، فإن جميع URLs تحت نفس الدليل الحالي (بما في ذلك الدلائل الفرعية) ستعود بكوكي. |
9 | الافتراضية مسار() يتم الحصول على المسار الذي ينطبق عليه الكوكي. |
10 | الافتراضية إرسالآمن(boolean علم) يتم تعيين هذا الطريقة قيمة بولية تعبر عن ما إذا كان يجب إرسال الكوكي فقط عبر الاتصالات المشفرة (SSL). |
11 | الافتراضية تعليق(String غرض) تعيين تعليق الكوكي. يمكن أن تكون هذه التعليقات مفيدة جدًا عند عرض الكوكي على المستخدم من قبل المتصفح. |
12 | الافتراضية تعليق() الحصول على التعليق لكوكي، إذا لم يكن لديه تعليق، فسيتم رد null. |
يتم تعيين كوكي من خلال 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، وسنرى ما يلي:
بعد الضغط على "إرسال"، سيكون التأثير كالتالي:
ملاحظة:بعض المسارات المذكورة أعلاه يجب تعديلها بناءً على مسار مشروعك الفعلي.
لقراءة الكعكة، يجب عليك تنفيذ 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، سيتم عرض النتيجة التالية:
إزالة الكوكي بسيطة للغاية. إذا كنت ترغب في إزالة كوكي، فإنك بحاجة إلى اتباع الخطوات الثلاث التالية:
اقرأ كوكي موجود، واقمله في كائن 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، سيتم عرض النتيجة التالية: