在mvc4中我有一个过滤器 在每一个action前都会先调用一次,里面的方法是用来判断用户是否登录如果是程序发出的请求还好可以重定向到登录页面 但ajax 的请求就无法重定向,我现在有一个解决方法但是 还是不完美
这是我的过滤器,如果是ajax的请求就在浏览器头部设置一个标记
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (UserInfo == null)
{
//如果是Ajax 请求的 要特殊处理
if (HttpContext.Request.IsAjaxRequest())
{
//添加头部信息 前端会有ajax回调 判断
Response.AddHeader("sessionstatus", "timeout");
return;
}
else
{
//正常的请求
filterContext.Result = new RedirectToRouteResult(
"Default",
new RouteValueDictionary(
new
{
controller = "Login/Login",
action = "Login"
}));
}
}
else
{
base.OnActionExecuting(filterContext);
}
}
如果标记是ajax的就 在我的js 里设置一段全局的 js代码 如果是标记的 就用js 来定向 登录页面
/**
* 设置未来(全局)的AJAX请求默认选项
* 主要设置了AJAX请求遇到Session过期的情况
*/
$.ajaxSetup({
type: 'POST',
complete: function (xhr, status) {
var sessionStatus = xhr.getResponseHeader('sessionstatus');
if (sessionStatus == 'timeout') {
//var yes = confirm('由于您长时间没有操作, session已过期, 请重新登录.');
//if (yes) {
window.location.href = '/Login/Login/Login';
// }
}
}
});
那么问题来了 我这里 设置完标记后 js也重定向了 但是 我请求的 query 这个查询方法 必须要 全部执行完 才重新定向登录页面
下面这个 方法会执行
public string Query()
{
//string BeginDate = Request.Form["BeginDate"];
//string EndDate = Request.Form["EndDate"];
string MemberNO = Request.Form["MemberNo"];
string MemberName = Request.Form["MemberName"];
int pageIndex = Request.Form["page"] != "" ? Convert.ToInt32(Request.Form["page"]) : 0;
int pageSize = Request.Form["rows"] != "" ? Convert.ToInt32(Request.Form["rows"]) : 0;
StringBuilder WhereCode = new StringBuilder(" CompanyID = "+this.UserInfo.CompanyID);
//if (!string.IsNullOrEmpty(BeginDate))
//{
// WhereCode.Append(" AND (RegisterDate >= '" + BeginDate + "')");
//}
//if (!string.IsNullOrEmpty(EndDate))
//{
// WhereCode.Append(" AND (RegisterDate <= '" + EndDate + "')");
//}
if (!string.IsNullOrEmpty(MemberNO))
{
WhereCode.Append(" AND MemberNo ='" + MemberNO + "'");
}
if (!string.IsNullOrEmpty(MemberName))
{
WhereCode.Append(" AND MemberName like '%" + MemberName + "%'");
}
WhereCode.Append(" AND (Status = 'A') AND (MemberType = '01')");
MemberService memberInfo = new MemberService();
string json = memberInfo.GetMemberInfo(WhereCode.ToString(), pageIndex, pageSize);
return json;
}
不是 谁有好的解决方案 如果我是ajax 的请求 就让请求 不继续 执行 直接重定向