単一のサインオンの機能は、実際のアプリケーションシナリオで依然として非常に重要です。論理的には、ユーザーが2つの操作を同時に実行できるようにします。 SpringMVCのシングルサインオン実装について学びましょう。
SpringMVCのインターセプターは、Springのインターセプターとは異なります。 SpringMVCには、統一されたエントリディスパッチャーサーブレットがあります。すべてのリクエストはDispatcherServletを通過するため、DispatcherServletで大騒ぎするだけです。 DispatcherServletにはプロキシがなく、SpringMVCが管理するコントローラーにはプロキシがありません。
1.最初に基本的な実装の原則を調査します。この関数は比較的単純です。つまり、同じWebプロジェクトで同時に動作できるユーザーが1人だけなので、リモートログインの発見と2つのパスがここに紹介されます。 1.サーバーは、ログインしたユーザーが別のIPを介して再度ログイン操作を実行したことを発見し、リマインダーを積極的にプッシュして、最初のユーザーにリモートログインをログインするように指示します。 2。ユーザーが操作を実行すると、アカウントが絞り出され、リモートログインがあることがわかります。これらの2つのソリューションに関しては、最初のソリューションはよりリアルタイムですが、まだ調査中です。以下の2番目の方法に焦点を当てましょう。
2。2番目のタイプの実装は比較的簡単です。 2つの操作があります。 1つは、各リクエストリクエストが一意の非繰り返しセッションIDに対応するため、ユーザーのセッションIDに追加のフィールドを追加してログインユーザーのセッションIDを保存することです。次に、インターセプターテクノロジーを使用して、ユーザーの操作を傍受します。インターセプターでは、ログインページの関連するURL要求が最初にリリースされ、もう1つはログイン検証リクエストがリリースされます。最後に、ユーザーをフィルタリングします。 (ユーザーログインについて、検証が成功した場合、ユーザーはログインインターセプトの検証のためにセッションに保存するだけでなく、セッションIDをユーザーテーブルの対応するセッションIDに保存する必要があります。)今回のリクエストリクエストについては、セッションとそのIDを取得してから、このIDに従ってデータベースのセッションIDと同じかどうかを比較できます。違いがある場合、ユーザー接続サーバーの操作にセッションが行われるため、オフラインジャンプログインがログインにジャンプするように求められます。セッションの有効期限が切れる限り、各ユーザーの開始された操作のセッションIDは同じであるため、ログインするときにデータベースに保存されているIDと一致します。ログイン時にセッションは再確立されます。データベースのセッションは、データベースのSessionIDを更新しますが、SessionIDはまだ変更されていません。ただし、データベースのセッションは変更されました。したがって、データベース内のSessionIDがインターセプターで一貫しているかどうかを確認すると、シングルユーザーログインの機能を達成するためにユーザーの操作をインターセプトできません。 (セッションに関するメモ、ユーザーが最初にサーバーに接続すると、セッションがサーバー側に作成され、その後、ユーザーが開始するすべての操作がこのセッションのIDを運び、いくつかの状況が発生します。ユーザーは長い間サーバーで動作しません。ユーザーはセッションを無効にします。
以下は、springmvcでのインターセプターの実装です
Public Class SingleUserInterceptorは、HandlerInterceptor {@AutowiredPrivate UserMapper Mapper; public void afcompletion(httpservletrequest arg0、httpservletresponse arg1、Object arg2、Exception arg3)をスローする{// todo auto-jerated method} public void boid agrardle( httpservletresponse arg1、object arg2、modelandview arg3)スロー例外{// todo auto-feanated method stub} public boolean prehandle(httpservletrequest arg0、httpservletresponse arg1、object arg2)スロー例外if(url.indexof( "login.jsp")> = 0 || url.indexof( "new/login")> = 0 || url.indexof( "checkuser")> = 0){return true;} arg0.getSession()。getAttribute( "user"); if(user!= null){string sessionid = mapper.getuserentity(integer.valueof(user))。 else {arg1.setstatus(arg1.sc_gateway_timeout); arg1.setContentType( "text/html; charset = utf-8"); printwriter out = arg1.getWriter(); out.println( "<html>");他の場所では、あなたはオフライン ') "); arg0.getRequestDispatcher( "login.jsp")上記のコードは、同じユーザーが複数回ログに記録したときに、最初のログインしたユーザーが回線から絞られている機能を実現できます。アカウントにリモートでログインするようにプロンプトしてから、ログインページにジャンプする機能を実現できます。ここでは、この単純なアラートプロンプト関数の重要なポイントを説明する必要があります。このアラートが表示される場合、リクエストを終了できる必要があります。次に、応答印刷関数がアラートプロンプトステートメントを出力するため、コメントされたジャンプステートメントは存在できません。ある場合、操作が正しく終了せず、他の操作に転送またはリダイレクトされるため、アラートプロンプトステートメントは発行されません。それが正しいかどうかにかかわらず、それは他のアクションからページに出力されるため、応答印刷ステートメントは表示されません。したがって、正しい方法は次のとおりです。インターセプトリクエストはリリースされておらず(ReturnFalse)、リクエストはまだ元のリクエストであり、ジャンプしません。ページへの応答の印刷情報を表示できます。ログインページへのジャンプについては、以下を使用できます。Out.println( "window.open( '"+arg0.getContextPath()+"/new/login'、 '_ top');");それを実装するには、アクション要求が応答によってJS出力のセクションで実行され、ログインページを指します。
上記のコードは基本的に単一のユーザーログイン関数と見なされていますが、Ajax要求の操作は、リモートロケーションでログインするときにログインページを指し示していないことがわかり、迅速な情報はありません。 Ajaxが非同期リクエストを行っており、要求されたURLもプロセッサマッパーで一致しているため、最初にその理由を説明しましょう。上記の応答に印刷されたJSステートメントは、成功の成功した要求と返品値になります。上記の文でコメントしてみてください:arg1.setstatus(arg1.sc_gateway_timeout);現時点では、他の操作を実行する必要があります。最初はarg1.setstatus(arg1.sc_gateway_timeout);その機能は、応答によって返されるステータスコードを設定することです。上記の設定は、要求エラーを表すためにステータスコード504が返されることを示しています。現時点では、AJAX要求は成功方法で応答しなくなりますが、AJAXエラーメソッドに応答します。したがって、たとえば、AJAXエラーで対応するメソッドを実行する必要があります。
$ .ajax({url: 'new/msd2'、success:function(a){alert(a);}、error:function(rs){if(rs.status == 504){document.write(rs.responsetext);}}});リモートログインのためにAJAX要求が傍受される場合、arg1.setstatus(arg1.sc_gateway_timeout)を設定します。リクエストの返品ステータスは504に変更できます。エラーメソッドが応答します。ステータスが設定したステータスコードであると判断された場合、document.write(rs.responsetext); ResponseTextは、インターセプターのフロントデスクに印刷されたJSステートメントです。これらのステートメントが実行されるために、document.write();メソッドは、それを有効にするためにDOMにコードを書き込む必要があります。この時点で、非同期AJAXリクエストのすべてのリクエストと単一サインインが基本的に実装されています。
主要なコード、アイデア、および操作の原則を記録するためにのみ、この記事を残す
要約します
上記は、SpringMVCインターセプターでのシングルサインオンの実装に関するすべてです。すべての人に役立つことを願っています。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました。