2017-04-11 14 views
1

我有一个Java套接字API应用程序,它处理来自用户的套接字请求并发送响应。 我有一个配置者:如何防止订阅spring socket/queue/private/*目标。

@Configuration 
@EnableWebSocketMessageBroker 
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { 
    private static final Logger LOGGER = Logger.getLogger(WebSocketConfig.class); 
    @Override 
    public void configureMessageBroker(MessageBrokerRegistry config) { 
     config.enableSimpleBroker("/queue"); 
     config.setApplicationDestinationPrefixes("/server_in"); 
     config.setUserDestinationPrefix("/user"); 
    } 

    @Override 
    public void registerStompEndpoints(StompEndpointRegistry registry) { 
     registry.addEndpoint("/websocket").withSockJS(); 
    } 
} 

当我发送响应用户i执行以下操作: this.simpMessagingTemplate.convertAndSend("/queue/private/user_"+secret_key, socketResponse);

在客户端,我有以下代码:

sc.subscribe('/queue/private/user_'+secret_key, function (greeting) { 
     console.log(greeting.body); 
    }); 

和响应的处理成功。 但问题是,其他用户也可以订阅“/队列/私人/ *”的目的地和处理私人消息。

sc.subscribe('/queue/private/*', function (greeting) { 
     console.log(greeting.body); 
    }); 

我该如何评估这种行为?

回答

3

如果您希望每个用户有一个插座,只有得到他的消息,你可以做的是:

订阅为你做的端点但例如“/用户”盈

sc.subscribe('/user/queue/websocket, function (greeting) { 
    console.log(greeting.body); 
}); 

,并在服务器端,你应该有一个休息方法:

@RequestMapping(value = "/test", method = RequestMethod.POST) 
public void test(Principal principal) throws Exception { 
    this.template.convertAndSendToUser(principal.getName(), "/queue/click", ""); 
} 

有了这个每个用户subscibers每个通道,只通知用户有关,当其他调用。

其余的电话应该被认证,所以委托人有用户名。

用户通道是由Spring自动管理的,因此您必须像这样添加它。