我有一个名为UserMediator的服务,该服务具有一种方法来检索会话用户有权访问的数据库上的所有用户。
@Service
@Scope(scopeName = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class UserMediator {
@Autowired
private UserService userSerivce;
pulibc Collection<User> getAllUsers() {
Session session = someMethodToGetTheCurrentSessionFromThisService();
return userService.getAllUsersThatYouAreAllowedToSee(session);
}
}
我知道,使用websocket范围,将为每个websocket会话创建此服务的一个实例,因此,我认为必须有一种方法来检索创建此bean的会话。
一种方法是将getAllUsers()重新定义为getAllUsers(StompHeaderAcessor ha)并使用此标头acessor来获取会话,但这对我来说似乎不是合适的解决方案。
有什么方法可以在不通过参数明确传递的情况下在websocket范围内的服务中获取当前websocket会话吗?
答案 0 :(得分:0)
解决了创建SessionHolder服务的问题:
@Service
@Scope(scopeName = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class SessionHolder {
private User user = null;
@Autowired
public SessionHolder(SimpMessagingTemplate template) {
this.template = template;
}
@EventListener(SessionConnectedEvent.class)
public void handleSessionConnected(SessionConnectedEvent event) {
if (user == null && event.getUser() != null) {
StompHeaderAccessor ha = StompHeaderAccessor.wrap(event.getMessage());
user = SessionUtils.getUser(ha);
}
}
public User getUser() {
return user;
}
}