2017-04-04 24 views
0

私は、あるエンドポイントから別の場所に確立された特定のセッションにメッセージを送信できる単純なWebソケットアプリケーションを実装しようとしています。これまでのところ、@SendToUser()という注釈を使用してクライアントがチャネルに登録できるようになりました(Spring Websockets @SendToUser without login?プリンシパルのないスプリングWebソケット

ただし、今は別のエンドポイントを作成したいこのエンドポイントに渡されたデータに関連付けられたユーザーを検索し、このデータに関するそのユーザーにメッセージを送信します。

しかし、ユーザーがプリンシパル(私はSpring Securityを使用していない)を持っていないため、SimpMessagingTemplate convertAndSendToUser()コマンドを呼び出すことができるようにする方法を正確に判断できませんでした。

@MessageMappingエンドポイントに渡されたMessageHeadersからsimpSessionIdを取得できましたが、今ではアプリケーションのさまざまな部分から情報を送信するためにsimpSessionIdを使用する方法がわかりません。

私はDefaultHandshakeHandlerのdecideUser()メソッドをオーバーライドし、成功したwebsocketハンドシェイク(この質問の答え:How to reply to unauthenticated user in Spring 4 STOMP over WebSocket configuration?)でユーザーにユーザー名としてランダムに生成されたUUIDを割り当てていますが、プリンシパルが公開されていません。私はアプリケーションを正しく使用するためにプリンシパルを適切に生成し、それをプリンシパルに割り当てる方法が正確にはわかりません。

私は基本的に、匿名ユーザーがWebsocket接続を作成した後にアプリケーションのさまざまな部分からメッセージを送信する機能が必要です。

答えて

1

だから同様の問題に直面して誰のために、私は自分のPrincipalクラスを実装:

package hello; 

import java.security.Principal; 
import java.util.Objects; 

public class AnonymousPrincipal implements Principal { 

    private String name; 

    @Override 
    public String getName() { 
     // TODO Auto-generated method stub 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @Override 
    public boolean equals(Object another) { 
     if (!(another instanceof Principal)) 
      return false; 

     Principal principal = (Principal) another; 
     return principal.getName() == this.name; 

    } 

    @Override 
    public int hashCode() { 
     return Objects.hash(name); 
    } 
} 

はその後、私はDefaultHandshakeHandlerの私の独自のバージョンを実装:

package hello; 

import java.security.Principal; 
import java.util.Map; 
import java.util.UUID; 

import org.springframework.http.server.ServerHttpRequest; 
import org.springframework.web.socket.WebSocketHandler; 
import org.springframework.web.socket.server.support.DefaultHandshakeHandler; 

public class CustomHandshakeHandler extends DefaultHandshakeHandler { 

    @Override 
    protected Principal determineUser(ServerHttpRequest request, 
      WebSocketHandler wsHandler, Map<String, Object> attributes) { 
     Principal principal = request.getPrincipal();   

     if (principal == null) { 
      principal = new AnonymousPrincipal(); 

      String uniqueName = UUID.randomUUID().toString(); 

      ((AnonymousPrincipal) principal).setName(uniqueName); 
     } 

     return principal; 

    } 

} 

今のWebSocketセッションはこれを取得しますユーザーが匿名の場合、匿名のプリンシパルが割り当てられ、後でアプリケーションの他の部分で使用するために名前(生成されたUUID)を保存できるようになります。

関連する問題