1、引入websocket的依赖
SpringBoot 的高级组件会自动引用基础的组件,像 spring-boot-starter-websocket 就引入了
spring-boot-starter-web 和 spring-boot-starter,所以不要重复引入,参考代码如下
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
2、编写握手拦截器
服务器端首先需要编写通信握手拦截器,该拦截器的作用就是在连接成功前和成功后增加一些额外的功能, 此处可记录当前建立连接的用户信息,用于定向信息发送的动能前提。具体代码如下
package com.spz.websocket;
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 javax.servlet.http.HttpSession;
import java.util.Map;
@Component
public class SpringBootHandshakeInterceptor implements HandshakeInterceptor {
/**
* 握手前
* @param serverHttpRequest 请求对象
* @param serverHttpResponse 响应对象
* @param webSocketHandler WebSocket服务处理类,在这里指的是SpringBootWebSocketHandler
* @param map map.getAttributes()
*/
@Override
public boolean beforeHandshake(ServerHttpRequest serverHttpRequest,
ServerHttpResponse serverHttpResponse,
WebSocketHandler webSocketHandler,
Map<String, Object> map) throws Exception {
ServletServerHttpRequest servletServerHttpRequest = (ServletServerHttpRequest) serverHttpRequest;
//得到Http协议的请求对象
HttpServletRequest request = servletServerHttpRequest.getServletRequest();
HttpSession session = request.getSession(true);
System.out.println("握手拦截器^^^^^^^^^^^^");
System.out.println("param=>"+request.getParameter("param"));
System.out.println("握手拦截器^^^^^^^^^^^^");
System.out.println("token=>"+request.getParameter("token"));
System.out.println("握手拦截器^^^^^^^^^^^^");
//数据中转 可以把http协议的会话对象数据中转到ws协议的会话对象中
map.put("param"