私は最近アイドル状態になっていて、やるべきプロジェクトがないので、日々の仕事で遭遇したいくつかの一般的な問題を整理しました。まず、マルチユーザーログイン制限の問題について考えました。この問題について考えさせてください。
関連する読み物:
Java Web開発複数のユーザーが繰り返されることを防ぐための完璧なソリューション
1。デザインシーン
1)ユーザーは複数の場所で同時にログインすることは許可されていません
2)ユーザーはAでログインしています。現在はBからログインすることが許可されていますが、Aを絞り出すことができます(Aでログインした後の状況のためにユーザーがBに行ったことがあるが、それでも以前の作業を継続したいので、システムにログインする必要がある)
3)AをBから絞った後、システムは他の操作を行うとプロンプトが表示されます。ユーザーは他の場所にログインします。パスワードが自分の操作でない場合に漏れている場合は、パスワードを変更してください。
2。アイデアマップ
各ユーザーがログインすると、通常、ユーザー情報をセッションに保存して、ユーザーが操作を実行するときにシステムがユーザーの基本情報を簡単に取得できるようにします。ただし、このセッションはプライベートであり、現在のユーザーにのみ表示されます(ユーザーが異なるセッションを取得することに同意した場合、複数のユーザーがログインできる理由の根本的な原因です)。その後、ログイン時にユーザーがオンラインであるかどうかをユーザーがどのように知ることができますか?私はあなたが賢いと信じています、あなたはすでにこれは簡単ではないと思っていました。オンラインユーザー情報を公共の場に保存する問題はありませんか?オンラインで確認した後、ソリューションは完全に異なり、ほぼ次の2つのタイプです。
1)データベース内のオンラインユーザーを特定します
2)アプリケーションを保存します
多くの考慮事項の後、ソリューション1は多くの困難な問題を解決する必要があることがわかります(ユーザーの異常な出口と将来の変更ステータス、データベースへの頻繁なアクセスはパフォーマンスに影響を与えます)。そのため、ソリューション2を採用し、オンラインユーザー情報をアプリケーションに保存すると、特定の設計が次のとおりです。
1)ログインフローチャート
2)絞り出された後の操作フローチャート
3。コード
1)ログイン方法
@RequestMapping(value = "/login"、method = requestmethod.post)public string login(string username、string password、redirectattributes redirectattributes、httpservletrequest request){//ユーザーがオンラインで処理されているかどうかを判断します(オンラインで削除する)文字列= limitlogin.login.login.login.login.limin.パスワードは正しい文字列result = userservice.login(username、password); if(result.equals( "success")){request.getSession()。setAttribute( "now_user"、userservice.findbyUsername(username)); // token = tokenservice.createuserauthtoken(userservice.findbyuserame(username)); tokensystem.out.println(jwttoken); usuthenticationtoken authtoken = tokenservice.retrieveuserauthtoken(jwttoken); // token parses system.out.println(authtoken.isauthenticated()); system.out.out.out.out.out. useruthenticationToken.getCurrentToken()。getUserUuid()); //ユーザーは切断され、ログインした後に保存されたリンクにリダイレクトします。 if(url!= null){request.getsession()。removeattribute( "redirect_link"); return "redirect:" + url.toString();} return "index";} redirectattributes.addflashattribute( "message"、result); return "redirect:/tologin";}2)ログインして、すでにオンラインであるかどうかを判断します
@service @transactionalpublic class limiteLogin {private static logger log = logger.getLogger(sessionlistener.class); private static map <string、string> loginusermap = new hashmap <>(); // private static map <string、string> loginouttime = new hashmap <> string loginlimite(httpservletrequest request、string username){user user = userservice.findbyusername(username); string sessionid = request.getSession()。 !loginusermap.containsvalue(sessionid)){log.info( "user:" + user.getusername() + "、in" + dateutil.dateformat(new date()、 "yyyy-mm-dd hh:mm:ss") + "exclued!") "yyyy-mm-dd hh:mm:ss") loginusermap); request.getSession()。getservletcontext()。setAttribute( "loginouttime"、loginouttime); return "success";}}}3)ログインインターセプター(ログインへのログインはログインページにジャンプしません)
Public class loginInterceptorは、HandlerInterceptorAdapter {@OverridePublic Boolean PreHandle(HTTPSERVLETREQUESTリクエスト、httpservletResponse応答、オブジェクトハンドラー)をスローする{httpssession = request.getSession(); user user =(user user =(user session.gettribute( "now_user"); "now_user"; "now_user"; null){respons.sendredirect(request.getContextPath() + "/other/tologin"); return false;} // multi-userログイン制限判断判断、および迅速なメッセージブールアスロギン= false; if(user!= null){map <string、string> loginusermap =(map <string>) session.getServletContext()。getAttribute( "loginusermap"); string sessionid = session.getid(); for(string key:loginusermap.keyset()){//ユーザーは別の場所にログインしましたif(key.equals(user.getusername())&&! true; break;}}} if(islogin){map <string、string> loginouttime =(map <string、string、string>)session.getServletContext()。getattribute( "loginouttime"); session.setattribute( "smess"、 "user:" + user.getUsername() + "他の場所! "); loginouttime.remove(user.getUsername()); session.getServletContext()。setAttribute(" loginusermap "、loginouttime); respons.sendredirect(request.getContextPath() +"/other/tologin "); return false; POSTHANDLE(httpservletrequest request、httpservletResponse応答、オブジェクトハンドラー、ModelandView ModelandView)は例外(super.posthandle(request、response、handler、modelandview);} {super.aftercompletion(request、response、handler、ex);}}4)セッションが破壊されたら、logginusermapで保存されたキー値のペアをクリアします
Public ClassSessionListenerはhttpssessionListener {private static logger log = oggger.getLogger(sessionlistener.class);@overridepublic void sessioneded(httpsessevent event){} @overridepublic void sessiondestroyed(httpsessioneventsessions(httseventsessions){) = session.getId(); //セッションが破壊されたら、logginusermapユーザーで保存されたキー値ペアをクリアしますユーザーsession.getattribute( "now_user"); if(user!= null){map <string、string> loginusermap =(map <string、string> event.getSession()。getServletContext()。getAttribute( "loginusermap"); if(loginusermap.get(user.getusername()) user.getusername()); loginusermap.remove(user.getusername()); event.getSession()。getservletcontext()。5)web.xml
<! - セッションリスナーマルチユーザーログイン制限は、アプリケーションに保存されているユーザーログイン情報をクリアしながらセッション情報をクリアするためにログアウトします - > <リスナー> <リスナークラス> com.service.limitelogin.sessionlistener </ristener-class> </ristener>
6)ページコード(プロンプトを提供しながら、絞られたユーザーのセッション情報をクリアするために使用されます。そうしないと、プロンプト情報が常に表示されます)
<script type = "text/javascript"> $(document).ready(function(){var message = '$ {smes}'; if(message!= ""){{type: 'get'、false、false、cache:fals、url: '/other/clearusession'、datatype: ''、{} {} cusces:chuction:fals {}}); $( '#mess')。html(message);}}); </script>7)ユーザーセッションコードをクリアします
/***マルチユーザーログイン制限、クリアセッション情報(ログイン情報、プロンプト情報) request.getSession(); // httpsession.invalidate(); httpsession.removeattribute( "now_user"); httpsession.removeattribute( "smes"); return "success";}
開発作業はここで完了しています
4。操作結果
上記は、編集者が紹介したJavaマルチユーザーログイン制限の実装方法です。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!