【问题标题】:How do you deal with AJAX requests when user session expires, or where the request terminates in a 302当用户会话过期或请求以 302 终止时,您如何处理 AJAX 请求
【发布时间】:2011-09-13 13:16:57
【问题描述】:

已经提出了其他类似的问题,但他们并不倾向于处理通用的多用途解决方案。他们倾向于只处理用户身份验证问题。有时 302 在其他情况下也有效。

那么,如何为 ajax 请求创建通用 302 处理程序,同时为应用程序中的其他任何内容保留功能?

【问题讨论】:

    标签: c# ajax session jquery redirect


    【解决方案1】:

    我们最终提出的解决方案有点老套,但看起来相当优雅。

    首先在 global.asax 文件中拦截来自 ajax 查询的任何 302。

    protected void Application_EndRequest()
    {
        var context = new HttpContextWrapper(Context);
    if (Context.Response.StatusCode == 302 && context.Request.IsAjaxRequest())
        {
            Context.Response.Clear();
            Context.Response.StatusCode = 308;
        }
    }
    

    我们发明了308的状态码,这样浏览器就不会拦截302而导致jquery失败。

    然后在你的 javascript 全局文件的某处,添加以下内容

    $(document).ajaxError(function (e, request, errorThrown, exception) {
        if (request.status == "308") {
            window.location = request.getResponseHeader('location');
        }
    });
    

    这使 jquery 能够检测到重定向,然后将用户定向到请求的页面。

    【讨论】:

      【解决方案2】:

      您似乎可以添加一个条件来检查该特定状态。如果 request 是您的 XMLHttpRequest 对象,则在 readyState 为 4 时额外检查状态:

      if(request.readyState == 4){
        if(request.status == 302) {
          doSomething();
        }
        else {
          doSomethingElse();
        }
      }
      

      编辑:

      或者,或者,如果您不想直接使用 javascript(因为公平起见,您确实将其标记为 jquery-ajax),那么可以这样:

      $.ajax({
        statusCode: {
          302: function() {
            doSomething();
          }
        }
      });
      

      【讨论】:

      • 该解决方案似乎确实存在问题,至少据我检查,因为 302 是由浏览器处理的,当 jquery 获取状态代码时,它实际上并不是302,但设置为 0
      • 或许阅读本文会有所帮助:stackoverflow.com/questions/373087/…
      • 您无法使用 statusCode 捕获 302。它在 jQuery 到达之前由浏览器的 JavaScript 引擎处理,所以你最终会得到 200(或其他)和重定向的响应。
      猜你喜欢
      • 1970-01-01
      • 2013-06-10
      • 2010-11-03
      • 2011-04-17
      • 2014-02-10
      • 2017-12-06
      • 2015-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多