Я начинаю с веб-сокетов с помощью 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);
};
});
Мой вопрос со стороны клиента, как мне отправить запрос на отправку сообщения конкретному пользователю, поскольку на сервере не хранится никакой информации о пользователе.Итак, это мой первоначальный вопрос, работает ли эта аннотация без пружинной защиты?