若依框架接入WebSocket(附带吐槽)

当你向ai询问,java如何接入websocket时,ai会甩给你一套@ServerEndPoint的组合拳。

当你库库库使用注解轻松完成了websocket的接入时,可能会洋洋得意😊:这注解也太好用了,这么轻松就能完成接入,甚至不需要实现接口!

可是,当你开始运行程序的时候,突然发现:卧槽!我好像没有添加鉴权!

于是当你库库加了一堆的Bean,企图使用这些Bean来解析token,然后一顿操作,将token解析完毕,觉得自己的操作无比帅气😎。

可是,当你开始运行的时候,突然发现:?

Bean注入失效?

开什么玩笑?

image

然后疯狂拷打ai,可是ai的狗嘴里吐不出象牙来,只能给你幻觉答案。

迫不得已,只好求助度娘。

得到了一下答案:

=============================== 正文 ==========================================

@ServerEndPoint那一套是过时做法,是Java官方自带的web组件

而Spring则提供了一套附属于Spring的组件:

一、Configuration


@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Autowired
    private WebSocketUtil webSocketUtil;
    @Autowired
    private WebSocketInterceptor webSocketInterceptor;

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(webSocketUtil, "/ws")//设置连接路径和处理
                .setAllowedOrigins("*")
                .addInterceptors(webSocketInterceptor);//设置拦截器,没有多种websocket,不需要添加这种玩意
    }

}

二、WebSocketHandler,需要实现WebSocketHandler接口


@Slf4j
@Component
public class WebSocketUtil implements WebSocketHandler {

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
    }

    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
    }

    @Override
    public boolean supportsPartialMessages() {
        return false;
    }

    @Override
    public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
    }

}

在这个handler中,我们可以尽情的进行注入Bean,不用害怕发生Bean注入失效的问题。

ok,后端的问题解决了,我们应该如何在前端给请求添加上token呢?

如果此时,你去问ai,ai会给你倒出大便方式:添加ws依赖,然后使用ws中的WebSocket类即可添加请求头。

如果你信了,然后去一顿操作,就可以得到一个报错:

Error in mounted hook: "Error: ws does not work in the browser. Browser clients must use the native WebSocket object"

浏览器只支持原生的WebSocket对象,引入的ws瞬间变成了一个小丑🤡

疯狂拷打ai,他也只会让你在使用ws和删掉ws之间疯狂横跳

正确的方法其实应该是,直接给ws的连接请求路径中,添加参数:

ws_url = ws_url + "?token=Bearer " + getToken();

这样,只需要在后端的WebSocketSession中获取URI,然后就可以轻松解析了。

作者血泪的教训告诉我们,有的时候不能依赖ai,😭

posted @ 2026-01-30 15:33  报废之人  阅读(1)  评论(0)    收藏  举报