【问题标题】:How to get websocket session on service?如何在服务上获取 websocket 会话?
【发布时间】:2019-04-17 16:48:13
【问题描述】:

我有一个名为 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) 并使用此标头访问器获取会话,但这对我来说似乎不是正确的解决方案。

有没有什么方法可以在不通过参数显式传递的情况下在 websocket 范围服务中获取当前 websocket 会话?

【问题讨论】:

标签: java spring spring-boot spring-websocket


【解决方案1】:

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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 2020-07-27
    相关资源
    最近更新 更多