#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:
Я попытался, но потерпел неудачу, а затем решил ее своим собственным решением. Может быть, вы можете сослаться на это.
- Создайте конечную точку сокета для аутентификации и отправьте идентификатор и пароль для аутентификации.
- Сохраните идентификатор и сеанс после успешной аутентификации.
- Затем получите идентификатор пользователя через карту сеанса
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 } } } //----