要在会话超时以进行Ajax请求时将用户重定向到登录页面,我实现了以下自定义属性,
与取消授权请求相关的代码如下,
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.HttpContext.Response.StatusCode = 403;
filterContext.Result = new JsonResult
{
Data = new
{
Error = "SessionTimeOut"
},
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
filterContext.HttpContext.Response.End();
}
....................
这适用于ajax请求($ .ajax)。
但是filterContext.HttpContext.Request.IsAjaxRequest()无法将XMLHttp请求识别为ajax请求。
var xhr = new XMLHttpRequest();
xhr.open('POST', "...URL");
xhr.send(formdata);
有没有人遇到过类似的问题?什么是解决方案?
答案 0 :(得分:2)
这是ASP.NET MVC 5中IsAjaxRequest()
的代码
public static bool IsAjaxRequest(this HttpRequestBase request)
{
if (request == null)
{
throw new ArgumentNullException("request");
}
return request["X-Requested-With"] == "XMLHttpRequest" || (request.Headers != null && request.Headers["X-Requested-With"] == "XMLHttpRequest");
}
看起来请求中存在对某个标头值(X-Requested-With
)的依赖,以使该函数返回true。
以下是X-Requested-With
What's the point of the X-Requested-With header?
您可以随时查看jQuery $.ajax()
代码本身,看看它是如何设置标头的。老实说,无论如何我都不会在没有jQuery的情况下做ajax,它会为你处理所有这些事情。