كنجم صاعد، يمكن لـ JSP أن يحتل موقعًا معينًا في بيئة برمجة الخادم، وهو ما يرتبط ارتباطًا وثيقًا بدعمه الجيد لسلسلة من معايير الصناعة. الجلسة هي إحدى البنية التحتية التي توفرها. كمبرمج، يمكنك بسهولة تنفيذ إدارة مستخدم بسيطة تعتمد على الجلسة دون القلق بشأن كيفية تنفيذها على العميل. هناك عدة طرق مختلفة للتعامل مع مستخدمي الإنترنت هذه الأيام.
أحدهما هو أن المستخدم يتحكم في تحديث الصفحة، ويتحكم الخادم في مهلة مثل 30 دقيقة، وبعد انتهاء الوقت، سيتم طرد المستخدم إذا لم يكن هناك أي إجراء. وتتمثل ميزة هذه الطريقة في أنه إذا نسي المستخدم تسجيل الخروج، فيمكنه منع الآخرين من العمليات الضارة. العيب هو أنه إذا كنت تفعل شيئًا يستغرق الكثير من الوقت ويتجاوز هذا الحد الزمني، فقد تضطر إلى تسجيل الدخول مرة أخرى عند الإرسال. إذا اضطر سطح الورقة الأصلي إلى الفشل مرة أخرى، فقد تفقد العمل الذي قمت به. من منظور التنفيذ، هذا هو الأبسط، ويقوم جانب الخادم بتنفيذ هذا الوضع افتراضيًا.
هناك طريقة أخرى وهي أن الموقع يعتمد بنية إطار، ويوجد إطار أو إطار iframe مخفي يتم تحديثه باستمرار، لذلك لن يتم طردك أبدًا. ومع ذلك، من أجل تحديد ما إذا كنت متصلاً بالإنترنت، يحتاج الخادم إلى تعيين إذا تجاوزت وقت الذهول هذا، إذا لم تقم بتحديث الصفحات الأخرى باستثناء هذه الصفحة التي تم تحديثها تلقائيًا، فسيتم اعتبار أنك لم تعد متصلاً بالإنترنت. والمثال النموذجي لهذا النهج هو xici.net. وتتمثل ميزته في أنه يمكنه استخدام التحديث المستمر لتنفيذ بعض الوظائف المشابهة للدفع بالخادم، مثل إرسال الرسائل بين مستخدمي الإنترنت.
بغض النظر عن الوضع المستخدم، يجب القيام ببعض الأعمال الإضافية لتصفح جميع المستخدمين المتصلين حاليًا. لا توجد واجهة برمجة تطبيقات للحصول على قائمة الجلسات في واجهة برمجة تطبيقات Servlet.
ما يمكن استخدامه هو المستمع. تختلف مواصفات Servlet 2.2 و 2.3 قليلاً هنا. يمكن لـ HttpSessionBindingListener في الإصدار 2.2 تنفيذ فئة تُعلمك عند تغيير السمة في جلسة HTTPSession. تم تقديم HttpSessionAttributeListener أيضًا في الإصدار 2.3. نظرًا لأن البيئة التي أستخدمها هي Visual age لـ Java 4 وJRun server 3.1، فإنها لا تدعم برمجة Servlet 2.3 بشكل مباشر. وهنا أستخدم
HttpSessionBindingListener تنفيذ واجهة HttpSessionBindingListener. تحتوي هذه الواجهة على طريقتين:
قيمة باطلة عامة (حدث HttpSessionBindingEvent)
قيمة باطلة عامة Unbound (حدث HttpSessionBindingEvent)
عند تنفيذ Session.addAttribute(String,Object)، إذا قمت بإضافة فئة تنفذ واجهة HttpSessionBindingListener كسمة، فسوف تخطر الجلسة فصلك واستدعاء طريقة valueBound الخاصة بك. على العكس من ذلك، يتوافق الأسلوب Session.removeAttribute مع الأسلوب valueUndound.
public class HttpSessionBindinglets javax.servlet.http.HttpSessionBindingListener
{
ServletContext application = null;
public HttpSessionBinding(ServletContext application)
{
super();
if (application ==null)
throw new IllegalArgumentException("التطبيق الفارغ غير مقبول.")
; .application = application;
}
public void valueBound(javax.servlet.http.HttpSessionBindingEvent e)
{
Vector activeSessions = (Vector
)
application.getAttribute("activeSessions")
;
}
JDBCUser sessionUser = (JDBCUser)e.getSession().getAttribute("user");
if (sessionUser != null)
{
activeSessions.add(e.getSession())
}
application.setAttribute("activeSessions",activeSessions) }
public void valueUnbound(javax.servlet.http.HttpSessionBindingEvent e)
{
JDBCUser
sessionUser
= (JDBCUser
)e.getSession().getAttribute("user")
; .getAttribute("activeSessions");
if (activeSessions != null)
{
activeSessions.remove(e.getSession().getId());
application.setAttribute
(
"
activeSessions
"
,activeSessions);
الفئة هي فئة مستخدم تعسفية. عند إجراء تسجيل دخول المستخدم، أضف كلاً من فئة المستخدم وفئة HttpSessionBinding إلى الجلسة.
بهذه الطريقة، في كل مرة يقوم فيها المستخدم بتسجيل الدخول، سيتم إضافة سجل إلى ناقل السمة "activeSessions" في التطبيق. عندما تنتهي مهلة الجلسة، يتم تشغيل valueUnbound، ويتم حذف الجلسة التي ستنتهي مهلتها من هذا المتجه
public void logo()
throws ACLException,SQLException,IOException
{
/* get JDBC User Class */
if (user != null)
.)
{
logout(
);
}
{
//إذا
انتهت مهلة الجلسة، أو لم يقوم المستخدم بتسجيل الدخول، فاحفظ عنوان URL الهدف مؤقتًا
=null) ||.(this.request.getParameter("password")==null) )
{
throw new ACLException("الرجاء إدخال اسم مستخدم وكلمة مرور صالحين.");
JDBCUser
user = (JDBCUser) uf.UserLogin(
this .request.getParameter("userID"),
this.request.getParameter("password") )
;
this.session.setAttribute("user",user
this.session.setAttribute("BindingNotify")
;,new HttpSessionBinding (application));
}
}
عند تسجيل الدخول، قم بإضافة المستخدم وفئة الغرض BindingNotofy إلى الجلسة. عند تسجيل الخروج، يجب عليك حذف الجلسة بشكل فعال في ناقل activeSessions.
public void logout()
throws SQLException,ACLException
{
if (this.user == null && this.session.getAttribute("user")==null)
{
return }
Vector activeSessions = (Vector) this.application.getAttribute("activeSessions");
if
(activeSessions
!=null
)
{
activeSessions.remove(this.session)
;
util.Enumeration e = this.session.getAttributeNames();
while (e.hasMoreElements())
{
String s = (String)e.nextElement();
this.session.removeAttribute
(s)
; );
this.user = null
}
توجد هاتان الوظيفتان في فئة HttpSessionManager. تشير هذه الفئة إلى كائن التطبيق العام في jsp. الكود الآخر لهذه الفئة ليس له علاقة بهذه المقالة وهو طويل جدًا، لذا لن أقوم بنشره.
دعونا نلقي نظرة على كيفية استخدامه في JSP.
افترض أنه تم إرسال نموذج تسجيل الدخول إلى doLogin.jsp، ويحتوي النموذج على حقلي اسم المستخدم وكلمة المرور. مقتطف:
<%
HttpSessionManager hsm = new HttpSessionManager(application,request,response);
حاول
{
hsm.login();
}
Catch (UserNotFoundException e)
{
Response.sendRedirect("InavailablePrivilege.jsp?detail=User%20does%20not %20exist" .");
return;
}
Catch (InvalidPasswordException e2)
{
Response.sendRedirect("InfinitePrivilege.jsp?detail=Invalid%20Password");
return;
}
Catch (Exception e3)
{
%> Error:<%=e3.toString( ) %><br>
اضغط <a href="login.jsp">هنا
</a> لإعادة تسجيل الدخول
<% return
}
Response.sendRedirect
("index.jsp");
لديك الآن كيفية الحصول على قائمة بالمستخدمين المتصلين حاليًا.
<body bgcolor = "#FFFFFF" >
< تباعد الخلايا في الجدول = "0" cellpadding = "0" العرض = "100٪" >
<tr >
<td style = "width:24px">SessionId
</td>
<td style= "width:80px" > المستخدم
</td>
<td style="width:80px" > وقت تسجيل الدخول
</td>
<td style ="width:80px" > آخر وقت للوصول
</td>
</tr>
<%
Vector activeSessions=
(Vector) application.getAttribute("activeSessions");
if (activeSessions
== null)
{
activeSessions = new Vector()
;
while
(it.hasNext())
{
HttpSession sess = (HttpSession)it.next();
JDBCUser sessionUser = (JDBCUser)sess.getAttribute
("user");
():"None";
%>
<tr>
<td nowrap=''><%= sess.getId() %></td>
<td nowrap=''><%= معرف المستخدم %></td>
<td nowrap=''>
<%= BeaconDate.getInstance( new Java.util.Date(sess.getCreationTime())).getDateTimeString()%></td>
<td class="<%= stl %>3 " nowrap=''>
<%= BeaconDate.getInstance( new java.util.Date(sess.getLastAccessedTime())).getDateTimeString()%></td>
</tr>
<%
}
%>
</table>
</body>
يسترد الكود أعلاه activeSessions من التطبيق ويعرض الوقت المحدد. من المفترض أن تكون فئة BeaconDate فئة زمنية منسقة.
بهذه الطريقة، نحصل على إطار عمل لعرض قائمة المستخدمين عبر الإنترنت. أما بالنسبة لترحيل قائمة المستخدمين عبر الإنترنت والوظائف الأخرى، فهي لا علاقة لها بهذه المقالة ولن تتم مناقشتها.
هذا مثال على نموذج عدم التحديث الذي يعتمد على آلية مهلة الجلسة. أشار زميلي sonymusic إلى أن هذا قد لا يكون موثوقًا في كثير من الأحيان بسبب الأفكار المختلفة لكل مصنع. وبالنظر إلى هذا المطلب، من الضروري تحديد ما إذا كان الوقت منذ آخر استخدام من قبل المستخدم الحالي يتجاوز قيمة الوقت المحددة مسبقًا عند تحديث كل سطح ورقة. هذا هو في الأساس تنفيذ مهلة الجلسة بنفسك. إذا كنت بحاجة إلى تنفيذ نموذج التحديث، فيجب عليك استخدام هذه الطريقة للحكم على التحديث لكل سطح ورقة.