Это мой первый пост здесь dev.to и я набрался смелости написать это, потому что всегда хотел завести блог или где-нибудь поделиться тем, что я узнал.
Итак, поехали.
Пару недель назад я начал немного глубже изучать Spring Websocket и STOMP , потому что у меня было 2 приложения, Сервер и Клиент, которые должны были взаимодействовать таким образом, чтобы Клиент запрашивал некоторые данные, а Сервер отвечал на этот запрос.
Я знаю, что это звучит очень просто, но проблема, с которой мне пришлось столкнуться, заключалась в ответе с Сервера так называемому анонимному пользователю , потому что клиентское приложение не является пользователем как таковым .
Поэтому, просматривая здесь и там несколько веб-сайтов, я обнаружил, что могу сделать этот конкретный случай каким-то образом похожим на тот, когда вы используете пользователей основного приложения.
Идея состоит в том, чтобы сделать анонимного пользователя видимым и ключ в том, чтобы создать определенный идентификатор сеанса для него, когда рукопожатие между 2 приложениями сделано:
public class CustomHandshakeHandler extends DefaultHandshakeHandler { // Custom class for storing principal @Override protected Principal determineUser(ServerHttpRequest request, WebSocketHandler wsHandler, Mapattributes) { // Generate principal with UUID as name return new StompPrincipal(UUID.randomUUID().toString()); } }
И я также расширил основной java.security. Принципал класс в Топать принципалом для того, чтобы иметь что-то особенное для моего случая:
public class StompPrincipal implements Principal { private String name; public StompPrincipal(String name) { this.name = name; } @Override public String getName() { return name; } }
И это в значительной степени так, теперь слушаем какой-то путь, например /учебник-запрос и имеющий в качестве параметра объект SimpMessageHeaderAccessor , я могу получить информацию о сеансе и ответить напрямую | пользователю , который сделал запрос:
@Autowired private SimpMessagingTemplate messagingTemplate; @MessageMapping("/tutorial-request") public void handleRequest(SimpleRequest request, SimpMessageHeaderAccessor headerAccessor) { String sessionId = headerAccessor.getSessionId(); log.info("Handling session with id {} receiving message {} from {}", sessionId, request.getText(), request.getFrom()); SimpleResponse response = new SimpleResponse("Hello!"); messagingTemplate.convertAndSendToUser(headerAccessor.getUser().getName(), "/queue/tutorial-request", response); log.info("Replied to {} with message {}", sessionId, response); }
Я пропустил добавление Простой запрос и Простой ответ потому что это всего лишь простые объекты, которые можно найти в репозитории вместе со всем кодом сверху:
александриум/весна – учебные пособия
Ресурсы для весенних учебных пособий
Не стесняйтесь делиться со мной своими мыслями в комментариях, я знаю, что мне нужно многому научиться и совершенствоваться в написании постов, я надеюсь, что это только начало, и я был бы признателен за любые предложения, поэтому, пожалуйста, сделайте это.
Счастливого кодирования!
Оригинал: “https://dev.to/alexandrum/how-to-reply-to-an-anonymous-user-over-websockets-d4e”