メインクラスは次のとおりです。
HttpSessionEventPublisherは、セッションの作成と破棄を聴い
たときにConcurrentSessionFilter HTTP要求するたびにチェックはあなたの現在のセッションの有効期限が切れているかどうかを確認するには
セッションに保存されているSessionRegistryImpl情報、およびプロセスやる
のうち、制御ConcurrentSessionControllerImplユーザログを
モデルでセッション情報を格納するセッション情報
前記のweb.xmlにも追加する必要があります
。< - - SessionRegistryImplログの処理時間を内外に!>
<リスナー>
<リスナークラス> org.springframework.security.ui.session.HttpSessionEventPublisher </リスナクラス>
< /リスナー>
春の設定ファイル:
<豆:豆上記のid =「CurrentController」言及した
クラス=「org.springframework.security.concurrent.ConcurrentSessionControllerImpl」>
<豆:プロパティ名=「exceptionIfMaximumExceeded」
値は=「偽」/>
実際には、現在ログインしているユーザーのリストを達成し、蹴らするが利用者はspringsecurity呼んでいる
org.springframework.security.concurrent.SessionRegistryImplを
ミニので、ユーザーの機能を追い出さこのクラスで行うには、コースの要件を満たすために、非常に良いではありませんが、このソースを移動するために気にしないでください-webはStruts2の例ですので、私はあなたが、同社のプロジェクトを使用している場合、それは、仕事の内部コントローラにSessionAction.javaを行くべき、動作させるために、このクラスを呼び出すために、簡単なアクションを書いた:
ORGのためのパッケージ変更.springside.examples.miniweb.web.user;
java.util.ArrayListの輸入、
インポートjava.util.Listに、
インポートorg.apache.struts2.config.ParentPackage;
インポートorg.apache.struts2.config.Result;
インポートORG。 apache.struts2.config.Results;
輸入org.apache.struts2.dispatcher.ServletActionRedirectResult;
輸入org.springframework.security.concurrent.SessionInformation。
輸入org.springframework.security.concurrent.SessionRegistry。
輸入org.springside.modules.web.struts2.CRUDActionSupport。
輸入org.springside.modules.web.struts2.SimpleActionSupport。
@ParentPackage( "デフォルト")
@Results({@Result(名= CRUDActionSupport.RELOAD、値= "/セッション"、タイプ= ServletActionRedirectResult.class)})
パブリッククラスSessionActionはSimpleActionSupportを拡張{
プライベート静的最終的な文字列のリロードが= "リロード" ;
プライベート静的最終長いserialVersionUIDの= 8071034786218297672L。
プライベート文字列ログインID。
プライベートSessionRegistry sessionRegistry。
ListloginIdsが;
//デフォルトの方式
{パブリック文字が例外スロー)(実行
リターンリストを();
}
ユーザーのリスト現在ログインloginIds //
例外をスロー)パブリック文字列リスト({
オブジェクト[] = loginIds_obj sessionRegistry.getAllPrincipals();
IF( != NULL && loginIds_obj.length loginIds_obj> 0){
loginIds ArrayListの新しい新=(loginIds_obj.lengthを)
するための(INT I = 0; I <loginIds_obj.length; Iは++){
loginIds.add((文字列)loginIds_obj [I]) ;
}
}
; SUCCESSを返す
}
ユーザーキック、着信ログインIDを//
例外{スロー)(破壊パブリック文字列
(セッション情報[] =のsessions_arrsのsessionRegistry.getAllSessionsを
ログインID)、偽;
(!sessions_arrs = NULL && sessions_arrs.length> 0){場合
ため(INTがi = 0; iは<sessions_arrs.length; iは++){
sessions_arrs [I] .expireNow()。
// sessionRegistry.removeSessionInformation(sessions_arrs [I] .getSessionId())。
}
}
戻りリロード。
}
パブリック文字列getLoginId(){
戻りログインID。
}
公共ボイドsetLoginId(文字列ログインID){
this.loginId =ログインID。
}
パブリックListgetLoginIds(){
戻りloginIds。
}
公共ボイドsetLoginIds(ListloginIds){
this.loginIds = loginIds。
}
公共ボイドsetSessionRegistry(SessionRegistry sessionRegistry){
this.sessionRegistry = sessionRegistry。
}
}
ます。https://my.oschina.net/kt431128/blog/224698で再現