注意需要添加注解
@EnableAsync
配置
@Slf4j
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
/**
* 注册STOMP协议的节点(endpoint) 将每个节点映射到一个特定的URL
*
* @param registry
*/
@Override
public 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;
@Slf4j
public class SessionAuthHandshakeInterceptor implements HandshakeInterceptor {
@Override
public 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;
}
@Override
public 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";
@Override
protected 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