当前位置: 首页 > news >正文

ajax与302响应

在ajax请求中,如果服务器端的响应是302 Found,在ajax的回调函数中能够获取这个状态码吗?能够从Response Headers中得到Location的值进行重定向吗?让我们来一起看看实际情况。

使用jquery的$.ajax()发起ajax请求的javascript代码如下:

<span style="font-size:18px;"><span style="font-size:18px;">$.ajax({
    url: '/oauth/respond',
    type: 'post',
    data: data,
    complete: function(jqXHR){
        console.log(jqXHR.status);
    },
    error: function (xhr) {
        console.log(xhr.status);
    }
});</span></span>

当服务器端返回302 Found的响应时,浏览器中的运行结果如下:


在ajax的complete()与error()回调函数中得到的状态码都是404,而不是302。

原来,当服务器将302响应发给浏览器时,浏览器并不是直接进行ajax回调处理,而是先执行302重定向——从Response Headers中读取Location信息,然后向Location中的Url发出请求,在收到这个请求的响应后才会进行ajax回调处理。大致流程如下:

ajax -> browser -> server -> 302 -> browser(redirect) -> server -> browser -> ajax callback

而在我们的测试程序中,由于302返回的重定向URL在服务器上没有相应的处理程序,所以在ajax回调函数中得到的是404状态码;如果存在对应的URL,得到的状态码就是200。

所以,如果你想在ajax请求中根据302响应通过location.href进行重定向是不可行的。

如何解决?

【方法一】

继续用ajax,修改服务器端代码,将原来的302响应改为json响应,比如下面的ASP.NET MVC示例代码:

<span style="font-size:18px;">return Json(new { status = 302, location = "/oauth/respond" });</span>

ajax代码稍作修改即可:

<span style="font-size:18px;">$.ajax({
    url: '/oauth/respond',
    type: 'post',
    data: data,
    dataType: 'json',
    success: function (data) {
        if (data.status == 302) {
            location.href = data.location;
        }
    }
});</span>

【方法二】

 不用ajax,改用form

<span style="font-size:18px;"><form method="post" action="/oauth/respond">
</form></span>



转载自:http://www.cnblogs.com/dudu/p/ajax_302_found.html







相关文章:

  • 服务器缓存技术
  • squid学习(一)
  • 使用Redis之前5个必须了解的事情
  • 大数据框架 Hadoop 和 Spark 的异同
  • 下载tomcat9并正常启动后,浏览器无法显示localhost:8080对应网页
  • Java对象的序列化和反序列化
  • Spring连接数据库的几种常用的方式
  • 千万级规模高性能、高并发的网络架构经验分享
  • java高并发解决方案
  • 数据库Sharding的基本思想和切分策略
  • mysql中的unsigned
  • 下班后两小时,决定你将会成为怎样的人
  • MySQL索引使用方法和性能优化
  • Tomcat的性能与最大并发数
  • mcq 轻量级的消息队列
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • Debian下无root权限使用Python访问Oracle
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • JS+CSS实现数字滚动
  • leetcode98. Validate Binary Search Tree
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 从输入URL到页面加载发生了什么
  • 排序算法之--选择排序
  • 强力优化Rancher k8s中国区的使用体验
  • 如何编写一个可升级的智能合约
  • 世界上最简单的无等待算法(getAndIncrement)
  • 延迟脚本的方式
  • 一道闭包题引发的思考
  • 一些css基础学习笔记
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • # Panda3d 碰撞检测系统介绍
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (小白学Java)Java简介和基本配置
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • . Flume面试题
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .java 9 找不到符号_java找不到符号
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET MVC之AOP
  • .NET开发者必备的11款免费工具
  • .NET框架设计—常被忽视的C#设计技巧
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • .so文件(linux系统)
  • :not(:first-child)和:not(:last-child)的用法
  • @font-face 用字体画图标
  • @JsonSerialize注解的使用
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798