SMALL
ChannelInterceptor 란?
WebSocket 에서 연결과 통신할때 인터셉트해서 쓰는 인터페이스이다.
아래의 매서드를 통해 재정의하여 preSend() 라는 매서드를 통해 StompCommand enum 클래스를 통해 StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message) 를 선언하여 해당 상태를 비교하여, 처리할수 있다.
또한 StompHeaderAccessor 는 STOMP 헤더(예: 대상, 콘텐츠 유형 등)를 기반으로 하는 공통 처리 헤더를 관리한다.
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
return message;
}
ChannelInterceptor 예제
아래의 방식되로 채팅 인원수를 관리하여 오류를 던질수 있다.
@Slf4j
@Component
@RequiredArgsConstructor
public class WebScoketInterceptor implements ChannelInterceptor {
@Autowired
private ChatRoomService chatRoomService;
HashMap<String, Integer> roomList = new HashMap<>();
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
MessageHeaders headers = message.getHeaders(); //메세지 들어올때 헤더
MultiValueMap<String, String> map = headers.get(StompHeaderAccessor.NATIVE_HEADERS, MultiValueMap.class);
if (StompCommand.CONNECT == accessor.getCommand()) {
System.out.println("처음 접속할때");
} else if (StompCommand.SUBSCRIBE == accessor.getCommand()) { //roomId
String chatRoomId = map.getFirst("roomId");
if (!(roomList.containsKey(chatRoomId))) {
roomList.put(chatRoomId, 1);
}else {
roomList.put(chatRoomId, roomList.get(chatRoomId) + 1);
}
if (roomList.get(chatRoomId) > chatRoomService.check_roomPeople(chatRoomId)) {
throw new IllegalStateException("인원 초과");
}
System.out.println("주소 구독할때");
} else if (StompCommand.SEND == accessor.getCommand()) {
System.out.println("메세지 보낼때");
} else if (StompCommand.DISCONNECT == accessor.getCommand()) {
System.out.println(map);
System.out.println("접속 끊을때");
}
return message;
}
}
WebSocketChatEventListener 란?
WebSocketChatEventListener 란? Session 연결될때 발생되는 EventHandler 이다.
아래의 예제를 보면 이해가 된다.
@Component
@RequiredArgsConstructor
public class WebSocketChatEventListener {
private final SimpMessageSendingOperations template;
//구독할려고 할때 발생되는 이벤트
@EventListener
public void handlerConnetionListener(SessionConnectEvent event) {
System.out.println("테스트 연결");
}
@EventListener
public void handlerDisconnectionListener(SessionDisconnectEvent event) {
System.out.println("테스트 끊김");
}
}
반응형
LIST
'Spring' 카테고리의 다른 글
Spring ControllerAdvice, RestControllerAdvice, ExceptionHandler (0) | 2023.05.27 |
---|---|
Lombok (0) | 2023.05.27 |
Spring Security (1) (0) | 2023.05.24 |
Websocket (1) (0) | 2023.05.21 |
thymeleaf (0) | 2023.05.20 |