From 3564f87791dfb78f7d8bea067e2fcccbb1676340 Mon Sep 17 00:00:00 2001 From: Youth <109585620+Youthhing@users.noreply.github.com> Date: Sat, 6 Jul 2024 12:17:43 +0900 Subject: [PATCH] =?UTF-8?q?Feature:=20=EC=86=8C=EC=BC=93=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=20=EC=8B=9C=20=EA=B8=B0=EC=A1=B4=20=EC=84=B8=EC=85=98?= =?UTF-8?q?=20=EC=A2=85=EB=A3=8C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=20(#52)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/websocket/WebSocketHandler.java | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/cotato/csquiz/common/websocket/WebSocketHandler.java b/src/main/java/org/cotato/csquiz/common/websocket/WebSocketHandler.java index 6dd8e1f8..00f65333 100644 --- a/src/main/java/org/cotato/csquiz/common/websocket/WebSocketHandler.java +++ b/src/main/java/org/cotato/csquiz/common/websocket/WebSocketHandler.java @@ -38,17 +38,24 @@ public class WebSocketHandler extends TextWebSocketHandler { private static final String MEMBER_ID_KEY = "memberId"; private static final String EDUCATION_ID_KEY = "educationId"; private static final String ROLE_KEY = "role"; + private static final CloseStatus ATTEMPT_NEW_CONNECTION = new CloseStatus(4001, "new connection request"); private final ObjectMapper objectMapper = new ObjectMapper(); private final QuizRepository quizRepository; @Override - public void afterConnectionEstablished(WebSocketSession session) { + public void afterConnectionEstablished(WebSocketSession session) throws IOException { String memberId = findAttributeByToken(session, MEMBER_ID_KEY); Long educationId = Long.parseLong(findAttributeByToken(session, EDUCATION_ID_KEY)); String role = findAttributeByToken(session, ROLE_KEY); MemberRole memberRole = MemberRole.fromKey(role); - addMemberToSession(memberId, session); + if (MemberRoleGroup.hasRole(MemberRoleGroup.CLIENTS, memberRole)) { + handleSessionReplacement(memberId, CLIENTS); + CLIENTS.put(memberId, session); + } else { + handleSessionReplacement(memberId, MANAGERS); + MANAGERS.put(memberId, session); + } if (MemberRoleGroup.hasRole(MemberRoleGroup.CLIENTS, memberRole)) { sendCurrentOpenQuiz(educationId, session); @@ -57,6 +64,14 @@ public void afterConnectionEstablished(WebSocketSession session) { log.info("[세션 연결] {}, 연결된 세션: {}", memberId, session.getId()); } + private void handleSessionReplacement(String memberId, ConcurrentHashMap managers) + throws IOException { + if (managers.containsKey(memberId)) { + managers.get(memberId).close(ATTEMPT_NEW_CONNECTION); + managers.remove(memberId); + } + } + private void sendCurrentOpenQuiz(Long educationId, WebSocketSession session) { Optional maybeQuiz = quizRepository.findByStatusAndEducationId(QuizStatus.QUIZ_ON, educationId); @@ -147,19 +162,6 @@ public void stopAllQuiz(Long educationId) { } } - private void addMemberToSession(String memberId, WebSocketSession session) { - String roleAttribute = findAttributeByToken(session, ROLE_KEY); - MemberRole role = MemberRole.fromKey(roleAttribute); - - if (MemberRoleGroup.hasRole(MemberRoleGroup.CLIENTS, role)) { - CLIENTS.put(memberId, session); - log.info("[부원 연결] : {} , 세션 ID : {}" , memberId, session.getId()); - } else { - MANAGERS.put(memberId, session); - log.info("[관리자 연결] : {} , 세션 ID : {}" , memberId, session.getId()); - } - } - private String findAttributeByToken(WebSocketSession session, String key) { return session.getAttributes().get(key).toString(); }