Как войти в приложение чата с именем пользователя spring security

#java #spring-boot #spring-security #stomp

Вопрос:

Я новичок в Spring и пытаюсь войти в приложение чата с именем пользователя spring security. Но контроллер или топот не распознают ввод. И не позволяет входить в чат
, где я должен писать в stomp или controller? Спасибо.

Контроллер чата

 @Controller public class ChatController {    @GetMapping("/chat")  public String chat() {  return "chat";  }  @MessageMapping("/chat.sendMessage")  @SendTo("/topic/public")  public ChatMessagePojo sendMessage(@Payload ChatMessagePojo chatMessagePojo) {  return chatMessagePojo;  }   @MessageMapping("/chat.addUser")  @SendTo("/topic/public")  public ChatMessagePojo addUser(@Payload ChatMessagePojo chatMessagePojo, SimpMessageHeaderAccessor headerAccessor) {   // Add username in web socket session  headerAccessor.getSessionAttributes().put("email", chatMessagePojo.getSender());  return chatMessagePojo;  }  

Класс ChatMessage

 public class ChatMessagePojo {  private MessageType type;  private String content;  private String sender;   public enum MessageType {  CHAT,  JOIN,  LEAVE  }    }   

Топать

 const connect = () =gt; {  const Stomp = require("stompjs");  var SockJS = require("sockjs-client");  SockJS = new SockJS("http://localhost:8080/ws");  stompClient = Stomp.over(SockJS);  stompClient.connect({}, onConnected, onError);  }; const onConnected = () =gt; {  console.log("connected");   stompClient.subscribe(  "/user/"   currentUser.id   "/queue/messages",  onMessageReceived  );  }; const sendMessage = (msg) =gt; {  if (msg.trim() !== "") {  const message = {  senderId: currentUser.id,  recipientId: activeContact.id,  senderName: currentUser.name,  recipientName: activeContact.name,  content: msg,  timestamp: new Date(),  };    stompClient.send("/app/chat", {}, JSON.stringify(message));  }  };  

Пример экрана входа в чат:

введите описание изображения здесь

Ответ №1:

Я попытался, но потерпел неудачу, а затем решил ее своим собственным решением. Может быть, вы можете сослаться на это.

  1. Создайте конечную точку сокета для аутентификации и отправьте идентификатор и пароль для аутентификации.
  2. Сохраните идентификатор и сеанс после успешной аутентификации.
  3. Затем получите идентификатор пользователя через карту сеанса SESSION_USERID .

Внешний интерфейс

 stompClient.send("/app/chat/login", {}, "{type: AUTH, data: {id: 'mock', pwd: '12345678'}}");  

Бэкэнд

 public static final Maplt;String, Longgt; SESSION_USERID = new ConcurrentHashMaplt;gt;();  @Override public void handleTextMessage(WebSocketSession session, TextMessage message)  // parse message to object  if (message.type == AUTH) {  // do auth  // if auth succeed, cache the user  SESSION_USERID.put(userId, session.getId());  } else if (message.type == CHAT) {  Long userId = SESSION_USERID.get(session.getId());  if (userId == null) {  // Send error or close session  } else {  // Send messages to other peoples  }  }  }  //----