Вопрос по yui, ajax, http-status-codes, php – Какой код состояния http предполагается использовать, чтобы сообщить клиенту, что время сеанса истекло?

68

На веб-странице он использует диспетчер соединений YUI / источник данных для отправки запросов AJAX на сервер, если время сеанса (которое содержит информацию о том, прошел ли пользователь проверку подлинности) уже истекло, те ответы ajax, которые могут просматриваться только проверенными пользователями. пользователи должны вернуть код состояния http, сообщая клиенту, что время сеанса уже истекло, затем клиент либо просто перенаправляет его на страницу входа, либо спрашивает, хочет ли он продлить сеанс.

Мой вопрос заключается в том, что в этой ситуации какой код статуса http является наиболее подходящим, чтобы сообщить клиенту, что время сеанса истекло?

Список кодов состояния HTTP из вики

Да ведь 418 конечно! Короткий и полный ... Tim Post
Ваадин использует 410 Gone, но так какs кешируется браузером, я бы не рекомендовал sreg
Вы хотите предупредить пользователя о том, что сеанс истекает, чтобы пользователь мог что-то сделать, чтобы продлить его? Если это'В этом случае он должен обрабатываться таймером в JavaScript, который отключается до истечения времени ожидания сеанса на сервере. К тому времени, когда код состояния будет отправлен сервером, срок его действия уже истек. Таймер также понадобился бы, если бы вы перенаправляли их на другую страницу автоматически, если они оставляли страницу без дела. Jason

Ваш Ответ

4   ответа
29

Я бы порекомендовал HTTP 401.

В то время как 403 в основном говорит:Вы'не разрешено, уходи и невернуться "401 говорит:Мы нене знаю, если выразрешено или нет, потому что вы нене принеси свой ID. Иди и попробуй еще раз. "

сравнитьВикипедия»определения:

HTTP 403 - Запрос был законным, но сервер отказывается отвечать на него.

HTTP 401 - Аналогично 403 Запрещено, но специально для использования, когда аутентификация возможна, но не прошла или еще не была предоставлена.

401 предназначен дляHTTP-аутентификация, RFC 2616 говоритresponse MUST include a WWW-Authenticate header field, Так что этонеправильно отправить этот код безWWW-Authenticate поле заголовка. toxalot
59

Лучшее, что я могу предложить, - это код состояния 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 spec на самом деле, кажется, делает именно это, поскольку они рекомендуют это (хотя, на мой взгляд, они имеют странную интерпретацию RFC):

WWW-Authenticate: OAuth realm="http://server.example.com/"

Это неПохоже, что оно специально санкционировано RFC, но я не могуна самом деле не вижу, что этоэто запрещено (это неКажется, что конфликтует с любым ДОЛЖНО или НЕ ДОЛЖНО, СЛЕДУЕТ или НЕ СЛЕДУЕТ создавать условия

Хотелось бы, чтобы был более конкретный код состояния HTTP для тайм-аутов и для таких вещей, как недопустимые токены CSRF, чтобы это было понятнее.

13

любой, который непосредственно связан с сессиями.

Абсолютно это правильный ответ. Так как время сеанса истекло, запрос запрещен, так что это лучший выбор. marcc
authorization will not help - Я так понимаюHTTP-аутентификация победил'Т помочь. Что правильно. Отправка заголовка авторизации ничего не изменит. Ни 401, ни 403 не идеальны, но я думаю, что 403лучше чем 401. 401неправильно для тайм-аута сеанса, потому что RFC 2616 явно заявляетclient MAY repeat the request with a suitable Authorization header field, Но в этом случае клиентНЕ СЛЕДУЕТ повторите запрос (по крайней мере, без промежуточного шага). К сожалению, мы можемПередайте последнюю часть с кодом состояния. toxalot
Я могу'Не соглашаясь с этим, RFC 2616 прямо заявляет, что запросы, которые приводят к ответу 403 "НЕ ДОЛЖНО повторяться клиентом и этимавторизация не поможет ". Iain Collins
403 рассказывает клиенту (в основном)Дон»сделать это снова, если вы не измените свой запрос " , но если сеанс был установлен, никаких изменений не потребуется. Кроме того, вы можетев большинстве случаев ничего не делать с (текущим) запросом на восстановление сеанса. Tim Post
Именно так! 401 было бы лучше, я думаю, но для этого требуется HTTP-аутентификация. Я думаю, что это требует нового статуса в соответствии с 401 + 303 (так, очевидно, 704), что означает "Не авторизован, см. Другое для получения авторизации ", В дополнение к тому, что это более семантически правильно, это также может быть HTTP-решение для перенаправления батута, в основном "иди сюда, тогда, когда вы вернетесь, мыпопробую еще раз, так что страница входа может быть независимой в отношении пункта назначения. Anthony
17

описание в Википедии похоже подходит

419 Тайм-аут аутентификации

Не являющийся частью стандарта HTTP, время ожидания аутентификации 419 означает, что срок действия ранее действительной аутентификации истек. Он используется в качестве альтернативы 401 Unauthorized для того, чтобы отличать клиентов, прошедших аутентификацию иным образом, которым отказано в доступе к определенным ресурсам сервера.

Любая идея, откуда это происходит (кроме Википедии)? Если оно's не в официальном RFC, кто это определил? anaximander
Это не является частью спецификации и не доступно в JavaHttpServletResponse @ Джон, если вы знаете какой-либо другой надежный источник, лучше ссылаться на него. Vishrant
Кажется, он также удален с этой вики-страницы. Salem Ouerdani

Похожие вопросы