我正在 asp.net 中开发一个 Web 表单应用程序,并使用 jquery ajax 调用进行大部分操作。对于服务器操作,我使用 ashx 处理程序。
我的问题是,当用户的 session 过期(一段时间不活动后),并且用户单击进行 jquery ajax 调用的按钮时,如何从处理程序检测 session 过期并返回特定的 json。
一个similar qustion但没有正确的答案。
提前致谢。
rgds 里夫基
最佳答案
一种方法是检查 global.asax 文件中任何 ashx 的 session 是否已过期。如果有,则返回 json session 过期对象。在客户端,您将检查该对象是否存在并通过 JavaScript 将用户重定向到登录页面。
因此,在您的 global.asax 文件中,您将具有如下内容:
protected void Application_AcquireRequestState(object sender, EventArgs e)
{
var url = HttpContext.Current.Request.Url.OriginalString;
var extension = Path.GetExtension(url);
if (extension == ".ashx" && HttpContext.Current.Session.Contents.Count == 0)
{
HttpContext.Current.Response.StatusCode = 440;
HttpContext.Current.Response.TrySkipIisCustomErrors = true;
HttpContext.Current.Response.Write(new JObject(new JProperty("sessionExpired")).ToString());
HttpContext.Current.Response.End();
}
}
然后,您将为所有查找“sessionExpired”对象的 ajax 查询创建一个全局 ajax 事件错误处理程序:
$(document).ajaxError(function (event, xhr, settings)
{
if (xhr.responseText && $.parseJSON(xhr.responseText).sessionExpired)
{
window.location.replace("loginUrl.aspx");
return;
}
});
这种方法的好处是,您只需拥有这两段代码即可获得合理的 session 过期处理。然而,这种方法有一个缺点:
所有 ashx 文件必须至少具有 IReadOnlySessionState 或 IRequiresSessionState 接口(interface)。否则, session 过期逻辑将被触发,因为 session 将被假定为空。如果您不希望这样做,那么您需要一种方法来排除某些 .ashx 文件,例如排除包含包含您的 ashx 文件的特定路径的任何 url。
此外,如果页面的某些部分不涉及使用 session ,那么您也需要排除这些页面。
关于asp.net ashx 处理程序 session 超时和 jquery ajax 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6421942/