Работает ли @SendToUser в Spring только при интеграции Spring Security? - PullRequest
0 голосов
/ 23 октября 2018

Я начинаю с веб-сокетов с помощью Springboot.Итак, сначала я успешно создал приложение для демонстрационного чата, в котором сообщения передаются каждому пользователю.Теперь вместо того, чтобы рассылать сообщение всем пользователям, я хочу отправить сообщение одному конкретному пользователю, поэтому я наткнулся на аннотацию @SendToUser.Теперь я не могу понять, как эта аннотация будет работать.В моем приложении в настоящее время отсутствует какой-либо процесс регистрации, включая Spring Security Framework.

Может кто-нибудь указать мне несколько хороших статей по этой теме, а также возможно ли отправить одно-одно сообщение с этой аннотацией без реализации Spring Security?

Это то, что я сделал до сих пор:

//Controller
@Controller
public class MessageController
{

   @Autowired
   private SimpMessagingTemplate messagingTemplate;

   //This broadcasts to all users
   @MessageMapping("/send")
   @SendTo("/topic/greeting")
   public MessageBean send(MessageBean message)
   {
      message.setDate( ZonedDateTime.now() );
      return message;
   }

   //This is intended to particular user
   @MessageMapping("/message")
   @SendToUser("/topic/greeting")
   public MessageBean processMessage(@Payload MessageBean message)
   {
      message.setDate( ZonedDateTime.now() );
      return message;
   } 
}

// WebSocketConfig:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer
{

   /* (non-Javadoc)
    * @see org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer#configureMessageBroker(org.springframework.messaging.simp.config.MessageBrokerRegistry)
    */
   @Override
   public void configureMessageBroker( MessageBrokerRegistry config )
   {
      config.enableSimpleBroker( "/topic/", "/queue/" );
      config.setApplicationDestinationPrefixes( "/app" );
      config.setUserDestinationPrefix("/user"); 
   }

   /* (non-Javadoc)
    * @see org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer#registerStompEndpoints(org.springframework.web.socket.config.annotation.StompEndpointRegistry)
    */
   @Override
   public void registerStompEndpoints( StompEndpointRegistry registry )
   {
      StompWebSocketEndpointRegistration registration = registry.addEndpoint( "/secretum" );
      registration.setHandshakeHandler( new DefaultHandshakeHandler()
      {
         @SuppressWarnings("unused")
         public boolean beforeHandshake( ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler webSocketHandler, Map< String, String > attributes )
               throws Exception
         {
            if ( request instanceof ServletServerHttpRequest )
            {
               ServletServerHttpRequest servletRequest = ( ServletServerHttpRequest ) request;
               HttpSession session = servletRequest.getServletRequest().getSession();
               attributes.put( "sessionId", session.getId() );
            }
            return true;

         }

      } );
      registration.setAllowedOrigins( "*" ).withSockJS();
   }
}

// Сторона клиента:

var clentModule = angular.module('clentModule', []);

//Main Controller
clentModule.controller('clentController', function($scope) {
    var client;
    $scope.connectAndSubscribe = function()
    {
        var url = "ws://localhost:8080/secretum/websocket";
        client = webstomp.client(url);
        connected = function()
        {
            console.log("connected");
        }

        var headers = {};
        client.connect(headers,function(){
            console.log("successfuly connected");
            var subscription = client.subscribe("/topic/greetings",subscriptionCallback);
        });

        subscriptionCallback = function(data) {
            console.log("subscription data", data);
        }

        //var subscription = client.subscribe("/topic/greetings",subscriptionCallback);
        //console.log(subscription);
    };

    $scope.sendMessage = function()
    {
        //var subscription = client.subscribe("/topic/greetings",subscriptionCallback);
        $scope.message = {};
        $scope.message.sender = "xyz";
        $scope.message.reciever = "abc";
        var sendObject = JSON.stringify($scope.message);
        client.send("/topic/greetings", {priority: 9}, sendObject);
    };

});

Мой вопрос со стороны клиента, как мне отправить запрос на отправку сообщения конкретному пользователю, поскольку на сервере не хранится никакой информации о пользователе.Итак, это мой первоначальный вопрос, работает ли эта аннотация без пружинной защиты?

1 Ответ

0 голосов
/ 23 октября 2018

@ Paras ... посмотрите, как только вы поймете идею

Используйте @SendToUser и добавьте "/ user /" перед очередью при подписке (только на стороне подписчика).Отдых работает магией: -)

Вместо

Java Server: @SendTo("/topic/showResult")

и

JS Client: stompClient.subscribe('/topic/showResult', function(calResult){  ....

использование:

Java Server: @SentToUser("/topic/showResult")

и

JS Client: stompClient.subscribe('/user/topic/showResult', function(calResult){ ....

кредит @RS ...

и переопределение

метод configureClientInboundChannel () в интерфейсе WebSocketMessageBrokerConfigurer

...