Я использую springboot-websocket
для функции чата.Я использую rabbitmq
в качестве брокера.Я не могу отправить сообщение конкретному пользователю.
Из многих блогов и учебных пособий я понял, что мы можем отправить сообщение конкретному пользователю, используя метод template.convertAndSendToUser(...)
.
Но первый аргумент, который принимает метод, этоString
имя пользователя.Что это за имя пользователя?
public class CustomSubProtocolWebSocketHandler extends SubProtocolWebSocketHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(CustomSubProtocolWebSocketHandler.class);
@Autowired
private UserCommons userCommons;
CustomSubProtocolWebSocketHandler( MessageChannel clientInboundChannel, SubscribableChannel clientOutboundChannel )
{
super(clientInboundChannel, clientOutboundChannel);
}
@Override
public void afterConnectionEstablished( WebSocketSession session ) throws Exception
{
LOGGER.info(
"************************************************************************************************************************New webSocket connection was established: {}",
session);
String token = session.getUri().getQuery().replace("token=", "");
String user = Jwts.parser().setSigningKey(TokenConstant.SECRET)
.parseClaimsJws(token.replace(TokenConstant.TOKEN_PREFIX, "")).getBody().getSubject();
Optional<UserModel> userModelOptional = userCommons.getUserByEmail(user);
if( !userModelOptional.isPresent() )
{
LOGGER.error(
"************************************************************************************************************************Invalid token is passed with web socket request");
throw new DataException(GeneralConstants.EXCEPTION, "Invalid user", HttpStatus.BAD_REQUEST);
}
super.afterConnectionEstablished(session);
}
@Override
public void afterConnectionClosed( WebSocketSession session, CloseStatus closeStatus ) throws Exception
{
LOGGER.error(
"************************************************************************************************************************webSocket connection was closed");
LOGGER.error(closeStatus.getReason());
super.afterConnectionClosed(session, closeStatus);
}
@Override
public void handleTransportError( WebSocketSession session, Throwable exception ) throws Exception
{
LOGGER.error(
"************************************************************************************************************************Connection closed unexpectedly");
LOGGER.error(GeneralConstants.ERROR, exception);
super.handleTransportError(session, exception);
}
}
В этом CustomSubProtocolWebSocketHandler
я могу получить WebSocket-session-id
.Но если я использую session-id
в качестве первого параметра, сообщение не будет отправлено этому пользователю.Как я могу получить имя пользователя?