jQuery.ajax 跨域请求webapi设置headers的解决方案

下面是详细讲解“jQuery.ajax 跨域请求webapi设置headers的解决方案”的完整攻略:

背景

在Web开发中,由于安全限制,浏览器禁止跨域访问,因此跨域请求时需要采取一定的措施,在服务器端进行一定的设置。而在使用jQuery进行跨域请求时,如果需要设置请求头(headers),就需要特别注意。

解决方案

方案一:在后台进行修改

如果对后台进行修改,开放一定的请求头,就可以解决问题。

具体方法如下:

  1. 在 WebAPI 中的 WebApiConfig 类中添加如下代码:
    public static void Register(HttpConfiguration config)
    {
        // 只允许指定的头字段
        var cors = new EnableCorsAttribute("*", "*", "*");
        config.EnableCors(cors);
        // 其他配置
    }

在此代码中,* 表示允许所有源、所有头和所有方法。

  1. 在 WebAPI 中支持 OPTIONS 请求
    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
        {
            Response.Flush();
        }
    }

此代码中,首先判断请求头是否包含“Origin”,如果包含并且请求方法是“OPTIONS”,则请求前通过 Response.Flush() 先响应,这样就可以防止 OPTIONS 请求发往 WebAPI 方法了。

方案二:使用JSONP跨域请求

JSONP 可以解决跨域的问题,其实现原理是在请求时动态产生一个 <script> 标签,服务端返回一段JavaScript代码,再将其追加到网页中。这种做法可以解决浏览器对于跨域请求不支持 cookie 的问题,而且入门还比较简单。

具体方法如下:

  1. 在JS代码中添加:
        $.ajax({
            url: "http://www.server.com/getdata.js",
            dataType: "jsonp",
            // 定义 JSONP 的回调名称
            jsonp: "callback",
            // 服务端返回值接收方法的名称
            jsonpCallback: "dealResponse",
            success: function (result) {
                console.log(result);
            }
        });

        function dealResponse(data) {
            console.log(data);
        }
  1. 在 ASP.NET WebAPI 项目中添加一个控制器:
    public class GetJsonpDataController : ApiController
    {
        [HttpGet, ActionName("Get"), AllowAnonymous]
        public string Get(string callback)
        {
            return string.Format("{0}({1});", callback, "{'name': '张三', 'age': '18'}");
        }
    }

在此代码中,将结果字符串用 {callback}({result string}); 的格式返回,浏览器会自动分析 callback 参数,然后将 {result string}callback 为函数名包裹在一个 script 标签里远程调用。

示例说明

这里给出两个示例进行说明:

示例一:WebAPI 请求header无效问题

在前端页面中使用 jQuery.ajax 进行跨域请求 WebAPI 接口时,如果想要在 headers 中加入某个参数,其实大家一般是采取如下代码:

        $.ajax({
            url: "http://www.server.com/api/getdata",
            type: "POST",
            dataType: "json",
            data: JSON.stringify({}),
            async: true,
            headers: {
                "Token":"xxxxxxx"
            },
            success: function(result){},
            error: function(){alert("Error");}
        });

然而,这种方式在部分浏览器中可能会产生错误,导致 header 参数无法传送到 WebAPI 的问题。原因是:jQuery ajax 在 POST 跨域请求时不管在 headers 中设置什么参数,服务端都无法读取,但是在GET跨域请求时一切正常。

解决办法就是在服务端 WebAPI 中添加如下代码,即可解决问题:

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
        {
            Response.Flush();
        }

        var origin = Request.Headers["Origin"];

        if (Request.Headers.AllKeys.Contains("Origin"))
        {
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", origin);
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "*");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "*");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true");
        }
    }

示例二:jQuery ajax 跨域“丢失”数据问题

假如在 jQuery ajax 跨域请求时,由于调用了原生ajax的调用方式,因此可能会丢失数据。

解决办法就是不要使用原生ajax,而是使用jquery自带的ajax。采用如下代码:

        $.ajax({
            url: "http://www.server.com/api/getdata",
            type: "POST",
            dataType: "json",
            data: JSON.stringify({}),
            async: true,
            headers: {
                "Token":"xxxxxxx"
            },
            success: function(result){},
            error: function(){alert("Error");}
        });

这样就可以使用了!其中,url参数表示调用的远程地址,type指定调用类型(HTTP的get和post等),data则是向远程地址发送的数据。这里的 data 是从一个 JSON 对象里面动态生成的。如果您希望使用常规格式的表单数据,也可以使用 jquery 库中提供的 $.param 函数。同时,headers 指定了一个 HTTP 头部包含数据。最后,Promise对象可以将异步请求的结果返回,使用 then 方法进行处理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:jQuery.ajax 跨域请求webapi设置headers的解决方案 - Python技术站

(1)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 前端随心记———云计算(1)

    云计算的定义(NIST) –  云计算是一种能够通过网络以便利的、按需的方式获取计算资源(网络、服务器、存储、应用和服务)的模式 –  这些资源来自一个共享的、可配置的资源池,并能够快速获取和释放,提供资源的网络被称为“云” –  云模式能够提高可用性 –  云计算的核心思想,是将大量用网络连接的计算资源统一管理和调度,构成一个计算资源池向用户按需服务。  …

    2023年4月10日
    00
  • 云计算市场确实非常火爆,在云计算实施过程中有哪些误区

    中国云计算市场确实非常火爆,不管是政府还是行业用户、企业,但目前在云计算实施过程中有很多误区: 一是重实施、轻规划和咨询,从CIO反馈的情况来看,云计算开始实施时,前期的评估、规划、咨询很少; 二是重硬件、轻软件,一谈到云就是买服务器、存储、网络设备,只重视服务器的虚拟化; 三是重概念、轻本质,云计算最早发源于美国,核心是降低成本,但CIO们反映,其实云计算…

    云计算 2023年4月12日
    00
  • 云计算到来,IT部门还有多少事情可做?

    云计算的好处   云计算存在于虚拟化、标准化和自动化三要素基础上,因此用户在使用云计算时将体会到极大的便利,也将有望迎来显著的成本下降。比如能降低基础设施、人力、硬件的投入。IBM说,他们能在基础设施、人力投入、硬件3方面降低共83.3%的成本(实际上,我猜测这是对于一个非常糟糕的原有IT结构而言)   埃森哲对云计算有一句非常精准的描述:“云计算就是敏捷”…

    云计算 2023年4月13日
    00
  • Django执行python manage.py makemigrations报错的解决方案分享

    当我们想对Django项目的模型进行修改时,需要执行python manage.py makemigrations命令生成迁移文件。但有时候,当我们执行这个命令时,可能会遇到一些错误,例如: No changes detected 当我们没有对项目的模型进行任何修改时,执行python manage.py makemigrations会提示”No chang…

    云计算 2023年5月18日
    00
  • “创新雷神号”卫星成功发射,华为云分布式云原生“天地一体”首次组网成功

    2022年2月27日,我国在文昌发射场使用长征八号运载火箭,以“1箭22星”方式,成功将“创新雷神号”卫星等共22颗卫星发射升空。卫星主要用于提供商业遥感信息、海洋环境监测、森林防火减灾等服务。其中“创新雷神号” 作为“天算星座”计划的第二颗先导试验星,主要基于由北京邮电大学、华为云、北京大学联合研制的星地融合分布式网络验证平台开展试验验证。 “天算星座”计…

    云计算 2023年4月10日
    00
  • java使用es查询的示例代码

    Java使用ES查询的示例代码 本文将介绍Java使用ES查询的示例代码的完整攻略,包括ES查询的基本原理、Java使用ES查询的步骤、示例代码等。 1. ES查询的基本原理 ES查询是基于Lucene的全文搜索引擎,它可以对文本、数字、日期等数据进行高效的搜索和分析。ES查询的基本原理是将数据存储在索引中,然后通过查询语句来搜索索引中的数据。 2. Jav…

    云计算 2023年5月16日
    00
  • c# 通过WinAPI播放PCM声音

    下面就是一篇详细讲解“c# 通过WinAPI播放PCM声音”的完整攻略。 1. 背景知识 在开始讲解之前,我们需要了解一些背景知识:PCM(Pulse Code Modulation)脉冲编码调制,是一种数字音频编码方式,将模拟声音信号转换为数字信号,并以数字的形式进行存储和传输。在WinAPI中,我们可以使用waveOut API来播放PCM声音。 2. …

    云计算 2023年5月17日
    00
  • JavaScript操作元素实例大全

    JavaScript操作元素实例大全 本文将提供一个完整的攻略,包括如何使用JavaScript操作元素实例。以下是详细步骤: 步骤1:获取元素 在使用JavaScript操作元素之前,我们需要先获取元素。可以使用document对象的方法来获取元素。以下是一个示例说明,演示如何获取元素: // 通过id获取元素 const elementById = do…

    云计算 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部