웹 소켓 기본
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 |