spring-boot - 会话的用户与请求的用户不匹配
问题描述
我正在尝试从一个工作示例中复制,但是,我的 Websocket 几乎可以连接,但由于“会话的用户与请求的用户不匹配”而失败。主题中的错误在 Spring Boot 方面;客户端是 Angular 上的 SockJS/StompJS。
这些是每个网络选项卡的调用,我猜是在连接被提升为真正的 websocket 之前:
200 GET https://localhost:8081/rules/ws/info?t=1628570085372
200 POST https://localhost:8081/rules/ws/943/b2fcvaup/xhr_streaming?t=1628570087697
404 POST https://localhost:8081/rules/ws/943/b2fcvaup/xhr_send?t=1628570087959
Spring Boot 日志片段
2021-08-10 00:34:47 INFO c.i.c.s.c.r.s.jwt.JwtTokenFilter - @@@ JwtTokenFilter on URL: https://localhost:8081/ws/943/b2fcvaup/xhr_streaming
2021-08-10 00:34:47 DEBUG o.s.web.servlet.DispatcherServlet - POST "/ws/943/b2fcvaup/xhr_streaming?t=1628570087697", parameters={masked}
2021-08-10 00:34:47 DEBUG o.s.w.s.s.s.WebSocketHandlerMapping - Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@98be09f
2021-08-10 00:34:47 DEBUG o.s.w.s.s.t.h.DefaultSockJsService - Processing transport request: POST https://localhost:8081/ws/943/b2fcvaup/xhr_streaming?t=1628570087697
2021-08-10 00:34:47 DEBUG o.s.w.s.s.t.h.XhrStreamingTransportHandler - POST https://localhost:8081/ws/943/b2fcvaup/xhr_streaming?t=1628570087697
2021-08-10 00:34:47 DEBUG o.s.w.s.h.LoggingWebSocketHandlerDecorator - New XhrStreamingSockJsSession[id=b2fcvaup]
2021-08-10 00:34:47 DEBUG o.s.web.servlet.DispatcherServlet - Completed 200 OK
2021-08-10 00:34:48 INFO c.i.c.s.c.r.s.jwt.JwtTokenFilter - @@@ JwtTokenFilter on URL: https://localhost:8081/ws/943/b2fcvaup/xhr_send
2021-08-10 00:34:48 INFO c.i.c.s.c.r.s.jwt.JwtTokenFilter - SimpleCorsFilter doFilter()
2021-08-10 00:34:48 INFO c.i.c.s.c.r.s.jwt.JwtTokenFilter - SimpleCorsFilter.doFilter https://localhost:8081/ws/943/b2fcvaup/xhr_send sec-fetch-site:same-origin
2021-08-10 00:34:48 INFO c.i.c.s.c.r.s.jwt.JwtTokenFilter - SimpleCorsFilter.doFilter https://localhost:8081/ws/943/b2fcvaup/xhr_send sec-fetch-mode:cors
2021-08-10 00:34:48 INFO c.i.c.s.c.r.s.jwt.JwtTokenFilter - SimpleCorsFilter.doFilter https://localhost:8081/ws/943/b2fcvaup/xhr_send sec-fetch-dest:empty
2021-08-10 00:34:48 INFO c.i.c.s.c.r.s.jwt.JwtTokenFilter - SimpleCorsFilter.doFilter https://localhost:8081/ws/943/b2fcvaup/xhr_send cookie:_dvp=0:knao8n9x:ueQI~8QHCJCZqEz1PKsFuAFqAuwmUdWO; connect.sid=s%3A0PybWcqMScr8PgBCu5QDqv0FWUofy-Ob.eo2YAp2e6X%2Bf%2BrQHyHDs%2Bq74QyN9qPXUX8x%2BleqM1YE; 368b7883bb173c2e7ce35c0973392d07=0816943ee1359cee78b63cb442c24aaa; _dvs=0:ks5eeyuv:7~D3dEqFIdI39xqBbkQWOEPio4PT0S3q
2021-08-10 00:34:48 INFO c.i.c.s.c.r.s.jwt.JwtTokenFilter - SimpleCorsFilter.doFilter https://localhost:8081/ws/943/b2fcvaup/xhr_send referer:https://localhost:8081/sprint-cost-recovery/softlayer-process
2021-08-10 00:34:48 INFO c.i.c.s.c.r.s.jwt.JwtTokenFilter - SimpleCorsFilter.doFilter https://localhost:8081/ws/943/b2fcvaup/xhr_send connection:keep-alive
2021-08-10 00:34:48 INFO c.i.c.s.c.r.s.jwt.JwtTokenFilter - SimpleCorsFilter.doFilter https://localhost:8081/ws/943/b2fcvaup/xhr_send origin:https://localhost:8081
2021-08-10 00:34:48 INFO c.i.c.s.c.r.s.jwt.JwtTokenFilter - SimpleCorsFilter.doFilter https://localhost:8081/ws/943/b2fcvaup/xhr_send content-length:69
2021-08-10 00:34:48 INFO c.i.c.s.c.r.s.jwt.JwtTokenFilter - SimpleCorsFilter.doFilter https://localhost:8081/ws/943/b2fcvaup/xhr_send content-type:text/plain
2021-08-10 00:34:48 INFO c.i.c.s.c.r.s.jwt.JwtTokenFilter - SimpleCorsFilter.doFilter https://localhost:8081/ws/943/b2fcvaup/xhr_send accept-encoding:gzip, deflate, br
2021-08-10 00:34:48 INFO c.i.c.s.c.r.s.jwt.JwtTokenFilter - SimpleCorsFilter.doFilter https://localhost:8081/ws/943/b2fcvaup/xhr_send accept-language:en-US,en;q=0.5
2021-08-10 00:34:48 INFO c.i.c.s.c.r.s.jwt.JwtTokenFilter - SimpleCorsFilter.doFilter https://localhost:8081/ws/943/b2fcvaup/xhr_send accept:*/*
2021-08-10 00:34:48 INFO c.i.c.s.c.r.s.jwt.JwtTokenFilter - SimpleCorsFilter.doFilter https://localhost:8081/ws/943/b2fcvaup/xhr_send user-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0
2021-08-10 00:34:48 INFO c.i.c.s.c.r.s.jwt.JwtTokenFilter - SimpleCorsFilter.doFilter https://localhost:8081/ws/943/b2fcvaup/xhr_send host:localhost:8081
2021-08-10 00:34:48 INFO c.i.c.s.c.r.s.jwt.JwtTokenFilter - SimpleCorsFilter.doFilter https://localhost:8081/ws/943/b2fcvaup/xhr_send authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzcHJpbnQtbWlkZGxld2FyZS1pc3N1ZXIiLCJzdWIiOiJCZW4uUHJhY2h0MUBpYm0uY29tIiwibm90ZXNJZCI6IkJlbiBQcmFjaHQiLCJzZXJpYWxOdW0iOiI4Njc1NTU4OTciLCJleHAiOjE2Mjg1NzcyNjcsImJsdWVHcm91cHMiOlsiQkxVRUNPU1RfU1BSRUFEU0hFRVRfVVBMT0FEX1RFU1QiXSwiaWF0IjoxNjI4NTcwMDg3fQ.FwfnshljmQscqnu8T3o2AS29cDgzpRWa7T62ZKmAUMQ
2021-08-10 00:34:48 INFO c.i.c.s.c.r.s.jwt.JwtTokenFilter - @@@ JwtTokenFilter on URL: https://localhost:8081/ws/943/b2fcvaup/xhr_send
2021-08-10 00:34:48 DEBUG o.s.web.servlet.DispatcherServlet - POST "/ws/943/b2fcvaup/xhr_send?t=1628570087959", parameters={masked}
2021-08-10 00:34:48 DEBUG o.s.w.s.s.s.WebSocketHandlerMapping - Mapped to org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@98be09f
2021-08-10 00:34:48 DEBUG o.s.w.s.s.t.h.DefaultSockJsService - Processing transport request: POST https://localhost:8081/ws/943/b2fcvaup/xhr_send?t=1628570087959
2021-08-10 00:34:48 DEBUG o.s.w.s.s.t.h.DefaultSockJsService - The user for the session does not match the user for the request.
2021-08-10 00:34:48 DEBUG o.s.web.servlet.DispatcherServlet - Completed 404 NOT_FOUND
进行 SockJS 调用的 Angular 代码片段:
const socket = new SockJS('https://localhost:8081/rules/ws');
var costFileClient = Stomp.over(socket);
if(costFileClient!=null) {
console.log('@@@ costFileClient not null');
} else {
console.log('@@@ costFileClient is null');
}
console.log('Before webService connect');
var success_function = function(message) {
console.log('Success '+message);
};
var error_function = function(message) {
console.log('Error '+message);
};
costFileClient.connect({},success_function,error_function);
costFileClient.disconnect();
/* Connect Error Callback*/
console.log('After webService connect');
WebSocketConfig.java
@Configuration
@EnableWebSocket
@Controller
@EnableWebSocketMessageBroker
public class WebSocketConfig
implements WebSocketConfigurer, WebSocketMessageBrokerConfigurer {
private static final Logger logger = LoggerFactory.getLogger(WebSocketConfig.class);
@Autowired
CostFileUploadWebSocketHandler costFileUploadWebSocketHandler;
/*
@Override
protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
messages.anyMessage().authenticated();
}
@Override
protected boolean sameOriginDisabled() {
return true;
}
*/
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
logger.info("In registerWebSocketHandlers");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
logger.info("In registerStompEndpoints");
registry
.addEndpoint("/ws")
.setAllowedOrigins("https://localhost:8448","https://localhost:8081") /* Removed * */
.withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
logger.info("In configureMessageBroker");
config.enableSimpleBroker("/topic/");
}
}
WebSocketController.java
@Controller
public class WebSocketController {
private static final Logger logger = LoggerFactory.getLogger(WebSocketController.class);
@Autowired
private SimpMessageSendingOperations messagingTemplate;
@MessageMapping("/bluecost/ws")
@SendTo("/topic/softlayer-cost-file")
public String processMessageFromClient(@Payload String message) throws Exception {
logger.info("Reached WebSocketController.processMessageFromClient()");
ObjectMapper mapper = new ObjectMapper();
String name = mapper.readValue(message,Map.class).get("name").toString();
return name;
}
@MessageExceptionHandler
public String handleException(Throwable exception) {
logger.info("Reached WebSocketController.handleException()");
messagingTemplate.convertAndSend("/errors", exception.getMessage());
return exception.getMessage();
}
}
解决方案
推荐阅读
- python - python asyncio REST api调用给出错误
- java - 在 netbeans 8.2 的计算机上找不到 JDK
- scala - 使用字典scala替换df中的字符串
- jquery - jQuery Validate:使用 Select2 清除单个/特定字段错误
- r - auto.arima 输出零值作为 R 中的输出
- performance - React-Native 中动态样式的最高效方式是什么?
- angular - 另一个模块使用的组件而不导出
- javascript - 在 Firebase 存储中为文件创建 readStream
- javascript - javascript中颜色这个词的含义是什么
- driver - VID 和 PID(如何获取产品 ID)