注意需要添加注解
@EnableAsync
配置
@Slf4j@Configuration@EnableWebSocketMessageBrokerpublic class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}/*** 注册STOMP协议的节点(endpoint) 将每个节点映射到一个特定的URL** @param registry*/@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {//建立连接端点,注册一个STOMP的协议节点,并指定使用SockJS协议registry.addEndpoint("/-websocket").setAllowedOrigins("*").setHandshakeHandler(new MyHandshakeHandler()).addInterceptors(new SessionAuthHandshakeInterceptor()).withSockJS();}}
拦截器
import lombok.extern.slf4j.Slf4j;import org.springframework.http.server.ServerHttpRequest;import org.springframework.http.server.ServerHttpResponse;import org.springframework.http.server.ServletServerHttpRequest;import org.springframework.web.socket.WebSocketHandler;import org.springframework.web.socket.server.HandshakeInterceptor;import javax.servlet.http.HttpSession;import java.util.Map;@Slf4jpublic class SessionAuthHandshakeInterceptor implements HandshakeInterceptor {@Overridepublic boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {HttpSession session = getSession(request);// if(session == null || session.getAttribute(Constants.SESSION_USER) == null){// log.error("websocket权限拒绝");//// return false;// throw new CmiException("websocket权限拒绝");// }// attributes.put(Constants.WEBSOCKET_USER_KEY,session.getAttribute(Constants.SESSION_USER));return true;}@Overridepublic void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {}private HttpSession getSession(ServerHttpRequest request) {if (request instanceof ServletServerHttpRequest) {ServletServerHttpRequest serverRequest = (ServletServerHttpRequest) request;return serverRequest.getServletRequest().getSession(false);}return null;}}
处理器
import com.tinet.assistant.gateway.api.entity.UserSession;import org.apache.commons.lang3.StringUtils;import org.springframework.http.HttpHeaders;import org.springframework.http.server.ServerHttpRequest;import org.springframework.http.server.ServletServerHttpRequest;import org.springframework.web.socket.WebSocketHandler;import org.springframework.web.socket.server.support.DefaultHandshakeHandler;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import java.security.Principal;import java.util.Map;import java.util.Objects;/*** 握手处理** @author zhaojianyu*/public class MyHandshakeHandler extends DefaultHandshakeHandler {private final String sessionName = "session-assitant";@Overrideprotected Principal determineUser(ServerHttpRequest request, WebSocketHandler wsHandler,Map<String, Object> attributes) {HttpServletRequest servletRequest = ((ServletServerHttpRequest) request).getServletRequest();String userAgent = servletRequest.getHeader(HttpHeaders.USER_AGENT);if(StringUtils.isNotEmpty(userAgent)) {String clientOs = getClientOs(userAgent);String clientBrowser = getClientBrowser(userAgent);}String clientIp = servletRequest.getHeader("X-Forwarded-For");String host = servletRequest.getHeader(HttpHeaders.ORIGIN);HttpSession session = servletRequest.getSession(false);if (Objects.nonNull(session)){UserSession loginEntity = (UserSession) session.getAttribute(sessionName);if (loginEntity != null) {UserContext.set(loginEntity);}}UserSession userSession = new UserSession();userSession.setUniqueId("00009999zjy");userSession.setAccountLoginName("啊");userSession.setAccountId(host);return userSession;}private String getClientOs(String userAgent) {if (userAgent.contains("Windows")) {return "Windows";}if (userAgent.contains("Mac OS")) {return "Mac OS";}return "Other";}private String getClientBrowser(String userAgent) {if (userAgent.contains("Edge")) {return "Edge";}if (userAgent.contains("Chrome")) {return "Chrome";}if (userAgent.contains("Firefox")) {return "Firefox";}if (userAgent.contains("Safari")) {return "Safari";}return "Other";}}
心跳
http://stomp.github.io/stomp-specification-1.2.html#Heart-beating

