Рубрики
Без рубрики

Как ответить анонимному пользователю через веб-сайты

Привет всем! Это мой первый пост здесь на dev.to и я набрался храбрости, чтобы написать… С тегами java, spring, учебник.

Это мой первый пост здесь 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,
                                    Map attributes) {
    // 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”