この記事では、主にJavaでのセッションリスニングの使用を紹介して、同じアカウントのログイン制限とログイン数を実現します。特定のコードは次のとおりです。
問題ドメイン:
1。同じアカウントでログインします:このアカウントが既にログインされている場合、再度ログインできません(QQモードとは反対)。
2。ログインした数が限られている場合、人の数が超えたり到達したりした場合、プロンプトは次のとおりです。システムはビジーです。後でもう一度やり直してください。
解決策:httpssionttributeListenerリスナーを使用します(HTTPSESSIONLISTENERを同時に使用しましたが、操作が難しいと感じています)
ナレッジリザーブ:HTTPSSESSIONATTRIBUTELISTENERには、AttributeAdD、AttributerEmove、およびAttributerePlaceの3つの方法があります。
セッションのsetAttribute and Removeattributeは、astributeaddおよびastributeremoveメソッドをトリガーします。同じセッションの同じ属性の繰り返し設定は、AttributerPlaceメソッドをトリガーします。
HTTPSESSIONLISTENERの操作が困難な理由:JSPページにアクセスする限り、セッションを作成します(たとえば、サーバー側でHTMLにアクセスするときにセッションを作成しません。 JSPは動的なページであり、本質的にサーブレットです。私のlogin.jspは明らかにJSPです。リスナーでセッションを無効にしてログインページに戻ると、すぐに別のセッションを作成しました。これは私が明確に感じないものであり、私は自分のスキルから家に帰っていません。
特定の実装:
リスナーコード
Public class onlineListenerは、httpsessionlistener、httpssessionattributeListener {private static list <sessionanduser> sessions; static int dels = -1;静的ブールフラグ= false; static {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(httpssessionevent hse){system.out.println( "------------- sessiondestroyed()----------"); system.out.println(hse.getSession() + "" + new Date(hse.getSession()。getLastaccessedTime())); System.out.println(hse.getSession() + "" + new date()); } public void aTtibeAdded(httpssessionbindingEvent e){system.out.println( "-------------*start addd*-------------------" + sessions.size()); httpsession session = e.getSession(); actionContext ctx = actioncontext.getContext(); boolean newone = true;文字列attrname = e.getName(); // if(attrname.equals(custrion.user_name)){// loginsの数を確認するif(sessions.size()> = constrance.user_limit){newone = false; ctx.put( "timeoutmsg"、 "serverbusy"); } string nowuser =(string)e.getValue(); //すべてのセッションをトラバースしてログインしたかどうかを確認します。もしそうなら、(int i = sessions.size() - 1; i> = 0; i-){sessionanduser tem = sessions.get(i); if(tem.getusername()。equals(nowuser)){newone = false; ctx.put( "timeoutmsg"、 "bedloged"); // tem.getSession()。invalidate(); // //同じアカウントでログインし、削除ブレークを自動的に呼び出します。 }} //新しいログインアカウントをアカウントメンテナンスリストに追加するif(newone){sessionanduser sau = new SessionAnduser(); sau.setusername(nowuser); sau.setsession(セッション); sau.setsid(session.getid()); sessions.add(sau); }}} public void astributeremoved(httpssessionbindingEvent e)Slows IllegalStateException {httpsession session = e.getSession(); system.out .println( "-------------*削除を開始*---------------------" + sessions.size()); if(dels> -1){if(flag){sessions.remove(dels); flag = false; }} else {//登录文字列attrname = e.getName(); if(attrname.equals(custring.user_name)){string nowuser =(string)e.getValue(); //(int i = sessions.size() - 1; i> = 0; i-){sessionanduser tem = sessions.get(i); if(tem.getusername()。equals(nowuser)){sessions.remove(i);壊す; }}}}} public void astributeReplaced(httpsessionBindingEvent e){httpsession session = e.getSession(); system.out .println( "------------*交換を開始*----------------------" + sessions.size());文字列attrname = e.getName(); del = -1; // if(attrname.equals(cuntion.user_name)){// user nowuser =(user)e.getvalue(); // old value string nowuser =(string)session.getattribute(constant.user_name); // sessions.get(i); if(tem.getusername()。equals(nowuser)&&!tem.getsid()。equals(session.getid())){system.out.println( "remove:remolidate 1!"); dels = i; flag = true; } else if(tem.getSid()。 }} if(dels!= -1){sessions.get(dels).getSession()。invalidate(); // removeメソッドは、故障したときに自動的に呼び出されます。また、セッションから削除されます}}}}コードの主なアイデアは、セッションとアカウント名を保存するために静的リスト<SessionAnduser>を定義することです。
リスナーを返す値を取得し、ログインアクションで処理するコード
session.setattribute(curntion.user_name、operator.getusername()); actionContext ctx = actioncontext.getContext(); if( "serverbusy" .equals(ctx.get( "timeoutmsg"))){ctx.put( "timeoutmsg"、 "サーバーはビジーです。もう一度やり直してください"); 「ジャンプ」を返します。 } if( "beenloged" .equals(ctx.get( "timeoutmsg"))){ctx.put( "timeoutmsg"、 "このアカウントは他の場所にログインしています"); 「ジャンプ」を返します。 }ページキャプチャプロンプト情報コード
<%@taglib prefix = "s" uri = " /struts-tags"%> <s:Property value = "#attr.timeoutmsg" />
読んでくれてありがとう、私はそれがあなたを助けることができることを願っています。このサイトへのご支援ありがとうございます!