在实际的项目开发中,需要用到大屏的展示,大屏的项目对于数据的实时性要求比较高,因此不能用http的接口,需要长连接的数据推送,大屏的免手动刷新,实现数据的同步变动展示。这里主要使用SpringBoot集成webSocket实现数据的全局发送,指定用户发送,值得注意的是这里使用了Spring自带的握手拦截器获取前端传来的userId,与webSocket的会话进行绑定,用于长连接的身份区分。如下是设计思路和代码实现。
1. SpringBoot整合WebSocket(pom.xml引入相关的jar包)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
2.重写实现Spring框架的握手拦截器
这里主要是通过拦截webSocket的请求url,获取链接上的uid,放到map中,用于识别会话身份,方便做指定的消息推送。(如请求ws://localhost:8080/ws?uid=11111111)
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.HandshakeInterceptor;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
* 在Spring中提供了websocket拦截器,
*/
@Slf4j
@Component
public class MyHandshakeInterceptor implements HandshakeInterceptor {
/**
* 握手之前,若返回false,则不建立连接
*/
@Override
public boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> map) throws Exception {
//将用户id放入socket处理器的会话(webSocketSession)中
ServletServerHttpRequest request = (ServletServerHttpRequest) serverHttpRequest;
System.out.println(request.getURI());
HttpServletRequest servletRe