/**
* 开启webSocket支持
*/
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Resource
private MonitorWebSocketHandler myWebsocketHandler;
@Resource
private TokenStoreUtil tokenStoreUtil;
private final String defaultCmd = "default";
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
//符合这个路径的请求
registry.addEndpoint("/ws")
.addInterceptors(new HandshakeInterceptor() {
//websocket握手之前
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
ServletServerHttpRequest req = (ServletServerHttpRequest) request;
//websocket发布主题的命令
String cmd = req.getServletRequest().getParameter("cmd");
/* if (StrUtil.isEmpty(cmd)) {
cmd = defaultCmd;
}*/
try {
if (!StrUtil.equals(defaultCmd, cmd)) {
//获取token认证 stompClient.connect 在headers传token这里接受不到,改成直接参数
String access_token = req.getServletRequest().getParameter("token");
Token token = tokenStoreUtil.parseToken(access_token);
if (token == null) {
response.setStatusCode(HttpStatus.UNAUTHORIZED);
response.flush();
return false;
}
String[] permissions=token.getPermissions();
if(!ArrayUtil.contains(permissions,"open_monitor_socket")){
response.setStatusCode(HttpStatus.UNAUTHORIZED);
response.flush();
return false;
}
}
} catch (Exception e) {
response.setStatusCode(HttpStatus.UNAUTHORIZED);
response.flush();
return false;
}
return true;
}
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
//System.out.println("????");
}
})
/*//握手之后dddd
.setHandshakeHandler(new DefaultHandshakeHandler() {
@Override
protected Principal determineUser(ServerHttpRequest request, WebSocketHandler wsHandler, Map<String, Object> attributes) {
//设置认证用户
return (Principal) attributes.get("user");
}
})*/
//这里设置跨域,允许哪个地址访问,*号是所有
.setAllowedOrigins("*")
//使用sockJS
.withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
//topic用来广播,user单独发送
registry.enableSimpleBroker("/topic", "/user");
registry.setUserDestinationPrefix("/user");
}
/**
* 消息传输参数配置
*/
@Override
public void configureWebSocketTransport(WebSocketTransportRegistration registry) {
registry.addDecoratorFactory(myWebsocketHandler);
registry.setMessageSizeLimit(100000) //设置消息字节数大小
.setSendBufferSizeLimit(100000)//设置消息缓存大小
.setSendTimeLimit(100000); //设置消息发送时间限制毫秒
}
}