في مشروع الويب الحالي ، توجد العديد من المواقف أنه يمكن تسجيل دخول معلومات الحساب نفسها في بوابات تسجيل الدخول المختلفة هذه المرة ، لذلك لن تكون جميلة جدًا.
القراءة الموصى بها:
تنفيذ قيود تسجيل الدخول متعددة المستخدمين Java
يوجد الآن حلان:
1. احفظ معلومات تسجيل الدخول الخاصة بالمستخدم مع حقل في العلم. في كل مرة ينجح فيها تسجيل الدخول ، يتم تمييزه 1 ، ويتم وضع علامة على تسجيل الدخول 0. عندما يتم تمييزه 1 ، لا يُسمح بتسجيل الدخول.
2. احفظ معلومات تسجيل الدخول الخاصة بالمستخدم في النطاق المدمج للتطبيق ، ثم استخدم مستمع الجلسة لمراقبة حالة تسجيل الدخول لكل مستخدم تم تسجيله.
من الواضح أن الطريقة الأولى تتطلب تشغيل قاعدة البيانات في كل مرة تقوم فيها بتسجيل الدخول ، مما يضيف بعض الأداء غير الضروري. علاوة على ذلك ، إذا أغلقت الكمبيوتر فجأة أثناء حالة تسجيل الدخول ، فلن تتمكن أبدًا من تسجيل الدخول ، وقابلية الاستخدام منخفضة نسبيًا.
لكن الطريقة الثانية مختلفة ، فهي قابلة للتشغيل بشكل كبير ومريح للحفاظ على المعلومات الخاصة بجميع المستخدمين عبر الإنترنت.
بعد ذلك ، سنقدم بشكل أساسي التنفيذ المحدد للطريقة الثانية:
1. في طريقة تسجيل الدخول لمعالجة تسجيل الدخول ، قم أولاً بالاستعلام عن قاعدة البيانات للتحقق مما إذا كان المستخدم موجودًا. إذا كان هناك ، حدد ما إذا كان حساب تسجيل الدخول قد تم قفله. ثم قم بإخراج جميع معلومات تسجيل الدخول من كائن النطاق المدمج للتطبيق للتحقق مما إذا كان قد تم تسجيل حساب اسم المستخدم. إذا تم تسجيل الدخول ، فسيكون ذلك بمثابة موجه ودود. خلاف ذلك ، فهذا يعني أنه يمكنك تسجيل الدخول وحفظ معلومات تسجيل الدخول في التطبيق في شكل زوج من القيمة الرئيسية.
الرمز كما يلي:
// يجب إضافة الإجراء إلى كل طريقة وصول قبل التكوين الصفري ، وإلا 404 @batter = "login" ، النتائج = {result (name = "index" ، location = "index.jsp") ،}) login public remitive () {try {user user = userservice.login (user.getfuername () ، user.get.getword () ؛ if (result! = null) {if (result.getFustatus ()! = null && result.getFustatus () == 0) {super.setRequestattr (ثابت. إرجاع "خطأ" ؛ } خريطة <string ، string> loginusermap = (map <string ، string>) super.getAppLicationAttr (constant.login_user_map) ؛ isexist منطقية = خطأ ؛ سلسلة SessionId = super.getSessionId (false) ؛ if (loginusermap == null) {loginusermap = new hashMap <string ، string> () ؛ } لـ (username string: loginusermap.keyset ()) {// judge ما إذا كانت معلومات المستخدم المسجلة قد تم حفظها أو إذا قام المستخدم نفسه بتسجيل الدخول مرارًا وتكرارًا ، فسيتم السماح بتسجيل الدخول إذا (username.equals (result.getfuusername)) } isexist = true ؛ استراحة؛ } if (isexist) {super.setRequestattr (ثابت. إرجاع "خطأ" ؛ } آخر {loginusermap.put (result.getFuuserName () ، SessionId) ؛ } // login بنجاح super.setsessionattr (ثابت. login_user ، النتيجة) ؛ super.setAppLicationAttr (constant.login_user_map ، loginusermap) ؛ logger.info (result.getFuuserName () + "تسجيل الدخول بنجاح!") ؛ // إذا كان لدى Fromurl قيمة في الجلسة ، فانتقل إلى سلسلة الصفحة Fromurl = (String) Super.getSessionAttr (ثابت. من from_url) ؛ if (fromurl! = null) {super.setsessionAttr (ثابت. from_url ، null) ؛ super.getResponse (). sendRedirect (fromurl.toString ()) ؛ العودة لاغية. } إرجاع "الفهرس" ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ logger.info ("فشل تسجيل الدخول:"+e.getMessage ()) ؛ } super.setRequestattr ("Message" ، "Error") ؛ إرجاع "خطأ" ؛ }2. بعد معالجة بوابة تسجيل الدخول ، بالنظر إلى أن الجلسة تنتهي ، يجب على مستخدم تسجيل الدخول المقابل أيضًا تسجيل الخروج من تسجيل الدخول وفقًا لذلك. يمكننا كتابة مستمع جلسة. عندما يتم تدمير الجلسة ، قمنا بتسجيل الخروج من المستخدم المسجل ، أي إزالته من التطبيق. وهذا يعني أن المستخدم كان في وضع عدم الاتصال.
الرمز كما يلي:
حزمة com.facelook.util ؛ استيراد java.util.map ؛ استيراد javax.servlet.http.httpsessionevent ؛ استيراد javax.servlet.http.httpsessionlistener ؛ استيراد org.apache.log4j.logger ؛ استيراد com.facelook.entity.user ؛ SessionListener Public Class Prements HttpsessionListener {private logger logger = logger.getLogger (this.getClass ()) ؛ Override public void sessioncreated (حدث httpsessionevent) {} Override public void sessiondestroyed (حدث httpsessionevent) {// مسح أزواج القيمة الرئيسية المحفوظة في loginusermap عندما يتم تدمير المستخدم user = (المستخدم) event.getSession (). if (user! = null) {map <string ، string> loginusermap = (map <string ، string>) event.getSession (). getServletContext (). getAttribute ("loginusermap") ؛ logInuserMap.Remove (user.getFuuserName ()) ؛ event.getSession (). getServletContext (). }}}التكوين في web.xml كما يلي:
<!-مستمع الجلسة-> <StaNerer> <stanker-class> com.facelook.util.sessionListener </leader-class> </stanter>
3. بالإضافة إلى ذلك ، هناك مشكلة أخرى. إذا كان المستخدم المسجل في إغلاق المتصفح أو الصفحة فجأة دون النقر فوق زر تسجيل الدخول. بعد ذلك ، يمكنك استخدام الحدث المسبق لإطلاق النار عند تحديث المتصفح أو يغلق.
// events $ (window) .bind ('Quartunload' ، function () {$ .ajax ({url: "$ {ctx} /system/user/user !logout.action" ، النوع: "post" ، النجاح: function () {تنبيه ("لقد قمت بتسجيل الخروج") ؛}}}) ؛) ؛) ؛) ؛) ؛ومع ذلك ، إذا كان بعض الأسباب الموضوعية ، مثل الكمبيوتر قد تم إيقاف تشغيله فجأة ، وإعادة التشغيل التلقائي ، وما إلى ذلك ، فلا يمكن تجنبها ، بحيث يمكنك فقط انتظار جلسة جلسة من جانب الخادم لإعادة تعيينها قبل تسجيل الدخول مرة أخرى.
ما لم تكن الوحدة النمطية التي تحسب جميع الموظفين عبر الإنترنت ، يدير المسؤول حالة تسجيل الدخول والموظفين على الإنترنت ، ويدمر مباشرة أولئك الذين تم تسجيلهم في المشكلات.
بعد ذلك ، دعونا نقدم بإيجاز إدارة وحدات الموظفين عبر الإنترنت:
1. أولاً ، هناك حاجة إلى مستمع جلسة لمراقبة جميع المواقف. في هذا الوقت ، في كل مرة يتم فيها إنشاء جلسة ، يمكن حساب Count+1 ، ثم يتم تدمير Count-1. بالإضافة إلى ذلك ، هناك حاجة إلى مستمع ServletContext لمراقبة دورة حياة تطبيق الويب ، والحصول على كائن ServletContext ، ثم حساب إجمالي عدد الموظفين عبر الإنترنت وتخزينه ؛
الرمز المحدد كما يلي:
حزمة com.facelook.util ؛ استيراد java.util.map ؛ استيراد javax.servlet.servletContext ؛ استيراد javax.servlet.servletcontextevent ؛ استيراد javax.servlet.servletContextListener ؛ استيراد javax.servlet.http.httpsessionevent ؛ استيراد javax.servlet.http.httpsessionlistener ؛ استيراد javax.servlet.http.httpsessionlistener ؛ استيراد org.apache.log4j.logger ؛ استيراد com.facelook.entity.user ؛ SessionListener Public Class Parerements HttpsessionListener ، servletContextListener {private int count ؛ servletContext private ServletContext = null ؛ SessionListener () {count = 0 ؛ } logger logger = logger.getLogger (this.getClass ()) ؛ Override public void sessioncreated (حدث httpsessionevent) {count ++ ؛ setContext (حدث) ؛ logger.info ("************ تم إنشاء جلسة http ... ********************") ؛ } Override public void sessiondestroyed (حدث httpsessionevent) {// قم بمسح أزواج القيمة الرئيسية المحفوظة في loginusermap عندما يتم تدمير المستخدم المستخدم = (المستخدم) event.getSession (). getAttribute ("loginuser") ؛ if (user! = null) {map <string ، string> loginusermap = (map <string ، string>) event.getSession (). getServletContext (). getAttribute ("loginusermap") ؛ logInuserMap.Remove (user.getFuuserName ()) ؛ event.getSession (). getServletContext (). } عدد--؛ setContext (حدث) ؛ logger.info ("************ تم تدمير جلسة http ... *********************") ؛ } public void setContext (httpsessionevent httpsessionevent) {httpsessionevent.getsession (). } Override public void contextDestroyed (servletContexteventventventventventsextevent) {this.servletcontext = null ؛ logger.info ("************** تم تدمير سياق servlet ... *********************") ؛ } Override public void contextInitialized (servletContextevent ServletContexTevent) {this.servletContext = servletContextevent.getServletContext () ؛ logger.info ("************** تم تهيئة سياق servlet ... ******************") ؛ }}2. إنشاء وحدة نمطية لإدارة المستخدمين عبر الإنترنت في عامل المستخدم ودعم وظيفة الخروج القسري ؛
/ ** * logout * return * throws servleTexception * throws ioException */ public string logout () يلقي servletexception ، ioException {try {map <string ، string> loginusermap = (map <string ، string>) super.getapplicationattr (constant.login_user_map) ؛ مستخدم المستخدم = (user) super.getSessionAttr (constant.login_user) ؛ Super.RemoVeatTribute (constant.login_user_map) ؛ logInuserMap.Remove (user.getFuuserName ()) ؛ super.setAppLicationAttr (constant.login_user_map ، loginusermap) ؛ logger.info ("تسجيل الدخول الناجح!") ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ logger.error ("فشل تسجيل الدخول:"+E.GetMessage ()) ؛ } إدخال إدخال ؛ } / *** إدارة المستخدم عبر الإنترنت* @RETURN* / public string loginManager () {return success ؛ } / *** EXIT من المستخدمين الآخرين* @RETURN* / public string logOutother () {try {String username = servleTActionContext.getRequest (). getParameter ("username") ؛ خريطة <string ، string> logInUserMap = (Map <String ، String>) super.getAppLicationAttr (constant.login_user_map) ؛ if (username! = null && loginusermap.containskey (اسم المستخدم)) {loginusermap.remove (اسم المستخدم) ؛ super.setAppLicationAttr (constant.login_user_map ، loginusermap) ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ logger.info ("فشل الخروج بالقوة:"+e.getMessage ()) ؛ } إرجاع فارغ ؛ }3. تحميل قائمة المستخدمين عبر الإنترنت على صفحة الإدارة ؛
بعد تحديد الطريقة المقابلة ، ثم أضف قائمة عبر الإنترنت إلى صفحة الإدارة المقابلة ، على النحو التالي:
<٪@page import = "java.util.map" ٪> <٪@page import = "java.util.map.Entry" ٪> <٪@page language = "java pageencoding =" utf-8 "٪> <٪@file ="/common/taglib.jsp "٪> <! Transitional // en "" http://www.w3.org/tr/xhtml1/dtd/xhtml1-ransitional.dtd "> <html xmlns =" http://www.w3.org/199/xhtml content = "text/html ؛ charset = utf-8"/> <title> مرحبًا بك في الوجه </title> <٪@ include file = "/common/resource.jsp" ٪> <script type = "text/javaScript"> <!-// events $ (window) .bind ('Quarload' ، function () {$. url: "$ {ctx}/semstem/user/user! دالة تسجيل الدخول (اسم المستخدم) {if (username == "$ {sessionscope.loginuser.fuuserName}") {Alert ("logout of lect your your!) ؛ يعود؛ } $ .ajax ({url: "$ {ctx} /system/user/user !logOutOther.Action؟username ="+اسم المستخدم ، النوع: "post" ، النجاح: function () {$ ("#tr"+username). $ ("#count"). html (count-1) ؛ } //-> </script> </head> <body> <٪@ تضمين file = "/common/header.jsp" ٪> <div id = "main"> <٪@ include file = "/common/lefter.jsp" ٪> <viv> <viv> <h2> قائمة تسجيل الدخول </h2> <٪ map ، string> map = map <string>) Out.println ("يوجد حاليًا <font id = 'count'>"+map.size ()+"</font> المستخدمين عبر الإنترنت !!") ؛ ٪> <table> <٪ لـ (الإدخال <string ، string> m: map.entryset ()) {٪> <tr id = "tr <٪ = m.getKey () ٪>"> <td> <٪ = m.getKey () ٪> </td> <td> <sd> <a href = "javaScript: '<٪ = m. <٪} ٪> </table> </viv> </viv> </viv> <٪@ تضمين file = "/common/footer.jsp" ٪> <٪@ include file = "/common/message.jsp" ٪> </body> </html>حسنًا ، ابدأ مشروع النشر ، ثم ابدأ الخدمة ، وأدخل وحدة إدارة المستخدم عبر الإنترنت. التأثير البسيط هو على النحو التالي:
تجدر الإشارة إلى أنه لا يُسمح لمستخدم تسجيل الدخول الحالي بإجبار تسجيل معلومات تسجيل الدخول الخاصة به.
وبهذه الطريقة ، يمكن تحقيق حالات منع العديد من المستخدمين من تسجيل الدخول!
ما سبق هو الحل الأمثل لتطوير الويب Java لمنع العديد من المستخدمين من تسجيل الدخول مرارًا وتكرارًا. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!