Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过SpringWebSocket、sockJs和STOMP向经过身份验证的用户发送通知_Java_Spring_Websocket - Fatal编程技术网

Java 通过SpringWebSocket、sockJs和STOMP向经过身份验证的用户发送通知

Java 通过SpringWebSocket、sockJs和STOMP向经过身份验证的用户发送通知,java,spring,websocket,Java,Spring,Websocket,我有一个基于JWT的应用程序,由spring security保护。一切安全,工作正常。此外,应用程序还公开了一个websocket url(localhost:8080/ws),用户可以订阅该url(“/realtime”)并接收通用更新,即每个经过身份验证或未经身份验证的用户都将接收更新 @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig extends AbstractWebSocketMess

我有一个基于JWT的应用程序,由spring security保护。一切安全,工作正常。此外,应用程序还公开了一个websocket url(localhost:8080/ws),用户可以订阅该url(“/realtime”)并接收通用更新,即每个经过身份验证或未经身份验证的用户都将接收更新

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/realtime");

        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws")
                .setAllowedOrigins("*")
                .withSockJS();

    }

}
客户端代码:

//private _channel = "/realtime";
  constructor(){
    this.connect();
  }
  public connect() : void {
      let self = this;
      var token = localStorage.getItem("token");//get jwt from storage
      self._webSocketUrl = "http://localhost:8080/ws";
      //let webSocket = new WebSocket(this._webSocketUrl);//without sockjs
      let webSocket = new SockJS(this._webSocketUrl);//with sockjs
      self._stompClient = Stomp.over(webSocket);
      self._stompClient.connect({}, function (frame) {
        self._stompClient.subscribe("/realtime", function (stompResponse) {

              console.log("got data from server");
              self._stompSubject.next(stompResponse);
          });
      });
  }
所有这些都很好。现在,每当服务器上发生他们感兴趣的事情时,我需要向经过身份验证的特定用户发送通知。所以,我从来没有收到任何来自用户的消息。每当经过身份验证的用户需要发送请求时,他都可以通过rest端点而不是websocket发送请求。因此,一旦他登录、连接到/ws-endpoint并订阅了“/实时目的地,他就完成了。现在,我的工作是在特定用户可用时向他们发送通知。这是一种通过websocket进行的单向(服务器到客户端)通信。这将在将来发生变化

所以,每当我有东西给经过身份验证的用户时,user123@gmail.com,我如何通过websocket向他发送通知


我已经浏览了许多有关stackoverflow的链接和问题,但找不到任何有效的方法。

我通过以下操作实现了这一点:

  • 例如,在订阅中使用身份验证主体

    self._stompClient.subscribe("/realtime/" + userName, function (stompResponse) {
    
          console.log("got data from server");
          self._stompSubject.next(stompResponse);
      });
    
    }))

  • 发送给用户作为

    simpMessagingTemplate.convertAndSendToUser(userName, "/realtime/", message);
    

  • 请注意,此解决方案可能未提供适当的安全控制。请查看谢谢,但不起作用。这是我更改的内容。SimpMessageTemplate.convertAndSendToUser(“user123@gmail.com和客户机:self.\u stompClient.subscribe(“/realtime”);和客户机:self.\u stompClient.subscribe(“/realtime”)/user123@gmail.com“,函数(stompResponse){