مقدمة الجلسة
تشير الجلسة إلى عملية التفاعل بين المستخدم باستخدام نفس عملية المتصفح وتطبيق الويب على مدار فترة زمنية.
عادةً ما تستخدم الجلسات لتتبع حالة المستخدم وذاكرة التخزين المؤقت لمعلومات المستخدم في عملية المتصفح هذه.
عندما يغلق المستخدم المتصفح ، لا يمكن الحصول على الجلسة السابقة مرة أخرى (الحالة التي يكون فيها أقصى ملف تعريف الارتباط -1). افتح متصفحًا جديدًا مرة أخرى وستبدأ جلسة جديدة.
فئة javax.servlet.http.httpsession. يمثل كل httpsession جلسة للمستخدم.
وقت انتهاء صلاحية كل جلسة هو 30 دقيقة بشكل افتراضي.
عندما يصل المتصفح أولاً إلى الخادم ، بغض النظر عن الصفحة التي يزورها أولاً ، سيقوم الخادم بتعيين معرف جلسة فريد للمستخدم ، أي JSessionID ثم إعادته إلى المستخدم في شكل ملف تعريف ارتباط.
الشكل التالي هو رأس استجابة (يعتمد الشكل التالي على Servlet 3.0 ، ولا توجد سمة httponly في Servlet 2.5)
يقوم الخادم بإنشاء جلسة لكل مستخدم ، أي كائن HTTPSENESS ، ويحفظه على جانب الخادم.
لذلك ، عندما يصل المستخدم إلى الخادم مرة أخرى ، كيف يعرف الخادم أو المستخدم الحالي؟
عندما يصل المتصفح إلى الخادم مرة أخرى ، فإنه سيحمل ملف تعريف ارتباط يحتوي على jsessionID للوصول إلى الخادم. يقوم الخادم بإرجاع كائن httpsession لهذا المستخدم بناءً على هذا المعرف ، ويحافظ على الجلسة.
(إذن ، هل من الممكن تنفيذ نفس الجلسة على متصفحات مختلفة؟
فيما يلي عنوان URL النموذجي ، الذي له تأثير محوّر معين ويمكنه تنفيذ نفس الجلسة على المتصفحات المختلفة:
http: // localhost: 8080/day07_2/cncookoieservlet ؛ jsessionid = f8692d61cd46d094dbb7a8fc7387649c)
العلاقة بين المتصفح والخادم هي كما يلي:
httpsession:
في servlet ، يتم الحصول على كائن الجلسة من خلال طريقة httpservletrequest.getSession.
يتم استخدام الطرق التالية لواجهة HTTPSESSERESS لمشاركة البيانات على مستوى الجلسة:
getAttribute ("name") setAttribute ("name" ، object) ؛ getAttributenames () requoveAttribute ("name")إبطال () ؛ - هذه الطريقة تحذف بقوة الجلسة المخزولة الخادم.
مثال:
setAttribute في httpsession من servlet.
انتقل إلى servlet آخر عبر HyperConnect ، أو غير ذلك وعرض المعلومات عبر getAttribute.
استدعاء getAttribute في أي servlet لعرض المعلومات.
أغلق هذا المتصفح وإعادة النظر في servlet التي تحصل على معلومات ، وسوف تجد أنه لا توجد معلومات بعد الآن.
على النحو التالي:
اسم السلسلة = request.getParameter ("name") ؛ request.setattribute ("name" ، "request ---"+name) ؛ request.getSession (). setAttribute ("name" ، "Session ---"+name) ؛ getServletContext (). setAttribute ("name" ، "application ---"+name) ؛ المعرف الفريد للجلسة:
كل جلسة لها معرف فريد ، وهو معرف.
عندما يحصل المتصفح على جلسة جديدة ، يمكن للمستخدم طباعة قيمة المعرف من خلال Session.geid ().
دون إغلاق المتصفح ، والقفز على صفحات متعددة ، باستخدام نفس الجلسة.
يحب:
request.getSession (). getId ()
ما هو مخرج آمن:
عندما يخرج المستخدم ، يجب عليه مسح معلوماته من الجلسة - أي الخروج بأمان.
المخرج الآمن هو مسح المعلومات التي تتركها على الخادم لمنعها من اختراقها.
session.invalidate () ؛
1. request.getSession (). perilated () ؛
هذا يسمح بحذف الكائنات المقابلة في تجمع الجلسة.
2. Session.RemoVeatTribute (...)
يحب:
request.getSession (). removeAttribute ("realcode") ؛
تستخدم لحذف السمات في كائنات الجلسة
تتبع الجلسة بإعادة كتابة عنوان URL:
كما ذكرنا سابقًا ، تقوم حاوية Servlet أولاً بحفظ SessionId على العميل. في وقت لاحق ، عندما يصدر المتصفح طلب HTTP ، فإنه سيحتوي على هذا SessionId. تقرأ حاوية Servlet SessionId في طلب HTTP وتخرج كائن HTTPSession من الحاوية استنادًا إلى SessionId لتسهيل تتبع الجلسة التي ينتمي إليها طلب HTTP. وتسمى هذه العملية تتبع الجلسة.
إذا كان المتصفح يدعم ملفات تعريف الارتباط ، فإن حاوية Servlet تنقذ SessionId كملف تعريف ارتباط على عميل المتصفح. ولكن إذا قام المستخدم بتعطيل ملفات تعريف الارتباط لأسباب أمنية ، فكيف يمكن لحاوية Servlet تتبع الجلسة؟
أولاً ، دعنا نتعطش ملفات تعريف الارتباط في IE (ملاحظة: لا يعمل مع بعض أنظمة الأشباح).
أي> الأدوات> خيارات الإنترنت> الخصوصية> المتقدمة ، ثم تعطيل ملفات تعريف الارتباط:
يمكننا إضافة مثل هذا الارتباط التشعبي إلى الصفحة الرئيسية: (وضعت الكود المتعلق بـ saveservlet.java getservlet.java logoutservlet.java logoutservlet.java في الكود التالي)
<h2> أظهر تقنية url لإعادة كتابة ---- تكسير المشكلة التي تفيد بأن جلستنا غير صالحة بعد تعطيل المستخدم ملفات تعريف الارتباط </h2> <form action = "<٪ = response. HREF = "<٪ = response.encodeurl (" getServlet ") ٪>"> إعادة كتابة بيانات قراء عنوان URL في العديد من الحاويات </a> <br/> <A.يمكن أن تدرك هذه الجملة <form Action = "<٪ = response.encodeurl ("/aa ") ٪>"> هذه الوظيفة
بعد تعطيل ملفات تعريف الارتباط هنا ، لا يزال بإمكان المستعرض تلقي ملفات تعريف الارتباط التي يتم إرسالها بواسطة الخادم ، ولكن يمكن للمتصفح قبولها فقط ولا يمكنها إرسالها إلى الخادم. إذا تعذر إرسال ملفات تعريف الارتباط ، فلن تتمكن من الذهاب إلى تجمع الجلسة للحصول على الكائن المقابل.
بعد إدخال القيمة المطلوبة في النموذج ، انتقل إلى الارتباط التشعبي في GetServlet أدناه لمعرفة ما إذا كان لا يزال من الممكن عرض قيمة الإدخال. الجواب نعم. مسار الوصول هنا مشابه
http: // localhost: 8080/day07_2/cncookoieservlet ؛ jsessionid = f8692d61cd46d094dbb7a8fc7387649c ، The jsessionid = f8692d61cd46d094dbbbbbbb7a8fc7649c. وبهذه الطريقة ، يمكنك الوصول إليه عن طريق إدخال عنوان URL هذا في متصفح آخر.
هنا أريد أن أضيف: (الموقف التالي هو أنه عندما أكتب كائن httpsession في تجمع الجلسة ، فإن قيمة jsessionid وقيمة الجلسة المقابلة في ملف تعريف الارتباط. سوف يقوم ملف تعريف الارتباط هذا بالكتابة فوق الكلام الذي تم إنشاؤه بواسطة النظام ، وهو ما يعادل أن يتم إنشاؤه بنفسي.
في الحالتين سواء تم تعطيل ملفات تعريف الارتباط ، تختلف معرفات الكائنات التي تم إنشاؤها حديثًا في تجمع الجلسة. أي إذا قمت بإدخال قيمة اسم في النموذج عند تعطيل ملفات تعريف الارتباط ، فإن نتيجة الاستعلام هي كما يلي:
و jsessionid هو 2BB51EBDEAAF14D19656C71E1B6F9FF6
ثم قم بالتغيير فورًا إلى وضع ملف تعريف الارتباط دون تعطيله ، وأدخل اسمًا آخر مثل TOM ، وستكون نتيجة الاستعلام من TOM بطبيعة الحال ، و jsessionid
203F9E4DB5D874476B81DAF350661B6A ، وهو يختلف عن تعطيل ، مما يجعل النتائج التالية تظهر.
ثم في هذا الوقت ، نغلق المتصفح ، وأدخل المتصفح مرة أخرى ، وعرض نتائج الوصول دون تعطيل وضع ملفات تعريف الارتباط ، على النحو التالي:
سأقوم بنشر الكود الرئيسي أدناه:
Saveservlet.java
حزمة cn.hncu.servlets.session ؛ استيراد java.io.ioException ؛ استيراد java.io.printwriter ؛ استيراد javax.servlet.servletexception ؛ استيراد javax.servlet.http.cookie ؛ استيراد javax.servlet.http.httpservlet ؛ استيراد javax.servlet.http.httpservletrequest ؛ استيراد javax.servlet.http.httpservletresponse ؛ فئة Public SaveServlet تمتد httpservlet {public void doget (httpservletrequest request ، httpservletresponse) يلقي servletexception ، ioException {dopost (request ، response) ؛ } public void dopost (httpservletrequest request ، httpservletresponse) يلقي servletexception ، ioException {reponse.setContentType ("text/html ؛ charset = utf-8") ؛ printWriter out = response.getWriter () ؛ request.setcharacterencoding ("UTF-8") ؛ اسم السلسلة = request.getParameter ("name") ؛ request.setattribute ("name" ، "request ---"+name) ؛ request.getSession (). setAttribute ("name" ، "Session ---"+name) ؛ getServletContext (). setAttribute ("name" ، "application ---"+name) ؛ // مثال على الجمع بين تقنية ملفات تعريف الارتباط وتكنولوجيا الجلسة للتطبيق -※ الوظيفة: بعد إغلاق المتصفح ، إذا كان بإمكان المستخدم تسجيل الدخول إلى هذا الموقع في غضون 10 دقائق ، فيمكنه أيضًا الوصول إلى المعلومات في الجلسة // كتابة ملف تعريف الارتباط بمفتاح "JSessionId" والقيمة كجلسة للعميل. ملف تعريف الارتباط C = Cookie جديد ("JSessionId" ، request.getSession (). getId ()) ؛ C.SetMaxage (60*10) ؛ // الظاهرة أعلاه ناتجة عن هذه الجملة. بدون هذه الجملة ، لن تكون هناك مثل هذه الظاهرة كما هو مذكور أعلاه C.SetPath (request.getContextPath ()) ؛ استجابة. addcookie (c) ؛ Out.println ("حفظ بنجاح ...") ؛ out.flush () ؛ out.close () ؛ }}getServlet.java
حزمة cn.hncu.servlets.session ؛ استيراد java.io.ioException ؛ استيراد java.io.printwriter ؛ استيراد javax.servlet.servletexception ؛ استيراد javax.servlet.http.httpservlet ؛ استيراد javax.servlet.http.httpservletrequest ؛ استيراد javax.servlet.http.httpservletresponse ؛ يمتد GetServlet للطبقة العامة httpservlet {public void dogge (httpservletrequest request ، httpservletresponse) يلقي servletexception ، ioException {response.setContentType ("text/html ؛ charset = utf-8") ؛ printWriter out = response.getWriter () ؛ out.println ("<! doctype html public/"-// w3c // dtd html 4.01 Transitional // en/">") ؛ out.println ("<html>") ؛ Out.println ("<head> <title> servlet </title> </head>") ؛ out.println ("<body>") ؛ reqname string = (string) request.getAttribute ("name") ؛ string sename = (string) request.getSession (). getAttribute ("name") ؛ String AppName = (String) getServletContext (). getAttribute ("name") ؛ Out.println (reqname+"<br/>") ؛ Out.println (Sename+"<br/>") ؛ Out.println (AppName+"<br/>") ؛ Out.println ("</body>") ؛ out.println ("</html>") ؛ out.flush () ؛ out.close () ؛ }}logoutservlet.java
حزمة cn.hncu.servlets.session ؛ استيراد java.io.ioException ؛ استيراد java.io.printwriter ؛ استيراد javax.servlet.servletexception ؛ استيراد javax.servlet.http.httpservlet ؛ استيراد javax.servlet.http.httpservletrequest ؛ استيراد javax.servlet.http.httpservletresponse ؛ يمتد LogoutServlet من الفئة العامة httpservlet {public void dogge (httpservletrequest request ، httpservletresponse) يلقي servletexception ، ioException {response.setContentType ("text/html ؛ charset = utf-8") ؛ printWriter out = response.getWriter () ؛ // مخرج آمن --- طالما أن كائن الجلسة غير صالح request.getSession (). pervility () ؛ Out.println ("خروج آمن ...") ؛ }}ما سبق هو إدارة جلسة جافاويب التي قدمها لك المحرر. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، يرجى ترك رسالة لي. سوف يرد المحرر إليك في الوقت المناسب!