2017-12-21 7 views
0

私は春のアプリケーションがあります。Spring websocket upgraderequest

初期ハンドシェイクに値を入れる必要があります。私は私のWebSocketハンドラでこのkey=valueが必要ws://localhost:8080/chat?key=value

:よう

URLが見えます。

どうすればアクセスできますか?

のWebSocket構成:

@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(); 
    } 
} 

のWebSocketハンドラメソッド:

@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 
} 

} 
関連する問題