Spring Stomp WebSocket连接报错400 BAD_REQUEST求助
Spring Stomp WebSocket连接返回400错误排查
开发了一个基于Spring的Stomp WebSocket应用,使用Postman或wscat尝试连接时,收到错误提示:error : Unexpected server response : 400。注册、登录等其他端点均可正常工作,已在securityFilterChain和OncePerRequestFilter中添加大量日志,但未找到导致400响应的有效信息。
WebSocketConfig配置
@Override public void registerStompEndpoints(StompEndpointRegistry registry) { System.out.println("Registering Stomp Endpoints"); try { registry.addEndpoint("/chat-service") .setAllowedOrigins("*") .addInterceptors(new HandshakeDebugInterceptor()) .withSockJS(); System.out.println("Stomp Endpoints Registered Successfully"); } catch (Exception e) { System.out.println("Error registering Stomp Endpoints: " + e.getMessage()); } }
SecurityConfiguration配置
@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .csrf(AbstractHttpConfigurer::disable) .cors(Customizer.withDefaults()) .authorizeHttpRequests((authorize) -> { authorize .requestMatchers("/api/auth/*").permitAll() .requestMatchers("/chat-service/**").permitAll() .requestMatchers("/admin/**").hasRole("ADMIN") //.anyRequest().authenticated(); .anyRequest().permitAll(); } ) .sessionManagement((configurer) -> { configurer.sessionCreationPolicy(SessionCreationPolicy.STATELESS); }) .authenticationProvider(authenticationProvider) .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class) .logout(Customizer.withDefaults() ); http.addFilterBefore((request, response, chain) -> { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; System.out.println("Request to: " + httpRequest.getRequestURI()); System.out.println("Method: " + httpRequest.getMethod()); System.out.println("Headers: " + httpRequest.getHeaderNames()); System.out.println("User Principal: " + httpRequest.getUserPrincipal()); System.out.println("Authentication: " + SecurityContextHolder.getContext().getAuthentication()); chain.doFilter(httpRequest, httpResponse); }, UsernamePasswordAuthenticationFilter.class); return http.build(); }
使用wscat连接时的服务器日志
执行命令:wscat -c ws://localhost:8081/chat-service,服务器日志如下:
: Securing GET /chat-service Request to: /chat-service Method: GET Headers: org.springframework.security.web.firewall.StrictHttpFirewall$StrictFirewalledRequest$2@5118325e User Principal: null Authentication: null 2024-04-01T21:11:26.365+03:00 DEBUG 21456 --- [messenger] [nio-8081-exec-7] o.s.s.w.a.AnonymousAuthenticationFilter : Set SecurityContextHolder to anonymous SecurityContext 2024-04-01T21:11:26.366+03:00 DEBUG 21456 --- [messenger] [nio-8081-exec-7] o.s.security.web.FilterChainProxy : Secured GET /chat-service 2024-04-01T21:11:26.367+03:00 INFO 21456 --- [messenger] [nio-8081-exec-7] c.m.m.c.RequestResponseLoggingFilter : Request: GET /chat-service 2024-04-01T21:11:26.367+03:00 DEBUG 21456 --- [messenger] [nio-8081-exec-7] o.s.web.servlet.DispatcherServlet : GET "/chat-service", parameters={} 2024-04-01T21:11:26.368+03:00 DEBUG 21456 --- [messenger] [nio-8081-exec-7] o.s.web.servlet.DispatcherServlet : Completed 400 BAD_REQUEST 2024-04-01T21:11:26.369+03:00 INFO 21456 --- [messenger] [nio-8081-exec-7] c.m.m.c.RequestResponseLoggingFilter : Response: 400 null
内容的提问来源于stack exchange,提问作者Anatoliy
相关产品推荐
相关产品推荐

