【问题标题】:Spring websocket upgraderequestSpring websocket 升级请求
【发布时间】:2018-06-03 14:35:33
【问题描述】:

我有一个 spring 应用程序。

我需要为初始握手设置一个值。

网址看起来像:ws://localhost:8080/chat?key=value

我在我的 Websocket 处理程序中需要这个 key=value

如何访问它?

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

【问题讨论】:

    标签: java spring spring-mvc websocket stomp


    【解决方案1】:

    自己找到了解决方案。您必须编写自己的 HandshakeInterceptor,在那里您可以访问 http 参数。所以你可以把它放到你的属性图中。

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

    【讨论】:

      猜你喜欢
      • 2018-09-22
      • 1970-01-01
      • 2014-06-24
      • 1970-01-01
      • 1970-01-01
      • 2014-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多