如何让 websocket session 服务?

How to get websocket session on service?

我有一个名为 UserMediator 的服务,它有一种方法可以检索 session 用户有权访问的数据库中的所有用户。

@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 session 创建此服务的一个实例,因此,必须有一种方法来检索创建此 bean 的 session,我认为。

一种方法是将 getAllUsers() 重新定义为 getAllUsers(StompHeaderAcessor ha) 并使用此 header 处理器获取 session,但这对我来说似乎不是正确的解决方案。

有没有办法在 websocket 范围的服务中获取当前的 websocket session 而无需通过参数显式传递它?

通过创建 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;
    }

}