Spring boot stomp websocket spring boot 2中的自定义错误消息
我使用SpringBoot2WebSocket+SockJS+STOMP 当客户端以Spring boot stomp websocket spring boot 2中的自定义错误消息,spring-boot,error-handling,spring-websocket,stomp,Spring Boot,Error Handling,Spring Websocket,Stomp,我使用SpringBoot2WebSocket+SockJS+STOMP 当客户端以ChannelInterceptor的preSend方法连接时,我拥有JWT授权 @Component public class WebSocketChannelInterceptor implements ChannelInterceptor { private final TokenUtils tokenUtils; private final AuthenticationManager
ChannelInterceptor
的preSend
方法连接时,我拥有JWT授权
@Component
public class WebSocketChannelInterceptor implements ChannelInterceptor {
private final TokenUtils tokenUtils;
private final AuthenticationManager websocketAuthenticationManager;
private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketChannelInterceptor.class);
public WebSocketChannelInterceptor(TokenUtils tokenUtils, AuthenticationManager websocketAuthenticationManager) {
this.tokenUtils = tokenUtils;
this.websocketAuthenticationManager = websocketAuthenticationManager;
}
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
LOGGER.info("WEBSOCKETCHANNELINTERCEPTOR -> "+message.toString());
StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
if (accessor != null && StompCommand.CONNECT.equals(accessor.getCommand())) {
List<String> headers = accessor.getNativeHeader(AUTHORIZATION);
accessor.setUser(websocketAuthenticationManager.authenticate(new JWTTokenAuthentication(tokenUtils.resolveToken(headers != null ? headers.get(0) : null))));
}
return message;
}
@Override
public boolean preReceive(MessageChannel channel) {
LOGGER.info("preReceive");
return true;
}
}
如何更改代码以发送带有有效负载的错误消息
谢谢。您可以使用有效负载和标题构建可变消息:
new MutableMessage<String>("payload", headers);
新的可变消息(“有效负载”,标题);
查看类MutableMessage中的构造函数:
public MutableMessage(T payload, Map<String, Object> headers) {
Assert.notNull(payload, "payload must not be null");
this.payload = payload;
this.headers = new MutableMessageHeaders(headers);
if (headers != null) {
this.headers.put(MessageHeaders.ID, headers.get(MessageHeaders.ID));
this.headers.put(MessageHeaders.TIMESTAMP, headers.get(MessageHeaders.TIMESTAMP));
}
}
public-MutableMessage(T有效载荷、映射头){
notNull(有效载荷,“有效载荷不得为空”);
这个有效载荷=有效载荷;
this.headers=新的可变消息头(headers);
如果(标题!=null){
this.headers.put(MessageHeaders.ID,headers.get(MessageHeaders.ID));
this.headers.put(MessageHeaders.TIMESTAMP,headers.get(MessageHeaders.TIMESTAMP));
}
}
STOMP注册表中有一个专用的setter:
@配置
@EnableWebSocketMessageBroker
类WebSocketConfiguration:WebSocketMessageBrokerConfiguration{
覆盖配置MessageBroker(注册表:MessageBrokerRegistry){
// ...
}
覆盖趣味注册表TompendPoints(注册表:StompEndpointRegistry){
registry.addEndpoint(“/ws”)
//在拦截器和Spring库本身中处理异常。
//将终止连接并向客户端发送错误帧。
setErrorHandler(对象:stompsubtocolerrorhandler(){
覆盖有趣的handleInternal(
errorHeaderAccessor:StompHeaderAccessor,
错误有效载荷:ByteArray,
原因:可丢弃?,
主持人:主持人主持人?
):信息{
errorHeaderAccessor.message=null
val message=“…”
返回MessageBuilder.createMessage(message.toByteArray(),errorHeaderAccessor.messageHeaders)
}
})
}
}
你是指带有有效负载的可变消息吗?@Francescreio是的。我已经在WebsocketAuthenticationManager
类中的throwBadCredentialsException
方法中使用了这个。但它仍然不起作用。如果用户凭据不正确,我需要在websocketchannelterceptor
中抛出异常。我做了这个,但我的信息并没有发送给客户。你们用的是什么库?MutableMessage maven依赖项请MutableMessage
来自spring boot starter integration
new MutableMessage<String>("payload", headers);
public MutableMessage(T payload, Map<String, Object> headers) {
Assert.notNull(payload, "payload must not be null");
this.payload = payload;
this.headers = new MutableMessageHeaders(headers);
if (headers != null) {
this.headers.put(MessageHeaders.ID, headers.get(MessageHeaders.ID));
this.headers.put(MessageHeaders.TIMESTAMP, headers.get(MessageHeaders.TIMESTAMP));
}
}