我正在使用 asp.net mvc、C# 和 jquery。我的网站大量使用 ajax。这导致了一个问题,我不确定如何解决它(比我当前的解决方案更好地修复它)。
场景。
- 用户登录到我的网站 - cookie 设置,服务器超时 30 分钟
- 用户离开 30 分钟
- 用户返回并点击我启用了 ajax 的 jquery 选项卡
- 请求发送到服务器
- 服务器没有用户超时,将他们送回登录页面。
- 因为它是一个 ajax 请求,所以重定向在选项卡中呈现。它看起来很难看(在选项卡中呈现整个页面),此时用户可能非常困惑。
问题
- 就服务器和 ajax 而言,ajax 请求有效并且成功响应被发送回。所以我无法去检查错误,因为请求成功,只是没有返回正确的数据。
解决方案一
- 用户登录网站。
- Jquery ajax 请求找出用户超时
- 超时比服务器超时少 60 秒
- 一旦 javascript 端超时。 Jquery 对话框出现并告诉他们他们的 session 已过期并强制他们重定向以登录包。
- 用户无法点击任何内容,因为对话框阻止了点击。如果某些用户使用 firebug 或其他东西,他们可以将其删除,但服务器超时仍然有效,他们将获得丑陋的版本(然后不在乎)。
- 如果用户发出 ajax 请求,服务器端和客户端的超时都会重置。
问题
用户可能会走开,而另一个人可能会过来,超时消息可能会出现,但他们仍有可能有 45 秒的时间尝试发出新请求并重置超时。这个很低,不用太担心。
有时我观察到它只是超时(客户端),我不知道为什么。我永远无法重现问题(似乎发生在其他人身上,但在我测试时却没有)。所以我猜有些东西没有命中写入或其他地方出了问题。
所以第 2 点确实是我想要找到另一个解决方案的重要原因。
解决方案 2(推测)。
我在想,也许我可以制作自己的响应 header 或其他东西,所以如果服务器超时,我可以发送一些 303 重定向或我可以检查的那种性质的东西,然后基于它进行 jquery 重定向。
但是我不确定在我的 C# 代码中哪里可以这样做,或者我是否可以做类似的事情。
最佳答案
您始终可以在登录操作中添加自定义 HTTP header ,该 header 可以被 AJAX 调用拦截并采取相应行动:
public ActionResult LogOn()
{
Response.AddHeader("X-LOGON", "LogOn");
return View();
}
并在成功回调中检查此 header 是否存在:
$.ajax({
url: '/home/someaction',
success: function (data, textStatus, XMLHttpRequest) {
if (XMLHttpRequest.getResponseHeader('X-LOGON') === 'LogOn') {
// the LogOn page is being displayed
// probably timeout or unaithorized => act accordingly
}
}
});
关于c# - 你将如何克服这个问题? Jquery + ajax + 服务器超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3088347/