Я использую jwt для аутентификации, подозреваю, что это как-то связано с заголовком запроса, в котором есть токен.
Получение события, отправленного сервером, без добавления @PreAuthorize работает нормально:
@GetMapping("/sse")
public SseEmitter serverSentEvent() throws IOException
{
SseEmitter emitter = new SseEmitter(2592000000L);
emitter.send("OK");
return emitter;
}
Но когда я добавляю @PreAuthorize для проверки роли использования, я получаю ответ 406 (не могу установить соединение с сервером в http: // локальный: 8080 / sse)
@GetMapping("/sse")
@PreAuthorize("hasRole('ADMIN')")
public SseEmitter serverSentEvent() throws IOException
{
SseEmitter emitter = new SseEmitter(2592000000L);
emitter.send("OK");
return emitter;
}
Я не устанавливал заголовок Accept, только заголовок авторизации с токеном.
HTTP 406 является «неприемлемым», поэтому намек может заключаться в том, что вам требуется заголовок принятия. Также может случиться так, что ваша конечная точка также должна принимать некоторый MIME-тип (например, application/json или что-то более подходящее).
Я использую EventSource на клиенте, который отправляет запрос GET на URL-адрес с заголовком принятия text/event-stream
Очевидно, перехватчик JWT не добавлял токен в заголовок авторизации для запросов EventSource, поэтому я использовал ng-событие-источник, который позволяет настраивать заголовки HTTP в EventSource.
Есть ли в вашем запросе заголовок
Accept?