我正在试验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;
}
}
答案 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。这是什么服务器?