카테고리 없음

웹소켓 열 때 http세션정보 가져오기

백봉 2024. 8. 28. 10:36

웹소켓 열 때 헤더에 토큰을 넣으면 좋겠지만

현재는 레디스 세션을 이용하고있다. 

 

웹소켓도 http로 시작을 하기 때문에 업그레이드가 되기 전 http 세션Id를 웹소켓 세션에 담으면 된다. 

 

1. 이 용도로 사용할 인터셉터를 만든다. 

@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, 
	WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
	HttpServletRequest servletRequest = ((ServletServerHttpRequest) request).getServletRequest();
    HttpSession session = servletRequest.getSession(false);
    if (session != null) {
        attributes.put("httpSessionId", session.getId());
    }
    return true;
}

 

2. 인터셉터를 소켓 핸들러에 붙인다. 

@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
    // 첫 번째 핸들러에는 인터셉터를 추가하지 않음
    registry.addHandler(webSocketHandler(), "/ws")
            .setAllowedOrigins("*");
    // 두 번째 핸들러에만 인터셉터 추가
    registry.addHandler(mainWebSocketHandler(), "/ws/main/eventListTop5")
            .addInterceptors(mainHandshakeInterceptor())
            .setAllowedOrigins("*");
}

 

3. 원하는 곳에서 세션을 가져온다.

@Autowired
private SessionRepository sessionRepository

public Session getSessionById(String sessionId) {
	return sessionRepository.findById(sessionId);
}