我正在处理的应用程序有一个会话超时值。如果用户之间的交互时间不超过此值,则会尝试加载下一页,然后系统会提示他们登录。
所有发出的请求都通过此机制进行路由,其中包括AJAX调用。最初我们在登录页面上发送了200个头文件,这引入了AJAX的一些问题,因为如果发送了200个响应,则运行代码,并且从这些RPC调用发回的大多数数据是JSON或得到评估的原始JavaScript(不问:|)。
我建议401更好,因为我们的JSON解析器不会尝试使用HTML登录页面.. :))
但是,reading the spec时,我发现还必须发送 WWW-Authenticate
字段。
这个领域有什么好处? Application Login
会满足吗?
答案 0 :(得分:62)
当指示HTTP基本身份验证时,我们返回如下内容:
WWW-Authenticate: Basic realm="myRealm"
而Basic
是方案,而其余部分则非常依赖于该方案。在这种情况下,领域只是为浏览器提供一个文字,当提示输入用户ID和密码时,该文字可以显示给用户。
你显然没有使用Basic,因为使用Basic Auth时没有会话到期的意义。我假设你正在使用某种形式的基于表单的身份验证。
从回忆中,Windows Challenge Response使用不同的方案和不同的参数。
诀窍在于,由浏览器决定它支持哪些方案以及它如何响应它们。
我的直觉是,如果您使用基于表单的身份验证,请继续使用200 +重新登录页面,但添加一个浏览器将忽略的自定义标头,但您的AJAX可以识别。
要获得非常好的User + AJAX体验,请让脚本继续查找发现会话过期的AJAX请求,通过弹出窗口发出重新登录请求,并在成功时重新提交原始AJAX请求并继续执行正常。
避免作弊只是让脚本每隔5分钟到达网站以保持会话活跃,因为这会破坏会话到期点。
另一种选择是刻录AJAX请求,但用户体验不佳。
答案 1 :(得分:6)
不,您必须指定要使用的身份验证方法(通常为“基本”)和身份验证领域。有关示例请求和响应,请参阅http://en.wikipedia.org/wiki/Basic_access_authentication。
您可能还想阅读RFC 2617 - HTTP Authentication: Basic and Digest Access Authentication。
答案 2 :(得分:-7)
当用户会话超时时,我发回HTTP 204状态代码。请注意,HTTP 204状态不包含任何内容。在客户端我这样做:
xhr.send(null);
if (xhr.status == 204)
Reload();
else
dropdown.innerHTML = xhr.responseText;
这是Reload()函数:
function Reload() {
var oForm = document.createElement("form");
document.body.appendChild(oForm);
oForm.submit();
}