我有一个MVC应用程序,它使用$ .ajax从Controller获取数据。
不幸的是,当会话超时发生时,页面不会被重定向到Login页面。有人可以帮忙解决这个问题吗?
谢谢。
答案 0 :(得分:2)
您可以编写一个自定义[Authorize]属性,该属性将返回JSON,而不是在未经授权的访问时抛出401异常,这将允许客户端脚本优雅地处理该方案:
AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyAuthorizeAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new JsonResult
{
Data = new
{
// put whatever data you want which will be sent
// to the client
message = "sorry, but you were logged out"
},
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
}
在ajax你可以这样做:
$.get('@Url.Action("SomeAction")', function (result) {
if (result.message) {
alert(result.message);
window.location.reload();
} else {
// do whatever you were doing before with the results
}
});
答案 1 :(得分:0)
如果默认情况下页面要重定向,您可以尝试捕获特定的超时/身份验证错误,并根据此错误从客户端重定向到登录控制器
这里有一篇来自本文的例子
$.ajax({
url: "/yourservlet",
data: { },
complete: function(xmlHttp) {
if(xmlHttp.status==401)
{
// redirect to login page
}
}
});