#javascript #jquery #spring-boot #extjs #jwt
#javascript #jquery #весенняя загрузка #extjs #jwt
Вопрос:
Я использую Spring Boot с ExtJS со страницей / login, которая представляет собой простой JSP с некоторым jQuery javascript. Я пытаюсь интегрировать JWT для защиты своих API-интерфейсов данных. Используя то, что я смог найти для реализации JWT, я внедрил JWTRequestFilter и удалил встроенный поток входа в систему из Spring Security.
Теперь моя форма входа в систему отправляет POST-запрос $ajax к методу /authenticate, который возвращает токен обратно в ответе. Когда я устанавливаю заголовок аутентификации в Postman вручную и запускаю запрос GET для страницы /welcome, я получаю действительный ответ…
В следующем коде я пытаюсь обновить заголовки с помощью токена и ПОЛУЧИТЬ страницу /welcome . Я получаю 401 ошибку, потому что заголовок аутентификации отсутствует, когда я пытаюсь получить доступ к странице с помощью этого кода…
$form.on('submit', function(e) {
e.preventDefault();
$.ajax({
url: $form.attr('action'),
type: 'POST',
dataType: 'json',
contentType: 'application/json',
data: JSON.stringify(dat),
success: function(result) {
var d = new Date();
d.setTime(d.getTime() (3*24*60*60*1000));
var expires = "expires=" d.toUTCString();
// $('head').append('<meta name="Authorization" content="Bearer ' result.token '"');
window.localStorage.setItem("Authorization", "Bearer " result.token);
// document.cookie = "Authorization=Bearer " result.token ";" expires ";path=/;httpOnly";
window.location="/welcome";
} error: funciton() {}
);
Я попытался поместить токен в файл cookie (который Tomcat9 игнорирует из-за формата). В настоящее время я рассматриваю эту проблему отдельно.
Я также попытался создать XMLHttpRequest() для страницы приветствия, которая возвращает мне необработанный HTML, но я не уверен, нужно ли мне каким-то образом перезагрузить DOM, используя этот ответ…
Каков наилучший способ взять токен авторизации в ответе и поместить его в заголовок для последующего /GET для страницы /welcome ?
Ответ №1:
Вы неправильно добавили заголовки. Чтобы добавить заголовки, вам нужно использовать beforeSend()
:
beforeSend: function (xhr) {
xhr.setRequestHeader ("Authorization", "Bearer " JWT);
},
Эту опцию необходимо отправить. Кроме того, JWT
здесь означает JWT, токен и xhr
является XMLHttpRequest
необработанным объектом. Эта опция должна быть отправлена в параметр $.ajax()
‘s.
Комментарии:
1. Применяется ли это для всех запросов ajax и в противном случае? если я настрою объект XMLHttpRequest, будет ли заголовок по-прежнему применяться при попытке вызвать window. местоположение? ?
2. @ItGrunt Это повлияет только на конкретную вызывающую функцию AJAX, которой передается параметр. Для всех запросов вы также можете сделать это с помощью
.ajaxStart()
метода. Мой ответ затрагивает только конкретный запрос, о котором мы говорим. Не все остальное. Если вы используетеwindow.location
, это не вызов AJAX, а обычный запрос GET без каких-либо заголовков, так что нет.3. Спасибо за ваш ответ… итак, можно ли использовать объект xhr для перезагрузки всей страницы, скриптов, css и всего остального? Я видел, как он использовался в прошлом только для загрузки данных из микросервисов в DOM
4. @ItGrunt Но в запросе GET обычно определенно невозможно отправлять заголовки аутентификации. Но с JavaScript, да, и что касается микросервисов, они используют специальный метод загрузки, я не уверен в названии, и я тоже видел этот способ. Но это невозможно в обычном запросе GET и определенно не используется
window.location
.