Как получить сеанс websocket на сервисе? - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть служба под названием 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, поэтому, я думаю, должен быть способ получить сеанс, который создал этот компонент.

Один из способов сделать это - переопределить getAllUsers () для getAllUsers (StompHeaderAcessor ha) и получить сессию с использованием этого заголовка, но для меня это не является правильным решением.

Есть ли способ получить текущий сеанс websocket в сервисе с ограниченным доступом websocket, не передавая его в виде аргументов?

1 Ответ

0 голосов
/ 25 апреля 2019

Решил эту проблему, создав службу 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;
    }

}
...