Я разрабатываю многопользовательскую игру на основе Spring 4 WebSocket. мой сервер не имеет гражданства, поэтому для идентификации игроков я использую токены.
после того, как я какое-то время боролся с тем, как идентифицировать игроков через WebSockets, я придумал это решение: на клиенте игрок регистрируется следующим образом:
var sockjs = new SockJS("http://mygame/games/", null, {server : token});
это добавляет токен к URL-адресу, я настроил фильтр с использованием весенней безопасности:
String requestURI = request.getRequestURI();
String[] parts = StringUtils.split(requestURI, "/");
if (parts.length == 4) {
String token = parts[1];
List<GrantedAuthority> authorities = new ArrayList<>();
authorities.add(new SimpleGrantedAuthority(Role.ROLE_MULTIPLAYER)));
SecurityContextHolder.getContext().setAuthentication(new PreAuthenticatedAuthenticationToken(token, "MULTIPLAYER", authorities));
}
и это работает! во всех запросах WebSockets у меня есть основной набор.
Однако некоторые браузеры, похоже, не поддерживают это, например, в Safari Принципал не установлен, при отладке запроса я вижу, что URL-адрес правильный, и фильтр работает, но Принципал не установлен. то же самое касается IE, Chrome и FF. Я использую STOMP (https://github.com/jmesnil/stomp-websocket) как протокол сообщения.
почему браузеры ведут себя по-разному? это проблема Spring или Client?