0

我有一个 MVC 应用程序,它使用 $.ajax 从 Controller 获取数据。

不幸的是,当会话超时时,页面不会被重定向到登录页面。有人可以帮助解决这个问题吗?

谢谢你。

4

2 回答 2

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
    }
});
于 2012-07-19T05:57:02.897 回答
0

如果默认情况下页面假设重定向,您可以尝试捕获特定的超时/身份验证错误,并基于此错误从客户端重定向到登录控制器

这里是取自这篇文章的一个例子

http://haacked.com/archive/2011/10/04/prevent-forms-authentication-login-page-redirect-when-you-donrsquot-want.aspx

  $.ajax({
  url: "/yourservlet",
  data: { },
  complete: function(xmlHttp) {
     if(xmlHttp.status==401)
      {
    // redirect to login page

     }
  }
});
于 2012-07-19T05:47:00.577 回答