Asp.net MVC 、Extjs 解决Session过期跳到登录界面的问题
1、首先在LoginController里建一个退出方法如下:
public ActionResult LoginOut()
{
return View();
}
在Views里建一个视图LoginOut.cshtml: 添加如下js即可
<script type="text/javascript">
window.top.location.href = "/Login/Index";
</script>
2、再自定义一个过滤器,继承自AuthorizeAttribute
public class MyAuthorizationFilterAttribute : AuthorizeAttribute//,IActionFilter
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext.RouteData.Values["Controller"].ToString() == "Login")
{
//如果是登录页面,则什么都不做
}
else
{
//非登录页面,则验证权限
if (filterContext.HttpContext.Session["userinfo"] == null)
{
if (!filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { Controller = "Login", Action = "LoginOut" }));
}
else
{
filterContext.HttpContext.Response.AddHeader("_timeout", "true");
filterContext.RequestContext.HttpContext.Response.End();
}
}
}
}
}
3、在Scripts里面建一个timeout.js,内容如下:
Ext.Ajax.on('requestcomplete', function (conn, response, options) {
if (response && response.getResponseHeader && response.getResponseHeader('_timeout')) {
window.top.location.href = "/Login/Index";
}
});
4、在_Layout.cshtml引用timeout.js即可。
5、将自定义的过滤器进行如下添加即可。
注:requestcomplete是Extjs中的Ajax的一个event,表示当一次请求成功完成时触发此事件
以上方法能解决Session过期跳到登录界面的问题,但感觉有点复杂。不知有木有啥简单的方法,求共享。