java - 带有拦截器的 Spring Websocket 在连接关闭时执行 preSend

标签 java spring websocket

我正在使用拦截器来获取授权 header ,但在建立连接和关闭连接时都会执行 presend 方法。问题是,当它关闭时, header 会抛出 null 异常,我应该首先检查 null 还是有更好的方法来停止连接,以便不执行 preSend 方法?我的配置:

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry
            .addEndpoint("/api/chat/message")
            .setAllowedOrigins("*");
}
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
    registration.interceptors(getWebSocketInterceptor());
}
private WebSocketInterceptor getWebSocketInterceptor(){
    return new WebSocketInterceptor();
}

我的WebSocket拦截器:

public class WebSocketInterceptor implements ChannelInterceptor, HandshakeInterceptor {

    @Override
    public Message<?> preSend(Message<?> message, MessageChannel channel) {
        MessageHeaders headers = message.getHeaders();
        MultiValueMap<String, String> multiValueMap = headers.get(StompHeaderAccessor.NATIVE_HEADERS,MultiValueMap.class);
            for(Map.Entry<String, List<String>> head : multiValueMap.entrySet()) {
            System.out.println(head.getKey());
            if(head.getKey().equals("Authorization")){
                System.out.println(head.getValue());
            }
        }
        return message;
    }

最佳答案

我发现如何检查 preSend 中的连接类型,并且只从 StompHeaderAccessor 中获取 header :

StompHeaderAccessor accessor =
        MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);

if (StompCommand.CONNECT.equals(accessor.getCommand())) {
    List<String> authorization1 = accessor.getNativeHeader("Authorization");
}

关于java - 带有拦截器的 Spring Websocket 在连接关闭时执行 preSend,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56757856/

相关文章:

C# HTML5 Websocket 服务器

java - 无法在 Java 中使用两个 for 循环单独取出

java - Spring MVC Controller 已达到,但我仍然得到 404

java - spring-session是否用HttpSession保存bean?

java - 我可以在同一应用程序上下文中同时使用动态代理和 CGLib 代理吗?

java - 索引@MultiField spring-data-elasticsearch。国际化目的

java - 浏览器和 postman 返回结果,但 Resttemplate 由于 %26 返回 0 个结果

django - 在 django 中启用 keep-alive 以实现持久连接

java - 如何从 HashMap 中的对象访问 ArrayList? java

在 websocket 中隧道化的 Android JSON-RPC