Не удается обработать перенаправление 302 в ajax и почему?
У меня есть серверный сервер, написанный в asp.net mvc с использованием проверки подлинности с помощью форм. Когда пользователь не аутентифицирован, сервер автоматически отправит 302 перенаправление на действие "Вход" и вернет страницу входа.
На стороне клиента у меня есть список элементов. Этот список доступен только для аутентифицированных пользователей. На странице у меня есть кнопка для обновления списка с помощью Ajax (функция $.ajax jQuery).
Теперь моя проблема в том, что когда билет аутентификации является тайм-аутом, и пользователь нажимает кнопку "Обновить":
- Моя функция отправляет запрос ajax для получения обновленного списка
- Сервер обнаруживает, что билет проверки подлинности недействителен и выдает перенаправление 302.
- Браузер автоматически обрабатывает этот ответ 302 и заставляет мою функцию ajax отправлять другой запрос ajax в действие Login, а конечным результатом является HTML со статусом 200. Мой script запутан, потому что list также является HTML со статусом 200.
То, что я хочу, - это когда билет проверки подлинности является тайм-аутом, и пользователь нажимает кнопку "Обновить", я должен иметь возможность обнаружить это и отобразить сообщение с запросом на вход в систему.
Я попытался обход этого путем добавления пользовательского заголовка (IS_LOGIN) в действие Login и проверить, что в моем ответе ajax. Но это нехорошее решение.
Итак, мои вопросы:
- Каков наилучший способ решения этой проблемы?
- Почему браузер не позволяет нашему дескриптору дескриптора script 302? и просто автоматически заставляет наш ajax создавать другой запрос. Это проблема с библиотекой браузера или jquery? Любые причины для этого? (безопасность,...)
Спасибо за любые ответы.
Ответы
Ответ 1
Вы не должны перенаправлять вызов, когда он XHR, но отвечаете с помощью 401 Unauthorized
и обрабатываете это в своих обратных вызовах. Я не знаю ASP.NET, но я сделал что-то подобное с Spring Безопасность.
Вот понятие:
- Получить аутентифицированное состояние
- Проверьте заголовки на
X-Requested-With: XMLHttpRequest
- При обнаружении и отсутствии аутентификации ответьте
401 Unauthorized
- Если не найден и не аутентифицирован перенаправлен.
Суть в том, что вызовы XHR нужно обрабатывать по-разному, а затем другие HTTP-запросы в некоторых случаях. Вы должны перенаправлять XHR только в том случае, если один и тот же ресурс находится в другом месте.
Чтобы ответить на ваш вопрос
Вы не можете обрабатывать переадресации с обратными вызовами XHR, потому что браузер автоматически их обслуживает. Вы вернетесь только в перенаправленном местоположении.