springWebsocket

本文介绍如何使用 Spring 框架集成 WebSocket 技术,包括 Maven 配置、WebSocket 核心配置文件、消息处理类及自定义拦截器的实现方式。同时提供了前端调用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

教程 
一:jar包

maven配置 

< dependency >
    < groupId >javax.websocket </ groupId >
    < artifactId >javax.websocket-api </ artifactId >
    < version >1.1 </ version >
    < scope >provided </ scope >
</ dependency >
< dependency >
    < groupId >org.springframework </ groupId >
    < artifactId >spring-websocket </ artifactId >
    < version >4.1.6.RELEASE </ version >
</ dependency >


注意:spring-websocket的包版本要与spring的包版本保持一致,不然可能在项目启动的时候回报错;

一:.WebSocketConfig.java (websocket核心配置文件,可以配置websocket的映射路径,监听等功能)
内容代码如下
@Configuration
@ComponentScan (basePackages = { "com.config.websocket" } )
@EnableWebSocket
public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {
    @Resource
    MyWebSocketHandler handler ;

    public void registerWebSocketHandlers ( WebSocketHandlerRegistry registry ) {

        registry .addHandler ( handler , "/ws.json" ) .addInterceptors ( new HandShake ()) .setAllowedOrigins ( "*" ) ;

        registry .addHandler ( handler , "/ws/sockjs" ) .addInterceptors ( new HandShake ()) .withSockJS () ;

    }

}
 @Configuration     指明该类为Spring 配置类
 @EnableWebSocket  声明该类支持WebSocket
红色方框表示 handler(消息处理对象)位置;
红色横线表示将ws:hostPath/ws.json的请求映射到handle消息处理类中; 注意:配置路径时候注意项目springMvc的捕获请求的路径,不然在项目中会找不到请求,我的项目中springmvc后缀为json所以是/ws.json;
荧光绿波浪线表示注册自定义的拦截器的位置;拦截器是SpringWebsocket提供的功能,并非websocket所必须的配置,可自行根据业务进行选择是否配置;
黄色横线  setAllowedOrigins方法用来设置来自那些域名的请求可访问,默认为localhost ,不设置的话socket链接的时候会被拒绝:提示  Unexpected response code: 403;(深坑)

二: MyWebSocketHandler.java(消息处理类,实现 WebSocketHandler接口,里面有socket声明周期的所有方法
对应链接,建立,前台发送消息,链接关闭等方法 都是相应api 没有什么很奇怪的点;后台向浏览器推送消息,就使用WebSocketSession的sendMessage方法
三:自定义的拦截器;
public class HandShake implements HandshakeInterceptor {
    public boolean beforeHandshake ( ServerHttpRequest request , ServerHttpResponse response , WebSocketHandler wsHandler , Map < String , Object > attributes ) throws Exception {
//        System.out.println("Websocket:用户[ID:" + ((ServletServerHttpRequest) request).getServletRequest().getSession(false).getAttribute("uid") + "]已经建立连接");
//        if (request instanceof ServletServerHttpRequest) {
//            ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
//            HttpSession session = servletRequest.getServletRequest().getSession(false);
//            // 标记用户
//            Long uid = (Long) session.getAttribute("uid");
//            if(uid!=null){
//                attributes.put("uid", uid);
//            }else{
//                return false;
//            }
//        }
        System . out .println ( "拦截器拦截到ws请求" ) ;
        return true ;
    }

    public void afterHandshake ( ServerHttpRequest request , ServerHttpResponse response , WebSocketHandler wsHandler , Exception exception ) {
    }

}

实现HandshakeInterceptor接口,实现 beforeHandshake方法,true表示放行请求,可以进行权限或者公共信息处理;


前台调用的代码
var websocket;
if ('WebSocket' in window) {
websocket = new WebSocket("ws://" + path + "/ws?uid="+uid);
} else if ('MozWebSocket' in window) {
websocket = new MozWebSocket("ws://" + path + "/ws"+uid);
} else {
websocket = new SockJS("http://" + path + "/ws/sockjs"+uid);
}
websocket.onopen = function(event) {
console.log("WebSocket:已连接");
console.log(event);
};
websocket.onmessage = function(event) {
var data=JSON.parse(event.data);
console.log("WebSocket:收到一条消息",data);

};
websocket.onerror = function(event) {
console.log("WebSocket:发生错误 ");
console.log(event);
};
websocket.onclose = function(event) {
console.log("WebSocket:已关闭");
console.log(event);
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值