웹 소켓 기본

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("에러");
			}