在你需要登陆验证的action上 加上一个Authentication
如下:
[MyAuthentication] public ActionResult Index() { return View(); }
MyAuthentication.cs
public class MyAuthentication : AuthorizeAttribute { protected override bool AuthorizeCore(HttpContextBase httpContext) { ... } protected override void HandleUnauthorizedRequest(AuthorizationContext context) { if (context == null) { throw new ArgumentNullException("filterContext"); } else { string requestType = context.HttpContext.Request.Headers["X-Requested-With"]; if (!string.IsNullOrEmpty(requestType) && requestType.Equals("XMLHttpRequest", StringComparison.CurrentCultureIgnoreCase)) { context.HttpContext.Response.AppendHeader("sessionstatus", "timeout"); context.HttpContext.Response.StatusDescription = "session timeout."; return; } string path = context.HttpContext.Request.Path; string loginUrl = "......."; context.HttpContext.Response.Redirect(loginUrl, true); } } }
前端js:
$.ajax({ type: "POST", url: url, data: data, datatype: "json", success: function (d) { }, error: function (xhr, status) { if (!AjaxPostSessionFailure(xhr, status, window)) { } else { } } }); //ajax function AjaxPostSessionFailure(xhr, status, window) { var isFail = false; var sessionStatus = xhr.getResponseHeader('sessionstatus'); if (sessionStatus == 'timeout') { var top = window.top; var yes = confirm('由于您长时间没有操作, session已过期, 请重新登录.'); if (yes) { top.location.reload(); } else { isFail = false; } } return isFail; }
这位兄弟好强,直接给出代码。。。。楼主你要是不给分真不够意思了
那你就多封装一个东西呗。。。一般你可以返回三个字段:code和message,url,如果code等于你自定义的未登录的状态就跳转到url呗。。。
建一个基类 。Public Class ModelBase{
public int Errcode{get;set;} //状态码,这个你自己定义
public string Message{get;set;} //一般提示信息
public string Url{get;set;} //处理后需要进行跳转的地址
public object data{get;set;} //这个可以无视,部分需要返回数据集
}
建好这么一个基类之后。你Ajax请求Action进行操作的时候,先实例化一手这个实体。然后在你判断session["userinfo"]是不是空的时候开始赋值。 modelbase.Errcoe=-200;modelbase.Message="信息为空"; modelbase.Url="你需要跳转的地址"。 在return 的时候 return base.json(modelbase)即可。然后前面的ajax success里返回的(data)。你只需要data.ErrCode>0等判断,然后就做自己想做的事情就行。或者直接在Action里。return RedirectToAction("Action", "Controller"); 。
你再action判断,如果为空 返回 return this.Json(new {Result:string.Empty,Error: 0});
js接受时,如果data.Error === 0 ,window.location.href 跳转
偶觉得你很有道理。赞
楼主可以试试建立一个过滤器,加载action上。过滤器的规则就是遇到无效的session进行跳转。ajax访问的时候看看会不会跳转,我没有试过哦。