加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – Asp.net MVC – 如何检查Ajax请求的会话过期

发布时间:2020-12-16 03:46:15 所属栏目:asp.Net 来源:网络整理
导读:我们正在整个应用程序中使用Ajax调用 – 尝试在尝试执行任何Ajax请求时,如果会话已经过期,则尝试找到重定向到登录页面的全局解决方案.我已经编写了以下解决方案,从这篇文章中获取帮助 – Handling session timeout in ajax calls 不确定为什么在我关心的事件
我们正在整个应用程序中使用Ajax调用 – 尝试在尝试执行任何Ajax请求时,如果会话已经过期,则尝试找到重定向到登录页面的全局解决方案.我已经编写了以下解决方案,从这篇文章中获取帮助 – Handling session timeout in ajax calls

不确定为什么在我关心的事件中“HandleUnauthorizedRequest”没有被解雇.

自定义属性:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
    public class CheckSessionExpireAttribute :AuthorizeAttribute
    {
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                var url = new UrlHelper(filterContext.RequestContext);
                var loginUrl = url.Content("/Default.aspx");

                filterContext.HttpContext.Session.RemoveAll();
                filterContext.HttpContext.Response.StatusCode = 403;
                filterContext.HttpContext.Response.Redirect(loginUrl,false);
                filterContext.Result = new EmptyResult();
            }
            else
            {
                base.HandleUnauthorizedRequest(filterContext);
            }

        }

    }

在控制器操作中使用Above自定义属性如下:

[NoCache]
 [CheckSessionExpire]
 public ActionResult GetSomething()
 {
  }

AJAX Call(JS部分):

function GetSomething()
{
   $.ajax({
        cache: false,type: "GET",async: true,url: "/Customer/GetSomething",success: function (data) {

        },error: function (xhr,ajaxOptions,thrownError) {

        }
}

Web配置身份验证设置:

<authentication mode="Forms">
      <forms loginUrl="default.aspx" protection="All" timeout="3000" slidingExpiration="true" />
    </authentication>

我尝试通过删除浏览器烹饪来检查它,然后进行ajax调用,但事件“CheckSessionExpireAttribute”没有被解雇 – 请任何想法.

谢谢,

@保罗

解决方法

如果我的问题是正确的(即使我没有,无论如何,谢谢,帮助我解决了我自己的情况),你想要避免的是让你的登录页面加载到一个元素中,该元素应该显示不同的View via阿贾克斯.那个或在Ajax表单帖子中获取异常/错误状态代码.

因此,简而言之,注释类将需要覆盖2个方法,而不仅仅是HandleUnauthorizedRequest,它将重定向到JsonResult Action,它将为您的Ajax函数生成参数以了解要执行的操作.

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method,AllowMultiple = true,Inherited = true)]
public class SessionTimeoutAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        IPrincipal user = filterContext.HttpContext.User;
        base.OnAuthorization(filterContext);
        if (!user.Identity.IsAuthenticated) {
            HandleUnauthorizedRequest(filterContext);
        }
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAjaxRequest())
        {
            filterContext.Result = new RedirectToRouteResult(new
            RouteValueDictionary(new { controller = "AccountController",action = "Timeout" }));
        }
    }
}

然后在您的身份验证操作中设置此注释,因此每次调用它时,它都会知道请求的来源以及应该给出的返回类型.

[AllowAnonymous]
[SessionTimeout]
public ActionResult Login() { }

然后你重定向的Json Action:

[AllowAnonymous]
public JsonResult Timeout()
{
    // For you to display an error message when the login page is loaded,in case you want it
    TempData["hasError"] = true;
    TempData["errorMessage"] = "Your session expired,please log-in again.";

    return Json(new
    {
        @timeout = true,url = Url.Content("~/AccountController/Login")
    },JsonRequestBehavior.AllowGet);
}

然后在你的客户端函数中(我有权将它写为$.get()而不是$.ajax():

$(document).ready(function () {
    $("[data-ajax-render-html]").each(function () {
        var partial = $(this).attr("data-ajax-render-html");
        var obj = $(this);

        $.get(partial,function (data) {
            if (data.timeout) {
                window.location.href = data.url;
            } else {
                obj.replaceWith(data);
            }
        }).fail(function () {
            obj.replaceWith("Error: It wasn't possible to load the element");
        });
    });
});

此函数使用此data-ajax-render-html属性替换html标记,该属性包含要加载的View地址,但您可以通过更改html()属性的replaceWith将其设置为在标记内加载.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读