На веб-странице он использует диспетчер соединений / источник данных YUI для отправки запросов AJAX на сервер, если сеанс (который содержит информацию о том, был ли пользователь аутентифицирован) уже отключен, эти ajax-ответы, которые могут быть просмотрены только с помощью аутентификации пользователи должны возвращать код состояния http, сообщая клиенту, что сеанс уже отключен, тогда клиент либо просто перенаправляет его на страницу входа в систему, либо спрашивает его, хочет ли он продлить сеанс.
Мой вопрос в том, что, в этой ситуации, какой код статуса http наиболее подходит для того, чтобы сообщить клиенту, что время ожидания сеанса?
Список кодов состояния HTTP из wiki
Лучше всего я могу предложить код статуса HTTP 401 с заголовком WWW-Authenticate.
Проблема с 403 запросами – это состояния RFC 2616 : «Авторизация не поможет, и запрос НЕ ДОЛЖЕН быть повторен». (т. е. не имеет значения, если вы аутентифицированы или нет, вы не сможете получить доступ к этому ресурсу, когда-либо).
Проблема с запросами 401 заключается в том, что они «ДОЛЖНЫ включать поле заголовка WWW-Authenticate». Как заметил кто-то, он не нарушает спецификацию для использования пользовательского значения в заголовке WWW-Authenticate.
Я не вижу никакой причины в RFC 2617, почему статус HTTP 401 в сочетании с настраиваемым заголовком WWW-Authenticate, как это, будет не в порядке:
WWW-Authenticate: MyAuthScheme realm="http://example.com"
Спектр oAuth, похоже, действительно делает именно это, поскольку они рекомендуют это (хотя они имеют в виду нечетную интерпретацию RFC):
WWW-Authenticate: OAuth realm="http://server.example.com/"
Это, по-видимому, не имеет особого смысла в RFC, но я не могу видеть, что он запрещен им (он, похоже, не конфликтует с каким-либо ДОЛЖНЫМ или НЕ ДОЛЖЕН, ДОЛЖЕН или НЕ ДОЛЖЕН быть уверенным).
Я бы хотел, чтобы был более конкретный код статуса HTTP для тайм-аутов, а для таких вещей, как токены CSRF, были недействительными, так что это было яснее.
Я бы рекомендовал HTTP 401.
В то время как 403 в основном говорит: «Тебе не разрешают, уходят и не возвращаются», 401 говорит: «Мы не знаем, разрешено ли вам или нет, потому что вы не принесли свой идентификатор. возьмите его и попробуйте еще раз ».
Сравните определения Википедии :
HTTP 403 – запрос был юридическим запросом, но сервер отказывается отвечать на него.
HTTP 401 – Аналогичен 403 Запрещенному, но специально для использования, когда возможна аутентификация, но не удалось или еще не предоставлена.
Что насчет 419 – это не стандарт, но описание в Википедии, похоже, соответствует:
419 Тайм-аут аутентификации
Не входит в стандарт HTTP, 419 Timeout Timeout означает, что истек срок действия действительной аутентификации. Он используется в качестве альтернативы 401 Unauthorized, чтобы отличать от других клиентов, прошедших проверку подлинности, лишение доступа к определенным ресурсам сервера.
Я считаю, что соответствующий код будет 403 / Запрещено. Нет никаких прямых связей с сеансами.
По правде говоря, стандартного кода статуса HTTP для тайм-аута сеанса нет. Сеансы реализованы на уровне приложения, а не на транспортном уровне HTTP.
Существует специальный код состояния, который Microsoft использует для тайм-аута сеанса: 599 или просто составляет свой собственный код состояния в диапазоне 5xx.
Из кодов состояния Wiki:
599 Ошибка тайм-аута подключения к сети (неизвестно) Этот код состояния не указан в каких-либо RFC, но используется прокси-серверами Microsoft Corp. HTTP, чтобы сигнализировать тайм-аут сетевого подключения за прокси-сервером для клиента перед прокси-сервером.
Я использую код состояния 599 для тайм-аута сеанса, а затем проверяю его в ответе AJAX.
Согласно ссылке Википедии Кодов состояния Http, приведенных выше Бобо:
440 Login Timeout (Microsoft) A Microsoft extension. Indicates that your session has expired.
Технически, принятый ответ верен: если вы уже точно знаете, что будете отказываться от запроса, и вы спрашиваете, какой код отказа возвращается, то HTTP 401 «Несанкционированный (не прошедший проверку подлинности)» является подходящим, поэтому чтобы запросить повторную аутентификацию.
Но, прежде всего, спросите себя: вы должны отказаться от запроса?
Подумайте, что пользователь может просто посещать общедоступную страницу вашего веб-сайта, и в этом случае вы собираетесь ударить их по лицу «Несанкционированным!». и потребовать повторной аутентификации, чтобы просмотреть страницу, которую они обычно могли бы видеть без проверки подлинности. Это не круто.
Мой совет состоит в том, чтобы игнорировать тот факт, что токен сеанса неизвестен, и просто приступайте к созданию нового токена сеанса и создайте для него новый сеанс. Исходное состояние сеанса, конечно, будет «еще не аутентифицировано», поэтому, если пользователь пытается получить доступ к непубличной странице, страница будет следить за тем, чтобы они получали HTTP 401 «Несанкционированный (не прошедший проверку подлинности) »и должен пройти аутентификацию. Но если пользователь приземляется на общедоступной странице, они не заметят ничего другого.
Код 408. «Тайм-аут запроса», кажется идеальным – RFC 2616 объясняет, что это означает
Клиент не выдал запрос в течение времени, когда сервер был готов ждать.
т.е. точно «тайм-аут», как вам нужно!
Для запросов, отличных от Ajax, я использую перенаправление 302.
Для запросов Ajax я использую 200 для известных ошибок. Таким образом, я могу использовать объект данных. Я нахожу, что объект данных легче работать, чем парсинг jqXHR для информации. И тогда мне не нужно беспокоиться о том, какой код статуса HTTP пытается перераспределить мою ситуацию.
Пример jQuery:
$.ajax({ //send data to server }) .done(function(data, textStatus, jqXHR) { if (data.success) { //then process return data } else { //get error type or message from data object //could use custom error codes } }) .fail(function(jqXHR, textStatus, errorThrown) { //handle unknown errors });