2017-12-21 1 views
0

스프링 응용 프로그램이 있습니다.스프링 websocket upgraderequest

초기 핸드 셰이크에 값을 입력해야합니다. 내 웹 소켓 핸들러에서이 key=value 필요 ws://localhost:8080/chat?key=value

: 같은

URL입니다 보인다.

어떻게 액세스 할 수 있습니까?

웹 소켓 구성 :

@Configuration 
@EnableWebSocket 
public class WebSocketConfig implements WebSocketConfigurer { 

    @Override 
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { 
     // alle origins erlauben 
     registry.addHandler(chatWebSocketController(), "/chat").addInterceptors(new HttpSessionHandshakeInterceptor()) 
      .setAllowedOrigins("*"); 
    } 

    @Bean 
    public ChatWebSocketController chatWebSocketController() { 
     return new ChatWebSocketController(); 
    } 
} 

웹 소켓 처리기 방법 :

@Override 
public void afterConnectionEstablished(WebSocketSession session) throws Exception { 

    if (session.getAttributes().containsKey("key")) { 
     List<String> userMap = session.getHandshakeHeaders().get("key"); 
     JwtTokenUtil jwtTokenUtil = new JwtTokenUtil(); 
     String token = userMap.get(0); 
     if (jwtTokenUtil.validateToken(token)) { 
      User userToStore = new User(jwtTokenUtil.getUsernameFromToken(token)); 
      userUsernameMap.put(session, userToStore); 
      LOGGER.info("User with name " + jwtTokenUtil.getUsernameFromToken(token) + "and IP " 
        + session.getRemoteAddress() + " successfully connected"); 
      sendConnectMessage(session, userToStore); 

     } 
    } else { 
     session.close(CloseStatus.POLICY_VIOLATION); 
    } 
} 

답변

0

혼자 해결책을 발견. 자신 만의 HandshakeInterceptor를 작성해야합니다. http 매개 변수에 액세스 할 수 있습니다. 그래서 이것을 당신의 attribbutes 맵에 넣을 수 있습니다.

public class HttpHandshakeInterceptor implements HandshakeInterceptor { 

@Override 
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, 
     Map<String, Object> attributes) throws Exception { 
    if (request instanceof ServletServerHttpRequest) { 
     ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request; 
     HttpSession session = servletRequest.getServletRequest().getSession(); 
     attributes.put("sessionId", session.getId()); 
     attributes.put("key", servletRequest.getServletRequest().getParameterMap().get("key")); 
    } 
    return true; 
} 

@Override 
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, 
     Exception exception) { 
    //nothing to do 
} 

} 
관련 문제