웹소켓 열 때 헤더에 토큰을 넣으면 좋겠지만
현재는 레디스 세션을 이용하고있다.
웹소켓도 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);
}