千家信息网

spring WebSocket入口以及拦截器的实现方法

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍"spring WebSocket入口以及拦截器的实现方法",在日常操作中,相信很多人在spring WebSocket入口以及拦截器的实现方法问题上存在疑惑,小编查阅了各式资料,整理
千家信息网最后更新 2026年10月31日spring WebSocket入口以及拦截器的实现方法

这篇文章主要介绍"spring WebSocket入口以及拦截器的实现方法",在日常操作中,相信很多人在spring WebSocket入口以及拦截器的实现方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"spring WebSocket入口以及拦截器的实现方法"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

+

一、POM依赖

POM依赖,spring4.1.4.RELEASE,spring核心依赖请自行添加,下面是websocket相关jar

    javax.websocket    javax.websocket-api    1.0    provided    org.springframework    spring-websocket    4.1.4.RELEASE

二、WebSocket入口

@Configuration@EnableWebMvc@EnableWebSocketpublic class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {    @Override    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {        //允许连接的域,只能以http或https开头        String[] allowsOrigins = {"http://www.xxx.com"};               //WebIM WebSocket通道        registry.addHandler(chatWebSocketHandler(),"/           webSocketIMServer").setAllowedOrigins(allowsOrigins).addInterceptors(myInterceptor());        registry.addHandler(chatWebSocketHandler(), "/sockjs/w          ebSocketIMServer").setAllowedOrigins(allowsOrigins).addInterceptors(myInterceptor()).withSockJS();    }    @Bean    public ChatWebSocketHandler chatWebSocketHandler() {        return new ChatWebSocketHandler();    }    @Bean    public WebSocketHandshakeInterceptor myInterceptor(){        return new WebSocketHandshakeInterceptor();    }}
  1. 实现WebSocketConfigurer接口,重写registerWebSocketHandlers方法,这是一个核心实现方法,配置websocket入口,允许访问的域、注册Handler、SockJs支持和拦截器。

  2. registry.addHandler注册和路由的功能,当客户端发起websocket连接,把/path交给对应的handler处理,而不实现具体的业务逻辑,可以理解为收集和任务分发中心。

  3. setAllowedOrigins(String[] domains),允许指定的域名或IP(含端口号)建立长连接,如果只允许自家域名访问,这里轻松设置。如果不限时使用"*"号,如果指定了域名,则必须要以http或https开头。

  4. addInterceptors,顾名思义就是为handler添加拦截器,可以在调用handler前后加入我们自己的逻辑代码。

  5. spring websocket也支持STOMP协议,下回再分享。

三、拦截器实现

public class WebSocketHandshakeInterceptor implements HandshakeInterceptor {    @Override    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map attributes) throws Exception {        if (request instanceof ServletServerHttpRequest) {            attributes.put("username",userName);        }        return true;    }    @Override    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {    }}

beforeHandshake,在调用handler前处理方法。常用在注册用户信息,绑定WebSocketSession,在handler里根据用户信息获取WebSocketSession发送消息。

四、Handler处理类

public class ChatWebSocketHandler extends TextWebSocketHandler{        private final static List sessions = Collections.synchronizedList(new ArrayList());    //接收文本消息,并发送出去    @Override    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {        chatTextMessageHandler(message.getPayload());        super.handleTextMessage(session, message);    }    //连接建立后处理    @SuppressWarnings("unchecked")    @Override    public void afterConnectionEstablished(WebSocketSession session) throws Exception {        logger.debug("connect to the websocket chat success......");        sessions.add(session);        //处理离线消息    }    //抛出异常时处理    @Override    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {        if(session.isOpen()){            session.close();        }        logger.debug("websocket chat connection closed......");        sessions.remove(session);    }    //连接关闭后处理    @Override    public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {        logger.debug("websocket chat connection closed......");        sessions.remove(session);    }    @Override    public boolean supportsPartialMessages() {        return false;    }}

五、客户端连接

var host = _window.location.host;var websocket;if ('WebSocket' in window) {    websocket = new ReconnectingWebSocket("ws://"        + host + "/webSocketIMServer", null, {debug:true, maxReconnectAttempts:4});} else if ('MozWebSocket' in window) {    websocket = new MozWebSocket("ws://" + host        + "/webSocketIMServer");} else {    websocket = new SockJS("http://" + host            + "/sockjs/webSocketIMServer");}websocket.onopen = function(evnt) {    console.log("websocket连接上");};websocket.onmessage = function(evnt) {    messageHandler(evnt.data);};websocket.onerror = function(evnt) {    console.log("websocket错误");};websocket.onclose = function(evnt) {    console.log("websocket关闭");}

这里用到了ReconnectingWebSocket.js,对浏览器自带websocket添加了扩展,例如重连,连接超时时间,失败重连间隔,尝试连接最大次数等。

到此,关于"spring WebSocket入口以及拦截器的实现方法"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

0