2016-11-15 14 views
0

ユーザーオブジェクトをセッションに設定していて、別のコントローラにそのセッションを取得できないという1つのアプリケーションを作成しています。そして私はアプリケーション全体を通してそのセッションを維持したい(ユーザーログアウトまで)。だから、私はどのようにセッションオブジェクトを別のコントローラとアプリケーション全体に渡すことができます。アプリケーション全体を通してセッションを維持するために必要な手順は何ですか。Javaでセッションを使用してアプリケーション全体でユーザーオブジェクトを維持する方法

は、セッションに設定:

public ResponseEntity<Object> getCustMenus(HttpSession session){ 
    UserInformation userInformationSession = luser.getRolesData(); 
    session.setAttribute("userInfo", userInformationSession); 
} 

をセッションの取得:

UserInformation userInformation=(UserInformation) session.getAttribute("userInfo"); 
System.out.println("-----"+userInformation.getUserName()+"----------username"); 

答えて

0

私も同じ問題に直面していますので、私は、あなたの質問に出くわしました。 私は、Tomcatの要求処理メカニズムに頼ることができると思います。各要求は単一のスレッドで実行されています。

だから私は、キーが要求Threadオブジェクトと値はHttpSessionのかさえのHttpRequestオブジェクトです

  1. スタティックマップを持つことができます。マップ
  2. urlを/ *に設定したフィルタは、各リクエストがこのフィルタを通過することを意味します。フィルタは、現在のスレッドと要求オブジェクトを静的マップに追加します。

    map.put(Thread.currentThread(), httpRequest);

マップは、いくつかのクラスの静的フィールドであるとして、それはすべてのスレッドにアクセスできるようになりますし、あなたがリクエストのライフサイクルものの異なるコントローラ間でオブジェクトを共有する必要がある場合は、それを置くことができますこの地図、例えば属性としてhttpsessionを入れ、必要な場所に取得します。

  1. フィルタでは、要求が行われたときにマップからスレッドを削除します。私たちは、私たちは、ステップ3

    をスキップすることができたとのWeakHashMap使う場合

    map.remove(Thread.currentThread());

私はまだこのアプローチを試していないが、私はそれが動作するはずだと思います。試してみると結果が分かります。

+0

私がdownvotingする前に提案した解決策に何が問題なのか教えてください。 – Nare

0

私は別の議論で完全な答えを見つけました。 Get the HttpServletRequest (request) object from Java code

私にとっての議論の最も有用な部分は、skaffmanによって投稿されました。下にそれを見つけてください。

春には、この目的のためにRequestContextFilterが用意されています。これはThreadLocalを使用し、コードがRequestContextHolderを介して現在の要求を取得できるようにします。このフィルタでは、Springの他の部分を使用する必要はありません。

関連する問題