لقد كنت خاملاً مؤخرًا وليس لدي مشاريع للقيام بها ، لذلك قمت بفرز بعض المشكلات الشائعة التي واجهتها في عملي اليومي. بادئ ذي بدء ، فكرت في مشكلة قيود تسجيل الدخول متعددة المستخدمين. اسمحوا لي أن أعطي بعض الأفكار حول هذه القضية.
القراءات ذات الصلة:
Java Web Development الحل الأمثل لمنع العديد من المستخدمين من تسجيل الدخول المتكرر
1. مشهد التصميم
1) لا يُسمح للمستخدم بتسجيل الدخول إلى أماكن متعددة في نفس الوقت
2) قام المستخدم بتسجيل الدخول في A. يُسمح الآن بتسجيل الدخول من B ، ولكنه سيضغط على A (بالنظر إلى أن المستخدم كان B بسبب بعض الظروف بعد تسجيل الدخول في A ، لكنه لا يزال يريد مواصلة العمل السابق ، لذلك يحتاج إلى تسجيل الدخول إلى النظام)
3) بعد الضغط على A Out من B ، سيعطي النظام موجهًا عندما يقوم A بعمليات أخرى. يقوم المستخدم بتسجيل الدخول في مكان آخر. إذا تم تسريب كلمة المرور إذا لم تكن لعملياته الخاصة ، فيرجى تغيير كلمة المرور.
2. خريطة الفكرة
عندما يقوم كل مستخدم بتسجيل الدخول ، عادةً ما نقوم بتخزين معلومات المستخدم في الجلسة حتى يتمكن النظام من الحصول على المعلومات الأساسية للمستخدم بسهولة عندما يقوم المستخدم بإجراء العمليات. ومع ذلك ، فإن هذه الجلسة خاصة ومرئية فقط للمستخدم الحالي (إذا وافقت على أن المستخدم سيحصل على جلسات مختلفة ، وهو السبب الجذري لسبب قيام العديد من المستخدمين بتسجيل الدخول). ثم يأتي السؤال ، كيف يمكن للمستخدم معرفة ما إذا كان على الإنترنت عند تسجيل الدخول؟ أعتقد أنك ذكي ، لقد فكرت بالفعل أن هذا ليس بالأمر السهل. أليس مشكلة تخزين معلومات المستخدم عبر الإنترنت في مكان عام؟ بعد التحقق عبر الإنترنت ، يكون الحل مختلفًا تمامًا ، وهو النوع التاليان تقريبًا.
1) تحديد المستخدمين عبر الإنترنت في قاعدة البيانات
2) المتجر في التطبيق
بعد العديد من الاعتبارات ، سنجد أن الحل 1 يحتاج إلى حل العديد من المشكلات الصعبة (يؤثر مخرج المستخدم غير الطبيعي وحالة التعديل المستقبلي ، والوصول المتكرر إلى قاعدة البيانات على الأداء ، وما إلى ذلك) ، وهو أمر غير مناسب لك الذين يحتاجون إلى الكمال. لذلك اعتمدنا الحل 2 ، وحفظ معلومات المستخدم عبر الإنترنت في التطبيق ، والتصميم المحدد كما يلي.
1) مخطط تدفق تسجيل الدخول
2) مخطط تدفق العملية بعد الضغط عليه
3. الكود
1) طريقة تسجيل الدخول
requestmapping (value = "/login" ، method = requestMethod.post) تسجيل الدخول إلى السلسلة العامة (اسم المستخدم السلسلة ، كلمة مرور السلسلة ، redirectattributes redirectattributes ، httpservletrequest طلب) كلمة المرور هي النتيجة الصحيح للسلسلة = userService.login (اسم المستخدم ، كلمة المرور) ؛ if (result.equals ("success")) {request.getSession (). tokensystem.out.println (jwttoken) ؛ userauthenticationToken authToken = TokenService.RetRieveUserauthToken (jwttoken) ؛ // token parses system.out.println (authtoken.isauthentic ()) userauthenticationToken.getCurrentToken (). if (url! = null) {request.getSession ().2) تسجيل الدخول لتحديد ما إذا كانت بالفعل على الإنترنت
@service @expressionalpublic class limitedelogin {private static logger log = logger.getLogger (SessionListener.class) ؛ خريطة ثابتة خاصة <string ، string> loginusermap = new hashmap <> () LoginLimite (طلب httpservletrequest ، اسم المستخدم السلسلة) {user user = userservice.findbyusername (اسم المستخدم) ! loginusermap.containsvalue (SessionId)) {log.info ("user:" + user.getUserName () + "، in" + dateutil.dateformat (new date () ، "yyyy-mm-dd hh: mm: ss") + ) loginusermap) ؛ request.getSession (). getServletContext (). setAttribute ("loginouttime" ، loginouttime) ؛ إرجاع "النجاح" ؛}}3) اعتراض تسجيل الدخول (لا يوجد تسجيل دخول للقفز إلى صفحة تسجيل الدخول)
يمتد مفهوم تسجيل الدخول إلى الطبقة العامة مع HandlerInterceptorAdAdapter {Overridepublic Boolean prehandle (httpservletrequest ، استجابة httpservletresponse ، معالج الكائن) يلقي استثناء {httpsession session = requestsession () ؛ مستخدم المستخدم = (المستخدم) session.getAtrentibut NULL) {reponse.sendRedRict (request.getContextPath () + "/other/tologin") ؛ return false ؛} // حكم تسجيل تسجيل الدخول متعدد المستخدمين ، وإعطاء رسالة سريعة islogin = false ؛ if (user! = null) {map <string ، string> loginusermap = (map <string ، string>) session.getServletContext (). getAttribute ("loginusermap") ؛ سلسلة sessionId = session.getId () ؛ for (مفتاح السلسلة: loginusermap.keyset ()) {// المستخدم قام بتسجيل الدخول إلى مكان آخر if (key.equals (user.getusername ()) &&! true ؛ break ؛}}} if (Islogin) {map <string ، string> loginouttime = (map <string ، string>) session.getServletContext (). getAttribute ("loginouttime") ؛ session.setTruct في مكان آخر! POSTHANDLE (طلب httpservletrequest ، httpservletresponse ، معالج الكائنات ، modelandview modelandview) يلقي الاستثناء {super.posthandle (طلب ، استجابة ، معالج ، modelandview) {super.aftercompletion (طلب ، استجابة ، معالج ، ex) ؛}}4) عندما يتم تدمير الجلسة ، قم بمسح أزواج القيمة الرئيسية المحفوظة في loginusermap
public classessessionListener تنفذ httpsessionListener {private static logger log = logger.getLogger (SessionListener.Class) ؛@Overridepublic void sessioncreated (حدث httpsessionevent) session.getID () ؛ // عند تدمير الجلسة ، قم بمسح زوج القيمة المفتاح المحفوظ في loginusermap user = (user) session.getAttribut event.getSession (). getServletContext (). getAttribute ("loginusermap") ؛ if (loginusermap.get (user.getUserName ()). متساوٍ (SessionId)) {log.info ("مستخدم نظيف من التطبيق:" + " user.getusername ()) ؛ loginusermap.remove (user.getusername ()) ؛ event.getSession (). getServletContext ().5) web.xml
<!-قيود تسجيل الدخول متعددة المستخدمين المستمعين ، قم بتسجيل الخروج لمسح معلومات الجلسة أثناء مسح معلومات تسجيل الدخول إلى المستخدم المخزنة في التطبيق-> <stanker> <stanker-class> com.service.limitelogin.sessionListener </nistener-class> </stanter>
6) رمز الصفحة (المستخدمة لمسح معلومات جلسة المستخدم المقطوع أثناء إعطاء موجه ، وإلا سيتم عرض معلومات المطالبة طوال الوقت)
<script type = "text/javaScript"> $ (document) .Ready (function () {var message = '$ {mess}' ؛ if (message! = ") {}}) ؛ $ ('#mess'). html (message) ؛}}) ؛ </script>7) امسح رمز جلسة المستخدم
/*** قيود تسجيل الدخول متعددة المستخدمين ، مسح معلومات الجلسة (معلومات تسجيل الدخول ، معلومات موجه) ** request request* @RESTURN*/ @reponseBody @requestMapping (value = "/clearusersession) request.getSession () ؛ // httpsession.invalidate () ؛ httpsession.removeattribute ("now_user") ؛ httpsession.removeattribute ("mess") ؛ إعادة "النجاح" ؛}تم الانتهاء من أعمال التطوير هنا
4. نتائج التشغيل
ما سبق هو طريقة تنفيذ قيود تسجيلات تسجيل الدخول متعددة المستخدمين Java المقدمة لك من قبل المحرر. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!