Spring websocket介绍请参考官网,这里就不多做介绍
在websocket客户端连接到server时,增加一些返回值给客户端。
由于博主使用STOMP协议,所以此解决方案针对STOMP的。
客户端和服务端交互流程如下图:
在流程图中,会涉及有二个channel
一个是request channel 和 response channel,要增加websocket连接时的返回值,需要在channel下手。
我们可以在channel中增加拦截器来达到我们的需求。以下是spring ws的配置代码
@Configuration
// 此注解用于开启使用STOMP协议来传输基于代理(MessageBroker)的消息,这时候控制器(controller)开始支持@MessageMapping,就像是使用@requestMapping一样。
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Bean
public HttpSessionIdHandshakeInterceptor httpSessionIdHandshakeInterceptor() {
return new HttpSessionIdHandshakeInterceptor();
}
@Bean
public MessageChannelInInterceptor messageChannelInInterceptor() {
return new MessageChannelInInterceptor();
}
@Bean
public MessageChannelOutInterceptor messageChannelOutInterceptor() {
return new MessageChannelOutInterceptor();
}
@Override
public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
// 注册一个Stomp的节点(endpoint),并指定使用SockJS协议。
stompEndpointRegistry.addEndpoint(WebSocketConstant.WEBSOCKET_PATH).setAllowedOrigins("*")// 允许跨域
.withSockJS().setInterceptors(httpSessionIdHandshakeInterceptor())
;
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
// 服务端发送消息给客户端的域,多个用逗号隔开
registry.enableSimpleBroker(WebSocketConstant.WEBSOCKET_BROADCAST_PATH, WebSocketConstant.P2P_PUSH_BASE_PATH);
// 定义一对一推送的时候前缀
registry.setUserDestinationPrefix(WebSocketConstant.P2P_PUSH_BASE_PATH);
// 定义websoket前缀
registry.setApplicationDestinationPrefixes(WebSocketConstant.WEBSOCKET_PATH_PERFIX);
}
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.interceptors(messageChannelInInterceptor());
}
@Override
public void configureClientOutboundChannel(ChannelRegistration registration) {
registration.interceptors(messageChannelOutInterceptor());
}
增加一个输出的拦截器MessageChannelOutInterceptor
public class MessageChannelOutInterceptor extends ChannelInterceptorAdapter{
private static final Logger log = LoggerFactory.getLogger(MessageChannelOutInterceptor.class);
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
MessageHeaders headers = message.getHeaders();
SimpMessageType messageType = SimpMessageHeaderAccessor.getMessageType(headers);
log.debug("out-message:{}",message);
log.debug("out-messageType:{}",messageType);
if (SimpMessageType.CONNECT_ACK.equals(messageType)) {
Message<byte[]> messageOut = MessageBuilder.createMessage("弱鸡".getBytes(), message.getHeaders());
log.debug("messageOut:{}",messageOut);
return messageOut;
}
return message;
}
}
messageType的类型有多种,这里只在CONNECT_ACK类型(连接成功回调类型)进行处理,已达到我们的目的
转载请注明出处: http://www.julyme.com/20180508/103.html
打赏一个呗~~(微信)
Julyme
感觉还行吧。
Julyme的IT技术分享