gpt4 book ai didi

jquery - session 超时时调用 Ajax

转载 作者:行者123 更新时间:2023-12-03 22:48:07 24 4
gpt4 key购买 nike

所有,如果在 session 超时时进行 ajax 调用,我正在尝试重定向到登录页面。这是我到目前为止所做的事情。

为所有操作定义操作过滤器。

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" } });
}
}
}
}

这适用于 session 超时时的非 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 调用的核心仅返回一个字符串。没有执行重定向的引擎。

不过,您可以执行客户端重定向。如果 session 超时并且在客户端让您的 Controller 方法返回 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 });
}

在您的 AJAX error 函数中:

        error: function (xhr) {
alert(xhr.responseText);
window.location='/Login/Login';
}

旁注:您的目的地是“/Login/Login”还是“/Account/Login”

关于jquery - session 超时时调用 Ajax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15001280/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com