我们在整个应用程序中使用 Ajax 调用——试图找出一个全局解决方案,如果在尝试执行任何 Ajax 请求时会话已经过期,则重定向到登录页面。我已经编写了以下解决方案,从这篇文章中获取帮助 -处理 ajax 调用中的会话超时
不知道为什么在我的关心事件中“HandleUnauthorizedRequest”没有被解雇。
自定义属性:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class CheckSessionExpireAttribute :AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
var url = new UrlHelper(filterContext.RequestContext);
var loginUrl = url.Content("/Default.aspx");
filterContext.HttpContext.Session.RemoveAll();
filterContext.HttpContext.Response.StatusCode = 403;
filterContext.HttpContext.Response.Redirect(loginUrl, false);
filterContext.Result = new EmptyResult();
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
}
在控制器操作中使用上述自定义属性如下:
[NoCache]
[CheckSessionExpire]
public ActionResult GetSomething()
{
}
AJAX 调用(JS 部分):
function GetSomething()
{
$.ajax({
cache: false,
type: "GET",
async: true,
url: "/Customer/GetSomething",
success: function (data) {
},
error: function (xhr, ajaxOptions, thrownError) {
}
}
Web Config 身份验证设置:
<authentication mode="Forms">
<forms loginUrl="default.aspx" protection="All" timeout="3000" slidingExpiration="true" />
</authentication>
我尝试通过在进行 ajax 调用之前删除浏览器烹饪来检查它,但事件“CheckSessionExpireAttribute”不会被触发 - 请有任何想法。
谢谢,
@保罗