mvc 实现超时弹窗后跳转

时间:2022-08-25 18:59:38

为了实现保持登录状态,可以用cookie来解决这一问题

假设过期时间为30分钟,校验发生在服务器,借助过滤器,可以这样写

    public class PowerFilter : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
var cookie = HttpContext.Current.Request.Cookies["loginInfo"];
if(null == cookie)
{
filterContext.Result
= new RedirectResult("/admin/login/index");
}
else
{
cookie.Expires
= DateTime.Now.AddMinutes(30);
HttpContext.Current.Response.Cookies.Remove(
"loginInfo");
HttpContext.Current.Response.Cookies.Add(cookie);
}
}
}

但是页面直接跳转了,也没有一个提示,显得不是很友好,可以这样

    public class PowerFilter : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
var cookie = HttpContext.Current.Request.Cookies["loginInfo"];
if(null == cookie)
{
filterContext.Result
= new ContentResult()
{
Content
= string
.Format(
"<script>alert('登录超时,请重新登录');location.href='{0}'</script>","/admin/login/index")
};
}
else
{
cookie.Expires
= DateTime.Now.AddMinutes(30);
HttpContext.Current.Response.Cookies.Remove(
"loginInfo");
HttpContext.Current.Response.Cookies.Add(cookie);
}
}
}
}

但是,假如是ajax请求呢?

    public class PowerFilter : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
var cookie = HttpContext.Current.Request.Cookies["loginInfo"];
if(null == cookie)
{
if(!filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result
= new ContentResult()
{
Content
= string
.Format(
"<script>alert('登录超时,请重新登录');location.href='{0}'</script>","/admin/login/index")
};
}
else
{
filterContext.Result
= new JsonResult()
{
Data
= new { logoff = true,logurl = "/admin/login/index" },
ContentType
= null,
ContentEncoding
= null,
JsonRequestBehavior
= JsonRequestBehavior.AllowGet
};
}
}
else
{
cookie.Expires
= DateTime.Now.AddMinutes(30);
HttpContext.Current.Response.Cookies.Remove(
"loginInfo");
HttpContext.Current.Response.Cookies.Add(cookie);
}
}
}