Эта статья основана на небольшом СЛУЧАЕ, с которым столкнулись в работе: использование AXIOS для перехвата ответа сервера на код состояния 302.
описание сцены
Многие веб-сайты будут иметь проверку входа, и процесс выглядит следующим образом:
- перейти по URL-адресу веб-сайта;
- Если сервер обнаруживает, что запрошенный файл cookie не содержит данных для входа (обычно это токен), он возвращает ответ о перенаправлении с кодом состояния 302 и записывает адрес перенаправления в поле Location заголовка ответа, где мы и входим в систему. URL-адрес .
- После того, как браузер получит ответ и обнаружит, что это 302, он будет использовать
getМетод повторно запрашивает URL-адрес для входа, указанный в Location; - После ввода пароля учетной записи Войти после URL-адреса входе в систему, сервер ответит
Set-CookieНапишите нашу информацию для входа в браузер, и код браузера повторно перейдет на страницу, которую мы посетили в начале.
Выше приведен наиболее распространенный процесс входа на веб-сайт. Среди них ответ кода состояния 302 очень важен, он направляет нас на правильную веб-страницу для входа в систему.
Обычно это происходит, когда пользователь вводит адрес прямо в браузере. Ситуация, с которой я недавно столкнулся: я договорился с бэкендом, чтобы использовать axios для запроса интерфейса бэкенда через Ajax, если он обнаружит, что нет логина, бэкэнд вернет ответ о перенаправлении 302, и тогда я получу Location адрес в ответе. Перейдите по этому адресу, чтобы войти.
Это кажется простым и требует всего три шага:
- послать запрос;
- Оцените код состояния в ответе axios, если он равен 302, получите адрес Location в заголовке ответа;
- Используйте код JS для управления прыжком браузера.
фактическая реализация
Первое, что нужно сделать, это получить ответ от axios. Логика axios, оценивающая код состояния нормального ответа, следующая:
validateStatus: function (status) {
return status >= 200 && status < 300; // default
}
Поэтому нам нужно изменить логику проверки, чтобы код состояния 302 также можно было считать нормальным ответом:
validateStatus(status) {
return status >= 200 && status < 300 || status === 302;
}
Затем выполните обработку в ответе axios:
axios({
url: '/api',
}).then(res => {
const { status, headers: { Location } } = res;
if (status === 302) {
window.location.href= Location;
}
})
Хороший! очень просто~
Но на практике оказалось, что код вообще не добегал до шага обработки ответов аксиом, а напрямую использовалgetМетод запросил адрес перенаправления. Думаю, это может быть поведение axios по умолчанию, но после ознакомления с официальной документацией не было найдено соответствующей конфигурации для отключения этой функции. единственныйmaxRedirectsОпции, применяются к Nodejs.
Поискав соответствующую информацию в Интернете, я обнаружил, что кто-то также упомянулЭта проблема,Причина:Ajax не может обрабатывать ответы с кодом состояния 302, что является поведением браузеров по умолчанию..
консультируясьстандартный, стандарт про AjaxreadyState = 2указывает, что все действия по перенаправлению (если они были) выполнены и все заголовки ответа получены:
All redirects (if any) have been followed and all headers of a response have been received.
То есть метод запроса Ajax, когда ответ получен, все перенаправления завершены.
Код состояния перенаправления по умолчанию
После экспериментов все коды состояния перенаправления:
- 301: Moved Permanently
- 302: Found
- 303: See Other
- 307: Temporary Redirect
- 308: Permanent Redirect
Код можно найти наgithubВы можете просматривать.
Если у вас есть какие-либо вопросы, добро пожаловать на обсуждение ~ Эта статья впервые появилась на моемблог, добро пожаловать, чтобы нажать ~