Spring boot stomp websocket spring boot 2中的自定义错误消息

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

我使用SpringBoot2WebSocket+SockJS+STOMP

当客户端以
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));
    }
}