تقدم هذه المقالة بشكل أساسي استخدام الاستماع للجلسة في Java لتحقيق قيود تسجيل الدخول وعدد تسجيلات تسجيل الدخول لنفس الحساب. الرمز المحدد كما يلي:
مجال المشكلة:
1. تسجيل الدخول بنفس الحساب: إذا تم تسجيل الدخول هذا الحساب بالفعل ، فلا يمكنك تسجيل الدخول مرة أخرى (عكس وضع QQ).
2. إذا كان عدد تسجيل الدخول المحدود محدودًا ، إذا تجاوز عدد الأشخاص أو تم الوصول إليه ، فإن المطالبة هي: النظام مشغول ، حاول مرة أخرى لاحقًا.
الحل: استخدم مستمع httpsessionattributelistener (على الرغم من أنني استخدمت httpsessionlistener في نفس الوقت ، من الصعب العمل)
احتياطي المعرفة: HTTPSESSINTATTRIPTILISTERER لديه ثلاث طرق: NETRIPTIDEDD ، NETREDEREMOVE ، و GRITIBLEPPAPLE.
سيؤدي setAttribute و RemoveAttribute للجلسة إلى يؤدي إلى طرق attributeadd و attributeRemove. ستؤدي الإعدادات المتكررة لنفس السمة للجلسة نفسها إلى تشغيل طريقة النسب.
السبب الذي يجعل تشغيل HTTPSessionListener من الصعب تشغيله: طالما كنت تصل إلى صفحة JSP ، ستقوم بإنشاء جلسة (لن تقوم بإنشاء جلسة عند الوصول إلى HTML. على جانب الخادم ، على سبيل المثال ، إذا اتصلت بـ httpservletrequest.getSession (صواب) في Servlet ، ستقوم بإنشائها). JSP هي صفحة ديناميكية ، وهي في الأساس servlet. من الواضح أن login.jsp هو JSP. عندما أقوم بإبطال جلسة في المستمع وأعود إلى صفحة تسجيل الدخول ، قمت على الفور بإنشاء جلسة أخرى. هذا شيء لا أشعر به عن ذلك ، ولم أعود إلى المنزل من مهاراتي.
تطبيق محدد:
رمز المستمع
الطبقة العامة onlinelistener تنفذ httpsessionlistener ، httpsessionattributelistener {قائمة ثابتة private <SessionAnduser> Sessions ؛ ثابت int dels = -1 ؛ العلم المنطقي الثابت = خطأ ؛ ثابت {if (sessions == null) {sessions = collections .synchronizedList (new ArrayList <SessionAnduser> ()) ؛ }} public void sessioncreated (httpsessionevent hse) {system.out.println (hse.getSession () + "-" + new date ()) ؛ System.out.println (hse.getSession () + "-" + New Date ()) ؛ } public void sessionDestroyed (httpsessionevent hse) {system.out.println ("------------- SessionDestroyed () -----------") ؛ System.out.println (hse.getSession () + "" + تاريخ جديد (hse.getSession (). getLastAccatedTime ())) ؛ System.out.println (hse.getSession () + "" + New Date ()) ؛ } public void attributeadded (httpsessionbindingevent e) {system.out.println ("-----------*ابدأ إضافة*-----------------------" + sessions.size ()) ؛ جلسة httpsession = E.GetSession () ؛ ActionContext CTX = ActionContext.getContext () ؛ Boolean NewOne = True ؛ String attrname = e.getName () ؛ // قم بتسجيل الدخول إذا (attrname.equals (constant.user_name)) {// تحقق من عدد عمليات تسجيل الدخول إذا (sessions.size ()> = constant.user_limit) {newOne = false ؛ ctx.put ("timeOutMsg" ، "serverbusy") ؛ } سلسلة nowuser = (string) e.getValue () ؛ . if (tem.getUserName (). يساوي (nowuser)) {newOne = false ؛ ctx.put ("timeoutmsg" ، "beedloged") ؛ // tem.getSession (). perilated () ؛ // // تسجيل الدخول بنفس الحساب واتصل تلقائيًا بإزالة الكسر ؛ }} // إضافة حساب تسجيل الدخول الجديد إلى قائمة صيانة الحساب if (newOne) {sessionanduser sau = new SessionAnduser () ؛ sau.setusername (nowuser) ؛ Sau.Setsession (جلسة) ؛ sau.setsid (session.getid ()) ؛ Sessions.Add (SAU) ؛ }}} public void attributeReMoved (httpsessionbindingevent e) remlyalstateException {httpsession session = e.getSession () ؛ System.out .println ("-------------*بدء إزالة*-------------------------" + Sessions.size ()) ؛ if (dels> -1) {if (flag) {sessions.remove (dels) ؛ العلم = خطأ ؛ }} آخر {// 登录 string attrname = e.getName () ؛ if (attrname.equals (constant.user_name)) {String nowuser = (string) e.getValue () ؛ // اجتياز جميع الجلسات لـ (int i = sessions.size ()-1 ؛ i> = 0 ؛ i--) {sessionanduser tem = sessions.get (i) ؛ if (tem.getUserName (). يساوي (nowuser)) {sessions.remove (i) ؛ استراحة؛ }}}}} public void attributeplaced (httpsessionbindingevent e) {httpsession session = E.GetSession () ؛ System.out .println ("-------------*ابدأ استبدال*-----------------------" + Sessions.size ()) ؛ String attrname = e.getName () ؛ dels = -1 ؛ // 登录 if (attrname.equals (constant.user_name)) {// user nowuser = (user) Sessions.get (i) ؛ if (tem.getUserName (). يساوي (nowuser) &&! dels = i ؛ العلم = صحيح ؛ } آخر if (tem.getsid (). equals (session.getId ())) {tem.setUserName (nowuser) ؛ }} if (dels! = -1) {sessions.get (dels) .getSession (). perilated () ؛ // يتم استدعاء طريقة إزالة تلقائيًا عند فشلها. سيتم أيضًا إزالته من الجلسات}}}} تتمثل الفكرة الرئيسية للرمز في تحديد قائمة ثابتة <SessionAnduser> لتخزين الجلسة واسم الحساب.
الرمز للحصول على قيمة إرجاع المستمع ومعالجته في الإجراء المسجل
Session.setAttribute (constant.user_name ، operator.getUserName ()) ؛ ActionContext CTX = ActionContext.getContext () ؛ if ("serverbusy" .equals (ctx.get ("timeoutmsg")))) {ctx.put ("timeoutmsg" ، "الخادم مشغول ، يرجى المحاولة مرة أخرى لاحقًا") ؛ العودة "القفز" ؛ } if ("beenloged" .equals (ctx.get ("timeoutmsg")))) العودة "القفز" ؛ } رمز معلومات التقاط الصفحة
<٪@taglib prefix = "s" uri = " /struts-tags" ٪> <s: property value = "#attr.timeOutMsg" />
شكرا لك على القراءة ، آمل أن تساعدك. شكرا لك على دعمك لهذا الموقع!