4

我正在试验 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;
    }
}
4

2 回答 2

8

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

一,您可以配置一个子类DefaultHandshakeHandler,覆盖determineUser并为每个 WebSocketSession 分配某种身份。顺便说一下,这需要 4.0.1(当前可以使用构建快照),该版本将于 2014 年 1 月 23 日星期一发布。

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

于 2014-01-23T19:50:27.527 回答
0

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

所以我不太确定“/user/products-user0”是什么。它在两个方面让我感到惊讶。首先,如果它以“/user”开头,那么这就是转换之前的目标,后面应该是用户名(即“/user/{username}/products”)。

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

于 2014-01-24T20:03:30.123 回答