如何在Spring 4 STOMP over WebSocket配置中回复未经身份验证的用户?

时间:2014-01-23 15:17:43

标签: spring websocket stomp spring-messaging spring-websocket

我正在试验Spring 4 WebSocket STOMP应用程序。有没有办法回复单个未经身份验证的用户,条件是每个用户都有唯一的会话ID?现在我只能广播消息或直接发送给经过身份验证的用户。

@Controller
public class ProductController {

    @MessageMapping("/products/{id}")
    @SendTo("/topic") // This line makes return value to be broadcasted to every connected user.
    public String getProduct(@DestinationVariable int id) {
        return "Product " + id;
    }
}

2 个答案:

答案 0 :(得分:8)

您可以为传入用户分配匿名身份。有两种方法可以做到这一点。

首先,您可以配置覆盖DefaultHandshakeHandler的{​​{1}}子类,并为每个WebSocketSession分配某种身份。这需要4.0.1(目前可用的构建快照),将于2014年1月23日星期一发布。

第二,WebSocket会话将依赖于握手HTTP请求中determineUser返回的值。你可以有一个servlet Filter包装HttpServletRequest并决定从该方法返回什么。或者,如果您使用的是具有AnonymousAuthenticationFilter的Spring Security,请覆盖其HttpServletRequest.getUserPrincipal方法。

答案 1 :(得分:0)

@SendToUser("/products")应该会向目标" / user / {username} / products"发送消息。该消息将由UserDestinationMessageHandler处理,{{1}}将目的地转换为" / products-user {sessionId}"并重新发送消息。

所以我不太确定" / user / products-user0"是。它以两种方式给我带来惊喜。首先,如果它以" / user"开头那么这就是转型前的目的地,应该跟着用户名(即" / user / {username} / products")。

它以" -user0"结尾的事实;使它看起来像转换后的目的地,但它不应该以" / user"开头。在任何情况下,在这种情况下0,1将是WebSocket会话ID。这是什么服务器?