我在一个域上有几个应用程序,它们共享单点登录的表单身份验证票。我们还在每个页面上都有 javascript,会在用户会话到期前 2 分钟警告用户,并允许他注销或延长会话。当倒计时达到 0 时,它们会自动注销。这一切都很好。但是,当用户打开多个浏览器窗口或选项卡以在各种应用程序上工作时,它会惨遭失败。如果用户在窗口 B 中工作时窗口 A 超时,他们将在下一次请求时退出 B。
我有一个解决方案,但我似乎无法实现它。基本上,当页面呈现时,我会写出票证发行日期的刻度。然后,当自动注销时,我想 ajax 调用一个处理程序来查看这些滴答声是否与当前的表单验证票滴答声相匹配。如果它们不匹配,那么我知道另一个应用程序一直在刷新票证,我不会将它们注销。问题是我无法创建一个不更新票证的通用处理程序,因为我们使用了slidingexpiration = true。
function CompareTicket(ticks) {
$.getJSON('http://localhost/MyApp/CompareTicket.ashx?t=' + ticks, function (data) {
if (data == 0)
SessionEnd();
else
SessionExtend();
});
}
在下面的处理程序代码中,如果我在查询字符串中发送的值与当前工单的刻度相匹配,则数据返回为 0。不幸的是,仅仅请求处理程序的行为就会更新票证并总是发回新的滴答计数。
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "application/json";
context.Response.ContentEncoding = Encoding.UTF8;
long ticketTicks = ((FormsIdentity)context.User.Identity).Ticket.IssueDate.Ticks;
if (ticketTicks == 0)
context.Response.Write("0");
else
{
long ticks = 0;
if (long.TryParse(context.Request.QueryString["t"], out ticks))
{
if (ticketTicks == ticks)
context.Response.Write("0");
else
context.Response.Write(ticketTicks.ToString());
}
else
context.Response.Write("0");
}
}
关于如何在不扩展票证的情况下从服务器获取 JSON 请求的任何想法?