1.前言

遇到这样一种情况,打开网页两个窗口a,b(都是已经登录授权的),在a页面中退出登录,然后在b页面执行增删改查,这个时候因为授权原因,b页面后端的请求肯定出现异常(对这个异常的处理,进行内部跳转处理),b页面中的ajax请求的回调中就会出现问题,今天遇到了,有种恍然大悟的感觉,打开以前公司的网站发现全都没做任何处理......

没遇到过错误,永远不知道错误会什么时候出现。

2.问题:在ajax异步请求中,如果服务端出现内部跳转,如何在回调中处理

我们先来看这样一个简单的ajax异步请求

$.ajax({
url: '/User/Add',
type: 'post',
data: data,
success:function(data,status)
{
console.log('data:'+data);
console.log('status:'+status);
},
complete: function(xhr){
console.log(xhr.status);
},
error: function (xhr) {
debugger;
console.log(xhr.status);
}
});

后端处理时,抛出异常,出现了内部重定向

稍微简单解释一下,用的mvc,加了一个全局的异常,在Add方法中抛出异常,在OnException会进行捕获到这个异常,代码很简单也比较典型。

    public class GlobalHandlerErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext actionExecutedContext)
{
actionExecutedContext.HttpContext.Response.Redirect("/User/Login");
}
}
        public ActionResult Add(UserModel model)
{
throw new HttpException("un authorize");
}

结果是什么?

回调中会进入到success方法,输入data:是Login页面的整个内容,status:success ,完成回调complete中输出的是200,并不会和我们预期进入到error方法中来。

3.原因

用一句话来形容上面的问题就是:ajax异步请求A,A内部重定向到B。

得到的答案是:

1.ajax回调方法success中得到是B页面内容

2.ajax是用于处理数据的,并不会按照服务器的内部跳转而进行跳转,如果要跳转可以根据回调中信息进行跳转。

3.ajax请求,后端出现跳转,不会进入到error回调中的,当然回调中跳转到一个不存在的页面,那是会进入error方法中来的。

当服务器将302响应发给浏览器时,浏览器并不是直接进行ajax回调处理,而是先执行302重定向,回调success中获取的内容是重定向后的页面。

jquery源码中是这样写的,http状态码200-300或者304才会进入success回调的

isSuccess = status >= 200 && status < 300 || status === 304;//确定请求是否成功

// Cache response headers
responseHeadersString = headers || ""; // Set readyState
jqXHR.readyState = status > 0 ? 4 : 0; // Determine if successful
isSuccess = status >= 200 && status < 300 || status === 304; // Get response data
if ( responses ) {
response = ajaxHandleResponses( s, jqXHR, responses );
} // Convert no matter what (that way responseXXX fields are always set)
response = ajaxConvert( s, response, jqXHR, isSuccess ); // If successful, handle type chaining
if ( isSuccess ) { // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
if ( s.ifModified ) {
modified = jqXHR.getResponseHeader("Last-Modified");
if ( modified ) {
jQuery.lastModified[ cacheURL ] = modified;
}
modified = jqXHR.getResponseHeader("etag");
if ( modified ) {
jQuery.etag[ cacheURL ] = modified;
}
} // if no content
if ( status === 204 || s.type === "HEAD" ) {
statusText = "nocontent"; // if not modified
} else if ( status === 304 ) {
statusText = "notmodified"; // If we have data, let's convert it
} else {
statusText = response.state;
success = response.data;
error = response.error;
isSuccess = !error;
}
} else {
// We extract error from statusText
// then normalize statusText and status for non-aborts
error = statusText;
if ( status || !statusText ) {
statusText = "error";
if ( status < 0 ) {
status = 0;
}
}
}

4.如何处理ajax异步请求后端跳转

ajax异步请求数据,后端出现跳转,这个时候说明程序出现了异常,可以捕获到这个异常,返回给前端,前端ajax根据返回信息,进行判断,给出正确的提示。

在全局异常中可以这样返回给前端

            actionExecutedContext.Result = new JsonResult()
{
Data = new ViewModels.Web.Response.JsonResultModel()
{
code = 302,
message = "具体的错误信息",
success = false
}
};

前端可以进行判断,给出相应的提示信息或者直接跳转

$.ajax({
url: '/User/Add',
type: 'post',
data: data,
success:function(data,status)
{
if(code==302)
{
alert(data.message);
//location.href='/User/Login' 也可以在返回类型加一个字段location,那就直接location.href='/User/Login/'
}
console.log('data:'+data);
console.log('status:'+status);
},
complete: function(xhr){
console.log(xhr.status);
},
error: function (xhr) {
debugger;
console.log(xhr.status);
}
});

5.总结

1.ajax success回调处理,具体状态码为 status >= 200 && status < 300 || status === 304

2.ajax是用于异步获取数据的,并不是用于页面跳转

3.mvc中,如果给某些方法设置权限,就会导致权限验证,从而产生跳转登陆界,应该加上全局的异常捕获,既然是ajax请求,说明请求数据出现异常,应该给出相应的错误信息提示,这个提示也应该在服务器进行确定,前端负责展示。

4.ajax异步请求中,服务器不应该出现直接跳转。

有兴趣的可以关注一下我的微信公众号[dotNet全栈开发],分享一些编程相关的经典文章

ajax异步请求302分析的更多相关文章

  1. ajax异步请求302

    我们知道,只有请求成功ajax才会进行回调处理,具体状态码为 status >= 200 && status < 300 || status === 304; 这一点通过查 ...

  2. jquery Ajax异步请求之session

    写了一个脚本,如下: $(function () { $("#btnVcode").click(function () { var receiveMobile = $(" ...

  3. ajax异步请求Response.Redirect重定向

    一个ajax异步请求报错->捕获异常->重定向错误提示页面.  一个简单的流程 结果一直搞不定.重定向无效.各种百度之. 后来突然想起 ajax的请求是不能在后台重定向的. 如果硬要重定向 ...

  4. ajax异步请求实例

    1. 问题分析 用户管理显示页面:usermanagement.tpl(也可以说是MVC中的V,即视图) 用户管理数据发送页面:usermanagement.php(也可以说是MVC中的M,即模型) ...

  5. ajax异步请求

    做前端开发的朋友对于ajax异步更新一定印象深刻,作为刚入坑的小白,今天就和大家一起聊聊关于ajax异步请求的那点事.既然是ajax就少不了jQuery的知识,推荐大家访问www.w3school.c ...

  6. spring HandlerInterceptorAdapter拦截ajax异步请求,报错ERR_INCOMPLETE_CHUNKED_ENCODING

    话不多说,直接上正文. 异常信息: Failed to load resource: net::ERR_INCOMPLETE_CHUNKED_ENCODING 问题描述: 该异常是在页面发送ajax请 ...

  7. jquery的ajax异步请求接收返回json数据

    http://www.jb51.net/article/51122.htm jquery的ajax异步请求接收返回json数据方法设置简单,一个是服务器处理程序是返回json数据,另一种就是ajax发 ...

  8. MVC&WebForm对照学习:ajax异步请求

    写在前面:由于工作需要,本人刚接触asp.net mvc,虽然webform的项目干过几个.但是也不是很精通.抛开asp.net webform和asp.net mvc的各自优劣和诸多差异先不说.我认 ...

  9. AJAX异步请求原理和过程

    AJAX 指异步 JavaScript 及 XML(Asynchronous JavaScript And XML),它不是一种新的编程语言,而是一种使用现有标准的新方法. AJAX 基于 JavaS ...

随机推荐

  1. python 中的csv读写

    1.首先 import csv 2.读一个csv文件 data = open(filename) lines = csv.reader(data)  #reader 函数和 dirtreader函数的 ...

  2. Node笔记五-进程、线程

    进程 -每一个正在运行的应用程序都称之为进程 -每一个应用程序都至少有一个进程 -进程是用来给应用程序提供一个运行的环境 -进程是操作系统为应用程序分配资源的一个单位线程 -用来执行应用程序中的代码 ...

  3. quick-cocos2d-x与 cocos2d-x的关系

    quick-cocos2d-x(后文简称 quick)与 cocos2d-x 的关系,用一句话概括:quick 是 cocos2d-x 针对 Lua 的豪华套装威力加强版. 那 quick 与 coc ...

  4. 【转】Python的下划线

    原文: 1. Python中的下划线(译文) 2. [转]关于python中带下划线的变量和函数的意义 总结: 1. 单下划线开头.保护变量,不可被其他包导入使用,除非在__all__声明可以显示引用 ...

  5. Python 基础【一】

    python运行流程 一.变量及注释 命名: 合法-变量名由字母.数字和下划线组成,并且不能以数字开头.以下保留字不可以当变量名: ['False', 'None', 'True', 'and', ' ...

  6. Java开源生鲜电商平台-订单表的设计(源码可下载)

    Java开源生鲜电商平台-订单表的设计(源码可下载) 场景分析说明: 买家(餐馆)用户,通过APP进行选菜,放入购物车,然后下单,最终支付的流程,我们称为下单过程. 买家可以在张三家买茄子,李四家买萝 ...

  7. 云计算一:VMware workstation的安装和使用教程

    VMware workstation的安装和使用教程 一.VMware 安装 1.从网上找到VMware的安装包以及要安装的映像文件,下载到本地,然后备份一份存储到百度云盘. 链接:http://pa ...

  8. vue项目 构建 打包 发布 三部曲

    一.vue项目的创建 1.首先第一肯定是要有Node.js及npm这个不多说了2.安装脚手架 此时可以直接浏览-但是现在肯定有很多小白想将他发布到gitHub上并可以浏览,使用vue全家桶制作自己的博 ...

  9. 手把手教你如何安装Pycharm——靠谱的Pycharm安装详细教程

    今天小编给大家分享如何在本机上下载和安装Pycharm,具体的教程如下: 1.首先去Pycharm官网,或者直接输入网址:http://www.jetbrains.com/pycharm/downlo ...

  10. 【转】深入理解margin

    由浅入深漫谈margin属性 2007-3-18 上午 - HTML/CSS/XML/XSL - CSS - margin margin 在中文中我们翻译成外边距或者外补白(本文中引用外边距).他是元 ...