2016-12-23 8 views
4

生Spring WebSocketアプリケーション(sockjs/STOMPやその他のミドルウェアを使用しない)では、私のWebSocketHandler beanのコードで使用できるようにHTTPセッションスコープに登録されていますか?で説明したようにSpring WebSocketハンドラ( "websocket"スコープではない)内の "session"スコープBeanへのアクセス方法

  • 私は同じのWebSocketセッションのすべてのハンドラの呼び出しにアクセス可能な範囲でBeanを作成するにはどうすればよい(例えば:私は何ないの提示は、これらの質問のいずれかであることを

    注意Request or Session scope in Spring Websocketへの答え)。アクセスする必要のあるBeanは、すでにHTTPセッションのスコープ内に存在します。

  • サーブレットコンテナのHTTPセッションストレージ内のオブジェクトに(プログラムで)アクセスするにはどうすればよいですか?答えにはHttpSessionHandshakeInterceptorを使用しています)、それは私にSpringスコープの依存関係の注入を与えません。
  • 異なるスコープのコード間でBeanを渡すためにScopedProxyを使用する方法(例:here)私はすでにこれを行う方法に精通していますが、WebSocketHandlerの場合はsessionのスコープがオブジェクトにアクセスされた時点でスレッドにバインドされていないため、エラーが発生します。
  • How to access the current security principal - やはり非常に便利ですが、現在達成しようとしているものではありません。

私は何を望んでいること(クライアントに簡単なプッシュ更新を送信するために)のWebSocketプロトコルと直接通信するためにMVCアプリケーションの伝統的なHTTP要求を開始部品が可能になりますシンプルなフレームワークを提供しています。私ができるようにしたいのは、MVCコントローラからセッションスコープのオブジェクトにデータをプッシュし、websocketハンドラで取り出すことです。 MVCコントローラの視点からこののための最も単純なAPIを使用したいと思います。これはセッションスコープのBeanを使用することができれば理想的です。このデータを共有する非常に簡単な方法に関する他のアイデアがあれば、私はこのアプローチが不可能な場合にも聞いてみたいと思います。

答えて

1

websocket用のJava APIを使用することもできます。このリンクhttps://spring.io/blog/2013/05/23/spring-framework-4-0-m1-websocket-support は、Springでこれを行う方法を説明しています。 (私たちはその範囲外のBeanにアクセスしようとしているため) Ufortunately、この

@ServerEndpoint(value = "/sample", configurator = SpringConfigurator.class) 
public class SampleEndpoint { 

    private SessionScopedBean sessionScopedBean; 

    @Autowired 
     public SampleEndpoint(SessionScopedBean sessionScopedBean) { 
     this.sessionScopedBean = sessionScopedBean; 
     } 
} 

のようなものは、例外が発生しますが、シングルトンとプロトタイプ豆のためにそれがうまく動作します。セッションで動作するように

あなたがhanshakeを変更し、必要な属性を渡すことができます属性:

public class CustomWebSocketConfigurator extends SpringConfigurator { 
    @Override 
    public void modifyHandshake(ServerEndpointConfig config, 
      HandshakeRequest request, 
      HandshakeResponse response) { 

     //put attributes from http session to websocket session 
     HttpSession httpSession = (HttpSession) request.getHttpSession(); 
     config.getUserProperties().put("some_attribute", 
       httpSession.getAttribute("some_attribute_in_http_session")); 
    } 
} 

P. S.答えよりもより多くのコメントを。私はちょうどwebsocketのセッション属性を別の方法で質問に追加したいのです。私はまったく同じ問題をWebで検索しています。上に示した方法は、websocketでセッションデータを処理するための最も体系的なアプローチのようです。

+0

も参照してください:http://stackoverflow.com/questions/31916727/request-or-session-scope-in​​-spring-websocket?noredirect=1&lq=1 –

+0

これらの提案のどちらも実際には、残念ながらwebsocketハンドラのフィールドとしてスコープ付きBeanを使用しています。 2つ目はプログラム的に*を得ることができますが、注入されるbean依存性を持つテスト容易性が重要です。私はこれに対する解決策を持っていますが、私が作業を終えたときに書き留めておきます。残念ながら、それは単純ではありません... – Jules

+0

@Julesセッションスコープでは機能しないと書いています。 websocketはハンドシェイクでのみhttpを認識しているので、セッションスコープのBeanにもアクセス権が与えられていないことは当然です。私はこのソリューションを私のプロジェクトに使用しました.WebSocketエンドポイントが1つしかないので、ハンドシェイクのユーザーIDをコードの1つの場所で渡し、セッションスコープではないサービス層からBeansを使用することができました。私は、このソリューションをここに投稿することを決めましたが、投稿された質問に対しては部分的にしか機能しません。 –

関連する問題