2017-04-11 31 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自動管理的,因此您必須像這樣添加它。