웹 소켓 기본
2021. 11. 10. 03:07ㆍ스프링부트
웹 소켓 핸들러
@Service public class WebSocketHandler extends TextWebSocketHandler { // List<WebSocketSession> list = new ArrayList<>(); List<WebSocketSession> admins = new ArrayList<>(); @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { System.out.println("연결됨 = " + session); // list.add(session); if(getId(session) != null) { admins.add(session); } } @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { System.out.println("handleTextMessage 세션= " + session); System.out.println("handleTextMessage 메세지= " + message); System.out.println("접속자 수 = " + admins.size() ); for(int i=0;i<admins.size();i++) { admins.get(i).sendMessage(new TextMessage(message.getPayload())); } String msg = message.getPayload(); String userId = getId(session); System.out.println("userId = " + userId); System.out.println("msg = " + msg); } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { System.out.println("연결 종료 = " + session); admins.remove(session); } private String getId(WebSocketSession seesion) { Map<String, Object> map = seesion.getAttributes(); System.out.println("map = " + map); User user = (User) map.get("admin"); if(user != null ) { return user.getNickname(); } return null; } }
config
@Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Autowired private WebSocketHandler webSocketHandler; @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(webSocketHandler, "/chating") .addInterceptors(webSocketInterceptor()) ; } @Bean public WebSocketInterceptor webSocketInterceptor() { return new WebSocketInterceptor(); } }
채팅 서버로 가기전 유저 정보를 가져오는 인터셉터
public class WebSocketInterceptor extends HttpSessionHandshakeInterceptor { @Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { System.out.println("인터셉터 beforeHandshake"); ServletServerHttpRequest ssreq = (ServletServerHttpRequest) request; HttpServletRequest req = ssreq.getServletRequest(); HttpSession session = req.getSession(); System.out.println(SecurityContextHolder.getContext().getAuthentication().getPrincipal() instanceof LoginDetail); System.out.println("123" + SecurityContextHolder.getContext().getAuthentication().getPrincipal()); if(SecurityContextHolder.getContext().getAuthentication().getPrincipal() instanceof LoginDetail) { LoginDetail user = (LoginDetail) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); if(user.getUser().getRole().equals("ROLE_ADMIN")) { attributes.put("admin", user.getUser()); } } return true; } @Override public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) { System.out.println("인터셉터 afterHandshake"); } }
js
const orderNum = "${orderNum}"; let ws = new WebSocket("ws://localhost:8080/chating"); ws.onopen = function(data){ //소켓이 열리면 동작 console.log("소켯 오픈"); ws.send(orderNum); } ws.onclose = function(event) { console.log("클로즈"); } ws.onerror = function(event) { console.log("에러"); }
'스프링부트' 카테고리의 다른 글
스프링부트+jsp로 배달사이트 만들기-04 mypage, 로그인페이지 만들기 (0) | 2021.12.04 |
---|---|
스프링부트+jsp로 배달사이트 만들기-03 메인페이지 만들기2(쿠키,세션으로 주소저장) (0) | 2021.12.04 |
스프링부트+jsp로 배달사이트 만들기-02 메인페이지 만들기1 (0) | 2021.12.03 |
스프링부트+jsp로 배달사이트 만들기-01 프로젝트 생성 (3) | 2021.12.03 |
JSON 변환하기 (Gson , json-simple) (0) | 2021.11.29 |