每个 WebSocket 会话都有一个属性map。该map作为标头附加到入站客户端消息,并且可以从控制器方法访问它,如以下示例所示:
@Controller
public class MyController {
@MessageMapping("/action")
public void handle(SimpMessageHeaderAccessor headerAccessor) {
Map<String, Object> attrs = headerAccessor.getSessionAttributes();
*// ...*
}
}
你可以在websocket
作用域中声明一个Spring管理的bean。你可以将WebSocket作用域的beans注入到控制器和注册在clientInboundChannel
上的任何通道拦截器中。这些通常是单例的,并且比任何个别的WebSocket会话的生命周期都长。因此,你需要为WebSocket作用域的beans使用作用域代理模式,如下例所示:
@Component
@Scope(scopeName = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyBean {
@PostConstruct
public void init() {
*// Invoked after dependencies injected*
}
*// ...*@PreDestroy
public void destroy() {
*// Invoked when the WebSocket session ends*
}
}
@Controller
public class MyController {
private final MyBean myBean;
@Autowired
public MyController(MyBean myBean) {
this.myBean = myBean;
}
@MessageMapping("/action")
public void handle() {
*// this.myBean from the current WebSocket session*
}
}
与任何自定义作用域一样,Spring在第一次从控制器访问时初始化一个新的MyBean
实例,并将该实例存储在WebSocket会话属性中。随后返回相同的实例,直到会话结束。WebSocket 作用域的 bean 调用了所有 Spring 生命周期方法,如前面的示例所示。