1. مقدمة موجزة للجلسة
في تطوير الويب ، يمكن للخادم إنشاء كائن جلسة (كائن جلسة) لمتصفح كل مستخدم. ملاحظة: يمتلك المتصفح بشكل حصري كائن جلسة (افتراضيًا). لذلك ، عندما يكون من الضروري حفظ بيانات المستخدم ، يمكن لبرنامج الخادم كتابة بيانات المستخدم في جلسة حصرية لمتصفح المستخدم. عندما يستخدم المستخدم المستعرض للوصول إلى البرامج الأخرى ، يمكن للبرامج الأخرى استرداد بيانات المستخدم من جلسة المستخدم لخدمة المستخدم.
2. الاختلافات الرئيسية بين الجلسة وملفات تعريف الارتباط
ملفات تعريف الارتباط هي المستعرض الذي يكتب بيانات المستخدم للمستخدمين.
تكتب تقنية الجلسة بيانات المستخدم في جلسات مملوكة للمستخدم.
يتم إنشاء كائن الجلسة بواسطة الخادم ، ويمكن للمطورين الاتصال بالطريقة getSession لكائن الطلب للحصول على كائن الجلسة.
3. مبدأ تنفيذ الجلسة
3.1. كيف يقوم الخادم بتنفيذ جلسة لخدمة متصفح المستخدم؟
بعد إنشاء الخادم الجلسة ، ستكتب رقم معرف الجلسة إلى العميل في شكل ملف تعريف ارتباط. وبهذه الطريقة ، طالما لم يتم إغلاق متصفح العميل ، عند الوصول إلى الخادم ، سيحضر رقم معرف الجلسة. عندما يجد الخادم أن متصفح العميل لديه معرف الجلسة ، فإنه سيستخدم الجلسة المقابلة في الذاكرة لخدمتها. يمكن إثباته بالرمز التالي:
package xdp.gacl.session ؛ استيراد java.io.ioException ؛ استيراد javax.servlet.servletexception ؛ استيراد javax.servlet.http.httpservlet ؛ import javax.servlet.http.httpservled javax.servlet.http.httpsession ؛ import javax.servlet.http.httpsession ؛ استيراد javax.servlet.http.httpsession ؛ public class sessiondemo1 يمتد httpservlet {public void dogget (httpletrequest ، استجابة. setcharacterencoding ("utf = 8") ؛ استجابة. // استخدم getSession () لكائن الطلب للحصول على الجلسة. إذا لم تكن الجلسة موجودة ، قم بإنشاء جلسة httpsession = request.getSession () ؛ // تخزين البيانات الموجودة في الجلسة. // احصل على معرف Session SessionId = session.getId () ؛ // judge ما إذا كانت الجلسة تم إنشاؤها حديثًا إذا (session.isnew ()) {response.getWriter (). print ("تم إنشاء الجلسة بنجاح ، معرف الجلسة هو:"+SessionId) ؛ } آخر {response.getWriter (). print ("الجلسة موجودة بالفعل في الخادم ، معرف الجلسة هو:"+SessionId) ؛ }} public void dopost (httpservletrequest request ، httpservletresponse) يلقي servleTexception ، ioException {doget (request ، response) ؛ }}عند الوصول لأول مرة ، سيقوم الخادم بإنشاء جلسة جديدة وإرسال معرف الجلسة إلى متصفح العميل في شكل ملف تعريف ارتباط ، كما هو موضح في الشكل أدناه:
انقر فوق زر التحديث واطلب الخادم مرة أخرى. في هذا الوقت ، يمكنك أن ترى أنه عندما يطلب المتصفح الخادم مرة أخرى ، سيتم تمرير معرف الجلسة المخزن في ملف تعريف الارتباط إلى جانب الخادم معًا ، كما هو موضح في الشكل أدناه:
أعتقد أن طريقة request.getSession () يجب أن تكون قد قمت بالمعالجة التالية بعد الجلسة التي تم إنشاؤها حديثًا بالداخل
// احصل على جلسة IDString SessionId = Session.getId () ؛ // تخزين معرف الجلسة في ملف تعريف الارتباط باسم ملف تعريف الارتباط JsessionId Cookie = جديد ملف تعريف الارتباط ("jsessionid" ، SessionId) ؛ // قم بتعيين المسار الصحيح من ملف تعريف الارتباط cookie.setpath (request.getContextpath ()) ؛ Response.addcookie (ملف تعريف الارتباط) ؛4. معالجة الجلسة بعد تعطيل المتصفح ملفات تعريف الارتباط
4.1. IE8 تعطيل ملفات تعريف الارتباط
أدوات -> خيارات الإنترنت -> الخصوصية -> الإعدادات -> اسحب شريط التمرير إلى الأعلى (حظر جميع ملفات تعريف الارتباط)
4.2. الحل: url إعادة كتابة
Response.encoderedirecturl (java.lang.String url) يستخدم لإعادة كتابة عنوان عنوان URL بعد طريقة sendRedirect.
Response.encodeurl (java.lang.string url) يستخدم لإعادة كتابة عنوان عنوان URL الخاص بعمل النموذج والارتباط التشعبي
4.3. مثال: بعد تعطيل ملفات تعريف الارتباط ، تشارك Servlets البيانات في الجلسة
indexServlet
package xdp.gacl.session ؛ استيراد java.io.ioException ؛ استيراد java.io.printwriter ؛ استيراد java.util.linkedhashmap ؛ استيراد java.util.map ؛ import java.util.set ؛ import javax.servletexception ؛ import javax.servelt.htttp.http.http.http.http.http.http.http.http.httplet ؛ javax.servlet.http.httpservletrequest ؛ استيراد javax.servlet.http.httpletrequest ؛ import javax.servlet.http.httpletresponsponse ؛ // الصفحة الرئيسية: قائمة جميع الكتب فئة فئة توسيع httpserv {public استجابة httpservletresponse) يلقي servletexception ، ioException {reponse.setContentType ("text/html ؛ charset = utf-8") ؛ printWriter out = response.getWriter () ؛ // إنشاء request.getSession () ؛ Out.write ("يحتوي هذا الموقع على الكتب التالية: <br/>") ؛ SET <map.entry <string ، book >> set = db.getall (). intplsSet () ؛ لـ (map.entry <string ، book> me: set) {book book = me.getValue () ؛ String url = request.getContextPath () + "/servlet/buyservlet؟ id =" + book.getID () ؛ //إجابة. يتم استخدام encodeurl (java.lang.string url) لإعادة كتابة إجراء النموذج وعنوان عنوان URL لعنوان url hyperlink = response.encodeurl (url) ؛ // أعد كتابة عنوان عنوان URL الخاص بـ Hyperlink Out.println (book.getName ()+"<a href = '"+url+"'> شراء </a> <br/>") ؛ }} public void dopost (httpservletrequest request ، httpservletresponse) يلقي servleTexception ، ioException {doget (request ، response) ؛ }}/*** Author gacl* محاكاة قاعدة البيانات*/class db {خريطة ثابتة خاصة <سلسلة ، كتاب> map = new LinkedHashMap <string ، book> () ؛ ثابت {map.put ("1" ، كتاب جديد ("1" ، "Javaweb Development")) ؛ map.put ("2" ، كتاب جديد ("2" ، "تطوير الربيع")) ؛ map.put ("3" ، كتاب جديد ("3" ، "تطوير السبات")) ؛ map.put ("4" ، كتاب جديد ("4" ، "Struts Development")) ؛ Map.put ("5" ، كتاب جديد ("5" ، "Ajax Development")) ؛ } الخريطة الثابتة العامة <string ، book> getall () {return map ؛ }} كتاب الفئة {private string id ؛ اسم السلسلة الخاصة ؛ الكتاب العام () {super () ؛ } كتاب عام (معرف السلسلة ، اسم السلسلة) {super () ؛ this.id = id ؛ this.name = name ؛ } السلسلة العامة getId () {return id ؛ } public void setId (string id) {this.id = id ؛ } السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ }}Buyservlet
package xdp.gacl.session ؛ استيراد java.io.ioException ؛ استيراد java.util.arraylist ؛ import java.util.list ؛ import javax.servlet.servletexception ؛ import javax.servlet.http.httpservlet ؛ import javax.servlet.htttp.htttplet javax.servlet.http.httpservletresponse ؛ import javax.servlet.http.httpsession ؛ public class buyservlet يمتد httpservlet {public void doggeTextive (httpservled request ، httpservletresponse) trowspection ، iOexpection {string. كتاب كتاب = db.getall (). get (id) ؛ // احصل على الكتاب الذي يريد المستخدم شراء جلسة httpsession = request.getSession () ؛ قائمة <book> list = (list) session.getAttribute ("list") ؛ // احصل على الحاوية المستخدمة من قبل المستخدم لحفظ جميع الكتب إذا (list == null) {list = new ArrayList <Book> () ؛ Session.setAttribute ("List" ، List) ؛ } list.add (book) ؛ //إجابة. يتم استخدام enveredirecturl (java.lang.string url) لإعادة كتابة عنوان عنوان url بعد SendRedirect String url = reponse.encoderedirecturl (request.getContextPath ()+"/servlet/listcartservlet") ؛ System.out.println (url) ؛ استجابة. sendredirect (url) ؛ } public void dopost (httpservletrequest request ، httpservletresponse) يلقي servletexception ، ioException {doget (request ، response) ؛ }}ListCartServlet
package xdp.gacl.session ؛ استيراد java.io.ioException ؛ استيراد java.io.printwriter ؛ استيراد java.util.list ؛ استيراد javax.servlet.servletexception ؛ import javax.servlet.http.httpservlet ؛ import javax.servlet.htttp.htttplet javax.servlet.http.httpservletresponse ؛ import javax.servlet.http.httpsession ؛ فئة public listcartservlet يمتد httpservlet {public void dogge (httpservletrequest request ، httpservledsponse. استجابة. printWriter out = response.getWriter () ؛ جلسة httpsession = request.getSession () ؛ قائمة <book> list = (list) session.getAttribute ("list") ؛ if (list == null || list.size () == 0) {out.write ("آسف ، لم تشتري أي منتجات حتى الآن !!") ؛ يعود؛ } // إظهار المنتجات التي تم شراؤها من قبل المستخدم Out.write ("لقد اشتريت المنتجات التالية: <br>") ؛ لـ (كتاب كتاب: قائمة) {out.write (book.getName () + "<br/>") ؛ }} public void dopost (httpservletrequest request ، httpservletresponse) يلقي servleTexception ، ioException {doget (request ، response) ؛ }}تأثير التشغيل تحت IE8 مع تعطيل ملفات تعريف الارتباط هو كما يلي:
التأثير التجريبي
من خلال النظر إلى رمز HTML الذي تم إنشاؤه بواسطة IndexServlet ، يمكنك أن ترى أن كل ارتباط تشعبي يحتوي على معرف الجلسة متبوعًا ، كما هو موضح أدناه
// يحتوي هذا الموقع على الكتب التالية: <br/> تطوير javaweb <a href = '/javaweb_session_study_20140720/servlet/buyservlet ؛ href = '/javaweb_session_study_20140720/servlet/buyservlet ؛ jSessionId = 96bdfb9d87a08d5ab1eaa2537cde2db2؟ id = 2'> شراء </a> <br/> href = '/javaweb_session_study_20140720/servlet/buyservlet ؛ jSessionId = 96BDFB9D87A08D5AB1EAA2537CDE2DB2؟ id = 3'> شراء </a> <br/> href = '/javaweb_session_study_20140720/servlet/buyservlet ؛ jSessionId = 96bdfb9d87a08d5ab1eaa2537cde2db2؟ id = 4'> شراء </a> <br/> // ajax development <a href = '/javaweb_session_study_20140720/servlet/buyservlet ؛ jSessionId = 96BDFB9D87A08D5AB1EAA2537CDE2DB2؟ id = 5'> شراء </a> <br/>
لذلك ، عندما يعطل المتصفح ملفات تعريف الارتباط ، يمكنه إعادة كتابة هذا الحل باستخدام عناوين URL لحل مشكلة مشاركة بيانات الجلسة. علاوة على ذلك ، الاستجابة. encoderedirecturl (java.lang.string url) والاستجابة. encodeurl (java.lang.string url) هي طريقتان ذكيان للغاية. عندما يتم اكتشاف أن المتصفح لا يقوم بتعطيل ملفات تعريف الارتباط ، فلن يتم إعادة كتابة عنوان URL. نحن نصل إليه تحت متصفح Firefox دون تعطيل ملفات تعريف الارتباط ، والتأثير على النحو التالي:
كما يتضح من الرسوم المتحركة العرضية ، عندما يصل المتصفح لأول مرة ، يقوم الخادم بإنشاء جلسة ، ثم يرسل معرف الجلسة إلى المتصفح في شكل ملف تعريف ارتباط. الاستجابة. encodeurl (java.lang.string url) أعادت كتابة عنوان URL. عند النقر فوق زر التحديث للزيارة الثانية ، لا يقوم متصفح Firefox بتعطيل ملفات تعريف الارتباط ، لذلك يجلب ملف تعريف الارتباط في الزيارة الثانية. في هذا الوقت ، يمكن أن يعرف الخادم أن متصفح العميل الحالي لا يقوم بتعطيل ملفات تعريف الارتباط ، لذلك يخطر الاستجابة. طريقة encodeurl (java.lang.string url) التي لا تحتاج إلى إعادة كتابة عنوان URL.
5. توقيت إنشاء وتدمير كائنات الجلسة
5.1. وقت إنشاء كائن الجلسة
سيتم إنشاء جلسة جديدة عند استدعاء طريقة request.getSession () لأول مرة في البرنامج. يمكنك استخدام طريقة ISNew () لتحديد ما إذا كانت الجلسة تم إنشاؤها حديثًا.
مثال: إنشاء جلسة
// استخدم getSession () لكائن الطلب للحصول على الجلسة. إذا لم تكن الجلسة موجودة ، فقم بإنشاء جلسة httpsession = request.getSession () ؛ // الحصول على idstring sessionid = session.getId () ؛ هو: "+SessionId) ؛}
5.2. توقيت تدمير كائن الجلسة
لا يتم استخدام كائن الجلسة لمدة 30 دقيقة بشكل افتراضي ، وسيقوم الخادم تلقائيًا بتدمير الجلسة تلقائيًا. يمكن تكوين وقت فشل الجلسة يدويًا في ملف web.xml ، على سبيل المثال:
<؟ XSI: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-قم بتعيين الوقت الصحيح للجلسة: في الدقائق-> <Session-Config> <tate-timeout> 15 </session timeout> </ession-config> </bil-app>
عندما تحتاج إلى تعيين الجلسة يدويًا للفشل في البرنامج ، يمكنك الاتصال يدويًا بالجلسة.
1 جلسة httpsession = request.getSession () ؛
2 // اتصل يدويًا بالجلسة.
3 Session.invalidate () ؛
ما سبق هو كل شيء عن هذا المقال ، آمل أن يكون من المفيد للجميع أن يتعلموا الجلسة.