現在のWebプロジェクトでは、多くの状況では、今回は同じアカウント情報をさまざまなログインポータルでログインできるため、それほど美しくないということです。
読書をお勧めします:
Javaマルチユーザーログイン制限の実装
現在、2つの解決策があります。
1.フラグ内のフィールドでユーザーのログイン情報を保存します。ログインが成功するたびに1つにマークされ、ログインは0にマークされます。マーク1の場合、ログインは許可されません。
2。アプリケーションの組み込み範囲にユーザーのログイン情報を保存し、セッションリスナーを使用して、各ログインユーザーのログインステータスを監視します。
明らかに、最初の方法では、ログインするたびにデータベースを操作する必要があります。これにより、不要なパフォーマンスのオーバーヘッドが追加されます。さらに、ログイン状態中にコンピューターが突然シャットダウンした場合、ログインすることはできず、使いやすさは比較的低くなります。
ただし、2番目の方法は異なり、すべてのオンラインユーザーの情報を維持するために非常に操作可能で便利です。
次に、主に2番目の方法の特定の実装を紹介します。
1.ログインの処理のログイン方法では、最初にデータベースをクエリして、ユーザーが存在するかどうかを確認します。ある場合は、ログインアカウントがロックされているかどうかを判断します。次に、アプリケーション内蔵スコープオブジェクトからすべてのログイン情報を取り出して、ユーザー名アカウントがログインしているかどうかを確認します。ログインしている場合は、フレンドリーなプロンプトになります。それ以外の場合、キー価値ペアの形でログインしてアプリケーションのログイン情報を保存できることを意味します。
コードは次のとおりです。
//ゼロ構成の前に各アクセスメソッドにアクションを追加する必要があります。 if(result!= null){if(result.getFustatus()!= null && result.getFustatus()== 0){super.setRequestattr(constry.message、 "申し訳ありませんが、このユーザーはロックされています!"); 「エラー」を返します。 } map <string、string> loginusermap =(map <string、string>)super.getApplicationAttr(custring.login_user_map); boolean isexist = false;文字列sessionId = super.getSessionId(false); if(loginusermap == null){loginusermap = new hashmap <string、string>(); } for(string username:loginusermap.keyset()){//ログインしたユーザーの情報が保存されているか、同じユーザーが繰り返しログインしたかどうかを判断します。 } isexist = true;壊す; } if(isexist){super.setRequestattr(constant.message、 "申し訳ありませんが、ユーザーはログインします!"); 「エラー」を返します。 } else {loginusermap.put(result.getFuusername()、sessionId); } // super.setsessionattr(constant.login_user、result); super.setApplicationAttr(custrent.login_user_map、loginusermap); logger.info(result.getFuusername() + "ログインに正常に!"); // fromurlがセッションに値を持っている場合、ページstring fromurl =(string)super.getSessionattr(constant.from_url); if(fromurl!= null){super.setsessionattr(constant.from_url、null); super.getResponse()。sendredirect(fromurl.tostring()); nullを返します。 } "index"を返します。 }} catch(例外e){e.printstacktrace(); logger.info( "login failed:"+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をインポートします。 public class sessionListenerはhttpsessionlistener {private logger logger = logger.getLogger(this.getClass()); @Override public void sessioncreated(httpssessionevent event){} @override public void sessiondestroyed(httpssessionevent event){//セッションが破壊されたときにloginusermapで保存されたキー値のペアをクリアしますuser user =(user)event.getSession()。 if(user!= null){map <string、string> loginusermap =(map <string、string>)event.getSession()。getServletContext()。 loginusermap.remove(user.getFuusername()); event.getSession()。getServletContext()。setAttribute( "loginusermap"、loginusermap); }}}web.xmlの構成は次のとおりです。
<! - セッションリスナー - > <リスナー> <リスナークラス> com.facelook.util.sessionlistener </ristener-class> </ristener>
3。さらに、別の問題があります。ログインしたユーザーがログアウトボタンをクリックせずに突然ブラウザまたはページを閉じます。その後、ブラウザがリフレッシュまたはクローズするときに、以前のアンロードイベントを使用して発射できます。
// events $(window).bind( 'before unload'、function(){$ .ajax({url: "$ {ctx} /system/user/user!logout.action"、type: "post"、cusces:function(){alert( "you ou you ou was out out");}};);ただし、コンピューターが突然シャットダウンしたり、自動再起動などの客観的な理由がある場合、これらは回避できないため、サーバー側のセッションセッションがリセットされるのを待つことしかできません。
すべてのオンライン担当者をカウントするモジュールでない限り、管理者はオンライン担当者のログインとログアウトのステータスを管理し、問題を抱えているユーザーにログインしたユーザーを直接破壊します。
次に、オンライン人事モジュールの管理を簡単に紹介しましょう。
1.まず、すべての返信状況をすべて監視するにはセッションリスナーが必要です。この時点で、セッションが作成されるたびに、カウント+1をカウントでき、カウント1が破壊されます。さらに、Webアプリケーションのライフサイクルを監視し、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をインポートします。 Public Class SessionListenerは、httpsessionListener、servletcontextListener {private int count; private servletcontext servletcontext = null; public SessionListener(){count = 0; } private logger logger = logger.getLogger(this.getClass()); @Override public void sessioned(httpsessionevent event){count ++; setContext(event); logger.info( "************ HTTPセッションが作成されます... ******************"); } @Override public void sessiondestroyed(httpssessionevent event){//セッションが破壊されたときにloginusermapで保存されたキー値のペアをクリアします。ユーザー=(user)event.getsession()。getattribute( "loginuser"); if(user!= null){map <string、string> loginusermap =(map <string、string>)event.getSession()。getServletContext()。 loginusermap.remove(user.getFuusername()); event.getSession()。getServletContext()。setAttribute( "loginusermap"、loginusermap); } count--; setContext(event); logger.info( "************ httpセッションが破壊されます... *******************"); } public void setContext(httpsessionevent httpsessionevent){httpsessionevent.getSession()。getServletContext()。 } @Override public void contextdestroyed(servletContextEvent servletContextevent){this.servletcontext = null; logger.info( "************サーブレットのコンテキストが破壊されます... *******************"); } @Override public void contextInitialized(servletcontextevent servletcontextevent){this.servletcontext = servletcontextevent.getServletContext(); logger.info( "************サーブレットコンテキストが初期化されています... ******************"); }}2。ユーザーアクションでオンラインユーザーを管理するモジュールを作成し、強制出口機能をサポートします。
/ ** * logout * @return * @throws servletexception * @throws ioexception */ public string logout()throws servletexception {try {map <string、string> loginusermap =(map <string、string>)super.getapplicationattr(constant.login_user_map);ユーザーユーザー=(user)super.getSessionattr(curntion.login_user); super.removeattribute(curntion.login_user_map); loginusermap.remove(user.getFuusername()); super.setApplicationAttr(custrent.login_user_map、loginusermap); logger.info( "ログインログイン成功!"); } catch(Exception e){e.printstacktrace(); logger.error( "login failed:"+e.getmessage()); } return input; } / ***オンラインユーザー管理* @return* / public string loginmanager(){return success; } / ***他のユーザーからのフォースエグジmap <string、string> loginusermap =(map <string、string>)super.getApplicationAttr(custrance.login_user_map); if(username!= null && loginusermap.containskey(username)){loginusermap.remove(username); super.setApplicationAttr(custrent.login_user_map、loginusermap); }} catch(例外e){e.printstacktrace(); logger.info( "強制終了が失敗しました:"+e.getMessage()); } nullを返します。 }3.管理ページにオンラインユーザーのリストをロードします。
対応するメソッドが定義されたら、次のように、対応する管理ページにオンラインリストを追加します。
<%@page Import = "Java.util.map"%> <%@page Import = "java.util.map.entry"%> <%@pageencoding = "utf-8"%> <%@include file = "/common/taglib.jsp" "%> < Transitional // en "" http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd "> <html xmlns =" http://ww.w3.org/1999/xhtml " content = "text/html; charset = utf-8"/> <title> facelookへようこそ</title> <%@ inctor file = "/common/resource.jsp"%> <script type = "text/javascript"> <! - // events $(windo).bind( 'beforeunload'、function(){" url: "$ {ctx} /system/user/user!logout.action"、 "post"、cuscess(){alert( "you was out out"); function logout(username){if(username == "$ {sessionscope.loginuser.fuusername}"){alert( "your account of Yourアカウント!");戻る; } $ .ajax({url: "$ {ctx}/system/user/user!logoutother.action? username ="+username、type: "post"、success:function(){$( "#tr"+username).hide(); var count = parseint($ ")。 $( "#count")。html(count-1); } // - > </script> </head> <body> <%@ include file = "/common/header.jsp"%> <div id = "main"> <%@ include file = "/common/lefter.jsp"%> <div> <div> <h2> login list </h2> <%map <<string> map =(map <string>)application out.println( "現在、<font id = 'count'>"+map.size()+"</font>オンライン!!"があります!! "); %> <table> <%for(entry <string、string> m:map.entryset()){%> <tr id = "tr <%= m.getkey()%>"> <%= m.getkey()%> </td> <td> <%}%> </table> </div> </div> </div> <%@ include file = "/common/footer.jsp"%> <%@ inctor file = "/common/message.jsp"%> </body> </html>OK、展開プロジェクトを開始してから、サービスを開始し、オンラインユーザー管理モジュールを入力します。単純な効果は次のとおりです。
現在のログインユーザーは、ログイン情報からログアウトを強制することを許可されていないことに注意してください。
このようにして、複数のユーザーがログインするのを防ぐ場合、基本的に実現できます!
上記は、複数のユーザーが繰り返しログインするのを防ぐためのJava Web開発に最適なソリューションです。私はそれが誰にでも役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は、すべての人に時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!