Jquery 会话超时时的Ajax调用
总之,如果在会话超时时进行ajax调用,我将尝试重定向到登录页面。 以下是我到目前为止所做的 为所有操作定义操作筛选器Jquery 会话超时时的Ajax调用,jquery,ajax,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-4,Jquery,Ajax,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 4,总之,如果在会话超时时进行ajax调用,我将尝试重定向到登录页面。 以下是我到目前为止所做的 为所有操作定义操作筛选器 public class AuthenticateFilterAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { base.OnActio
public class AuthenticateFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
var routeDataSet = filterContext.RouteData;
if (LoginUser.LoginAdministrator == null)
{
//if the useinfo stored in session is timeout.
if (routeDataSet != null
&& routeDataSet.Values["controller"] != null
&& routeDataSet.Values["controller"].ToString().ToLower().Equals("login")
&& routeDataSet.Values["action"] != null
&& routeDataSet.Values["action"].ToString().ToLower().Equals("login"))
{
//if it is login action itself.let it be. don't do anything.
}
else
{
//redirect to login page.
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary { { "controller", "Login" }, { "action", "Login" } });
}
}
}
}
这适用于会话超时时的非ajax操作调用。但是对于ajax调用。它不能重定向到登录页面,只能返回一个html页面字符串(似乎是登录页面的源html代码),而不是真正的结果。
假设我们有这样的代码
function ajaxGetLogDetail(logId) {
var sUrl = "/LogDetail/index?logId=" + logId;
$.ajax({
cache: false,
type: "GET",
async: false,
url: sUrl,
success: function (result) {
//please note result is html string. not the really result.
},
error: function (xhr) {
alert(xhr.responseText);
}
});
}
有谁能帮我提供一些解决这个问题的线索吗?谢谢
已更新
基于Mohsin和Dave的回答(谢谢你们两位),这里是最终的解决方案。请复习一下。谢谢
public class AuthenticateFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
var routeDataSet = filterContext.RouteData;
if (LoginUser.LoginAdministrator == null)
{
//&& routeDataSet != null && routeDataSet.Values["controller"] != null
//&& !routeDataSet.Values["controller"].ToString().ToLower().Equals("login") && routeDataSet.Values["action"] != null
//&& !routeDataSet.Values["action"].ToString().ToLower().Equals("login") && !filterContext.HttpContext.Request.HttpMethod.ToLower().Equals("get"))
if (routeDataSet != null
&& routeDataSet.Values["controller"] != null
&& routeDataSet.Values["controller"].ToString().ToLower().Equals("login")
&& routeDataSet.Values["action"] != null
&& routeDataSet.Values["action"].ToString().ToLower().Equals("login"))
{
}
else
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new JsonResult
{
Data = new
{
ErrorMessage = "SystemSessionTimeOut"
},
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
else
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary { { "controller", "Login" }, { "action", "Login" } });
}
}
}
}
}
在客户端:
function ajaxGetLogDetail(logId) {
var sUrl = "/LogDetail/index?logId=" + logId;
$.ajax({
cache: false,
type: "GET",
async: false,
url: sUrl,
success: function (result) {
if (result.ErrorMessage=="SystemSessionTimeOut")
{
windows.location="/Login/Login";
}
else
{
//...
}
},
error: function (xhr) {
alert(xhr.responseText);
}
});
}
Ajax调用不能返回任何类型的重定向。在内核中,AJAX调用只返回字符串。没有执行重定向的引擎 不过,您可以执行客户端重定向。如果会话已超时,并且在客户端,控制器方法返回false:
if !(routeDataSet != null
&& routeDataSet.Values["controller"] != null
&& routeDataSet.Values["controller"].ToString().ToLower().Equals("login")
&& routeDataSet.Values["action"] != null
&& routeDataSet.Values["action"].ToString().ToLower().Equals("login"))
{
return Json(new { success = false, message = errorMessage });
}
在AJAXerror
函数中:
error: function (xhr) {
alert(xhr.responseText);
window.location='/Login/Login';
}
旁注:您的目的地是“/Login/Login”还是“/Account/Login”在从上述过滤器重定向后,您是否可以在视图中使用IsAjaxRequest检查请求类型并做出相应的响应好主意,您是指
filterContext.HttpContext.request.IsAjaxRequest
?谢谢。嗨,莫辛,戴夫给了我更多的细节。因此,唯一的方法是执行客户端重定向。我认为这是你的意思。“Ajax调用不能返回任何类型的重定向。在核心部分,Ajax调用只返回字符串。没有任何类型的引擎可以执行重定向。”但是谁说要执行重定向,您可以调用RedirectToAction,并在查看时切换页面的呈现。这也可以帮助您在登录后轻松重定向到最后一个网页,因为您可以完全控制请求,并且可以绕过常规导航实践Hi,Mohsin,我想我可以通过以下方式重定向到登录后的最后一个网页:window.location='/login/login?lasturl='+lasturl;lastUrl存储当前的查看url。嗨,Dave,你能检查一下我更新的内容吗。谢谢