Spring websocket 客户端连上服务端时增加返回值

java

2018-05-08

1507

0

一、spring websocket简介

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

发表评论

全部评论:0条

Julyme

感觉还行吧。

Julyme的IT技术分享

友情链接




/sitemap