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

مثال تفصيلي على إدارة جلسات Session في JavaWeb

مقدمة لجلسة Session

الجلسة هي عملية تفاعل بين المستخدم وبين تطبيق الويب خلال فترة من الزمن.

عادة ما تستخدم الجلسة (Session) لتتبع حالة المستخدم، وتخزين المعلومات التي يستخدمها المستخدم في عملية المتصفح الحالية.

عندما يغلق المستخدم المتصفح، يصبح الجلسة السابقة غير قابلة للوصول مرة أخرى (عندما يكون maxAge لـ Cookie يساوي -1). عند فتح متصفح جديد، يبدأ جلسة جديدة.

فئة javax.servlet.http.HttpSession. كل HttpSession تمثل جلسة مستخدم.
وقت انتهاء الصلاحية المعتاد لكل جلسة هو 30 دقيقة.

عندما يزور المتصفح الخادم لأول مرة، لا يهم أي صفحة يزورها أولاً، يبدأ الخادم في تخصيص هوية جلسة فريدة للمستخدم، وهي jsessionid، ويتم إرجاعها للمستخدم تحت شكل cookie.
الشكل التالي هو رأس الرد (الشكل يعتمد على Servlet3.0، في Servlet2.5 لا يوجد خاصية HttpOnly)

يبدأ الخادم في إنشاء جلسة لكل مستخدم، وهي شكل HttpSession، ويتم حفظها على الجانب الخادم.

إذاً، كيف يعرف الخادم عند عودة المستخدم مرة أخرى أنه نفس المستخدم؟

عندما يعود المتصفح إلى الخادم مرة أخرى، يحمل كعكس الحلوى ملفات الـ cookie تحتوي على jsessionid لزيارة الخادم. يعتمد الخادم على هذا id لتحويل هذا المستخدم إلى HttpSession، مما يحافظ على الجلسة.
إذاً، هل يمكن تحقيق نفس الجلسة في مختلف المتصفحات؟

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

http://localhost:8080/day07_2/CNCookieServlet;jsessionid=F8692D61CD46D094DBB7A8FC7387649C )

علاقة المتصفح والخادم كالتالي في الصورتين التاليتين:


HttpSession:

في Servlet، يتم الحصول على شكل الجلسة باستخدام طريقة HttpServletRequest.getSession.

استخدام بعض طرق HttpSession التالية لتبادل البيانات عبر نطاق الجلسة:

getAttribute(“name”)
setAttribute(“name”,object);
getAttributeNames()
removeAttrubute(“name”)

Invalidate(); - هذا الطريقة تزيل قوة حافظة session على الخادم.

مثال:

في Servlet، يتم تعيين بعض القيم في httpSession باستخدام setAttribute.

باستخدام رابط متعدد، أو أي طريقة أخرى للانتقال إلى servlet آخر وتسجيل الدخول إلى المعلومات باستخدام getAttribute.

تسجيل الدخول إلى معلومات في أي servlet باستخدام getAttribute.

إغلاق هذا المتصفح، ثم استعادة الدخول إلى servlet الذي تم الحصول على المعلومات منه، وستجد أنه لم يعد هناك أي معلومات.

كما يلي:

String name=request.getParameter("name"); 
request.setAttribute("name", "request---"+name); 
request.getSession().setAttribute("name", "session---"+name); 
getServletContext().setAttribute("name", "application---"+name); 

معرف جلسة Session:

كل جلسة لها معرف فريد، وهو ID.

عند الحصول على جلسة جديدة من المتصفح، يمكن للمستخدم الطباعة قيمة ID باستخدام session.geId();

عند التصفح عبر عدة صفحات دون إغلاق المتصفح، يتم استخدام نفس الجلسة.

مثلاً:

request.getSession().getId() 

ما هو الخروج الأمن؟

عند خروج المستخدم، يجب حذف معلومات المستخدم من الجلسة - أي الخروج الأمن.

يهدف الخروج الأمن إلى حذف المعلومات التي تركتها على الخادم، لمنع الهجوم

Session.invalidate();

1、request.getSession().invalidate();

بهذا يمكن حذف الجسم المناظر في مكتبة الجلسة

2、Session.removeAttribute(…)

مثلاً:

request.getSession().removeAttribute("realCode");

لحذف الخاصية من جسم الجلسة

متابعة الجلسة من خلال إعادة كتابة URL:

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

إذا كان المتصفح يدعم الكوكي، فإن Servlet قارئ يحفظ SessionID ككوكي في عميل المتصفح. ولكن إذا تم تعطيل الكوكي من قبل المستخدم لأسباب أمنية، كيف سيقوم Servlet قارئ بتعقب الجلسة؟

دعونا أولاً نتعطيل الكوكي في IE (ملاحظة: هذا لا يعمل لبعض الأنظمة GHOST).

IE>أدوات>خيارات الإنترنت>الخصوصية>الم متقدم، ثم تعطيل الكوكي:

نحن يمكن أن نضيف رابط مثل هذا على الصفحة الرئيسية: (أوامر الكود في SaveServlet.java GetServlet.java LogoutServlet.java مرفقة في النهاية)

<h2>عرض تقنية تعديل العنوان - حل مشكلة عدم صلاحية جلسة المستخدم بعد تعطيل الكوكيز</h2> 
<form action="<%=response.encodeURL("saveServlet")%>" method="post"> 
الاسم:<input type="text" name="name"/><br/> 
<input type="submit"/> 
</form> 
<a href="<%=response.encodeURL("getServlet")%>">تعديل العنوان - قراءة بيانات عدة من الأنواع</a><br/> 
<a href="<%=response.encodeURL("logoutServlet")%>">تعديل العنوان - خروج آمن</a> 

هذا <form action="<%=response.encodeURL("/aa")%>"> يمكن تنفيذ هذه الوظيفة

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

في هذا الكود، بعد إدخال القيمة المطلوبة في النموذج، انتقل إلى رابط getServlet هنا لمعرفة ما إذا كان يمكن عرض القيمة أم لا، والجواب هو نعم، مسار الوصول هذا يشبه

http://localhost:8080/day07_2/CNCookieServlet;jsessionid=F8692D61CD46D094DBB7A8FC7387649C ، ويكون id الخاص به هو jsessionid=F8692D61CD46D094DBB7A8FC7387649C، وهكذا، يمكنك أيضًا الوصول إلى هذا العنوان في متصفح آخر.
أريد أن أضيف: (حالة التالي هي عند كتابتي لجلسة session HttpSession في قيمة JSESSIONID والقيمة في الكوكيز، الكوكيز هذا سيغطي الكوكيز الذي يصنعه النظام، فهو مثل الكوكيز الذي أصنعه بنفسي، أعددت وقت الحفظ إلى عشر دقائق، إذا لم يتم تغطيته، فإن الكوكيز سينتهي عند إغلاق المتصفح، وسيظهر الظاهرة التالية أيضًا)

在是否禁用了cookie这两种情况下在session池中新建的对象的id是不一样的,即假如你在禁用了cookie时在表单中输入了一个name的值,查询结果如下:

并且jsessionid为2BB51EBDEAAF14D19656C71E1B6F9FF6

然后马上换成不禁用cookie模式,输入另一个名字如Tom,查询结果自然会是两个Tom,jsessionid为

203F9E4DB5D874476B81DAF350661B6A,与禁用是不一样,这就使出现下面的结果了

然后此时我们将浏览器关闭,再次进入浏览器,在不禁用cookie模式下查看访问结果,如下:

下面我将主要的代码贴上来:

SaveServlet.java

باكجيت cn.hncu.servlets.session; 
استورد java.io.IOException; 
استورد java.io.PrintWriter; 
استورد javax.servlet.ServletException; 
import javax.servlet.http.Cookie; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
public class SaveServlet extends HttpServlet { 
public void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
doPost(request, response); 
} 
public void doPost(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
response.setContentType("text/html;charset=utf-8"); 
PrintWriter out = response.getWriter(); 
request.setCharacterEncoding("utf-8"); 
String name=request.getParameter("name"); 
request.setAttribute("name", "request---"+name); 
request.getSession().setAttribute("name", "session---"+name); 
getServletContext().setAttribute("name", "application---"+name); 
//把cookie技术和session技术联合起来做应用的一个例子---※功能:让用户在关闭浏览器之后,如果10分钟之内能够登录本站,还能访问到session中的信息 
//向客户端写一个key为"JSESSIONID"用value为sessionid的cookie, 
Cookie c=new Cookie("JSESSIONID", request.getSession().getId()); 
c.setMaxAge(60*10);//هذا هو السبب في هذا الظاهرة، بدون هذا الجملة لن يكون هناك هذا الظاهرة 
c.setPath(request.getContextPath()); 
response.addCookie(c); 
out.println("حفظ بنجاح..."); 
out.flush(); 
out.close(); 
} 
}

GetServlet.java

باكجيت cn.hncu.servlets.session; 
استورد java.io.IOException; 
استورد java.io.PrintWriter; 
استورد javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
public class GetServlet extends HttpServlet { 
public void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
response.setContentType("text/html;charset=utf-8"); 
PrintWriter out = response.getWriter(); 
out.println("<!DOCTYPE HTML PUBLIC \ 
out.println("<HTML>"); 
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); 
out.println(" <BODY>"); 
String reqName=(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; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
public class LogoutServlet extends HttpServlet { 
public void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
response.setContentType("text/html;charset=utf-8"); 
PrintWriter out = response.getWriter(); 
// الخروج بشكل آمن - يجب جعل session object غير صالح 
request.getSession().invalidate(); 
out.println("تم الخروج بشكل آمن..."); 
} 
} 

ما تم ذكره أعلاه هو إدارة جلسات JavaWeb Session التي قدمها المحرر لكم، آمل أن يكون مفيدًا لكم، إذا كان لديكم أي استفسارات، فلا تترددوا في ترك تعليق، وسأقوم بالرد على استفساراتكم في أقرب وقت ممكن!

البيان: محتويات هذا المقال تم جمعها من الإنترنت، ويتمتع صاحب الحقوق الأصلية بجميع الحقوق، ويتم توفير المحتوى من قبل المستخدمين عبر الإنترنت الذين يقومون بتحميله بشكل تلقائي، ولا يملك هذا الموقع حقوق الملكية، ولا يتم تعديل المحتوى بشكل يدوي، ولا يتحمل هذا الموقع أي مسؤولية قانونية في هذا الصدد. إذا اكتشفتم محتوى يشتبه في انتهاك حقوق النسخ، فلا تترددوا في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # بـ @) لتقديم الشكوى، وتقديم الأدلة ذات الصلة، وسينتظر الموقع إجراءات الحذف الفورية للمحتوى المزعوم.

أعجبك هذا