ajax异域请求jsonp,Java Ajax jsonp 跨域请求

news/2024/10/23 9:29:13/

一、什么是JSONP

通常来讲位于 server1.example.com 的网页没法与不是 server1.example.com的服务器沟通,而 HTML 的 元素是一个例外。利用 元素的这个开放策略,网页能够获得从其余来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并非 JSON,而是任意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。

JSONP是一种协议,为了解决客户端请求服务器跨域的问题,可是并不是是正式的传输协议。该协议的一个要点就是容许用户传递一个callback参数给服务端,而后服务端返回数据时会将这个callback参数做为函数名来包裹住JSON数据,这样客户端就能够随意定制本身的函数来自动处理返回数据了.javascript

二、Ajax 请求其余域接口

我这个项目要请求另一个第一个后台接口请求数据,在页面渲染的时候,经过ajax加载数据以下:java

$.ajax({

url: 'http://www.xxx.cn/lalala?method=10082&page=1&pageSize=10',

type: 'GET',

dataType: 'json',

timeout: 5000,

contentType: 'application/json; charset=utf-8',

success: function (result) {

alter("aaaa");

}

});

这样就出现跨域的错误,以下所示:jquery

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. The response had HTTP status code 500.ajax

bVAioR

这里就说明不容许跨域请求,那么怎么办? 换成jsonp好了。就改了dataType这个字段。json

$.ajax({

url: 'http://www.xxx.cn/lalala?method=10082&page=1&pageSize=10',

type: 'GET',

dataType: 'jsonp',

timeout: 5000,

contentType: 'application/json; charset=utf-8',

success: function (result) {

alter("aaaa");

}

});

结果: Uncaught SyntaxError: Unexpected token!跨域

what the fuck!bVAio1 明明请求回来数据,结果仍是报错。缘由是ajax请求服务器,而返回的数据格式不符合jsonp的返回格式,那么jsonp格式是什么样的?浏览器

Callback({msg:'this is json data'})

这是什么叼东西,奇葩谁定义的!若是你这么想,看来你没有仔细看第1点,JSON是一种轻量级的数据交换格式,像xml同样。JSONP是一种使用JSON数据的方式,返回的不是JSON对象,是包含JSON对象的javaScript脚本。可是上图是一段json串,因此报错啦。服务器

三、参数返回处理

有一点你会发如今你是用jsonp协议请求时,在参数中除了本身填写的参数外还有名为callback的参数,如图:

bVAipbapp

看看这个参数是什么东西,由于我在ajax请求的时候没有指定,jsonp这个参数,那么系统默认参数名为“callback”。没有指定jsonpCallback参数, 那么jquery会生成随机的函数名,如上图所示。函数

好比我以下配置:

$.ajax({

url: 'http://www.xxx.cn/lalala?method=10082&page=1&pageSize=10',

type: 'GET',

dataType: 'jsonp',

jsonp:'callbacka',//传递给请求处理程序或页面的,用以得到jsonp回调函数名的参数名(默认为:callback)

jsonpCallback:"success_jsonpCallback",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名

timeout: 5000,

contentType: 'application/json; charset=utf-8',

success: function (result) {

alter("aaaa");

}

});

那么服务器亦能够经过下面方法获取回调的函数名:

string callbackFunName =request.getParameter("callbacka");//获取的就是success_jsonpCallback 字符串

注意:系统会区分函数名大小写。

bVAipB

那么下面按照格式包装一下看看咯:

String callback = request.getParameter("callback"); //不指定函数名默认 callback

return callback+ "(" + jsonStr + ")"

包了一下,结果然的不报错,看下返回数据以下图:

bVAiqs

四、JSONP的执行过程

首先在客户端注册一个callback (如:'jsoncallback'), 而后把callback的名字(如:jsonp1236827957501)传给服务器。注意:服务端获得callback的数值后,要用jsonp1236827957501(......)把将要输出的json内容包括起来,此时,服务器生成 json 数据才能被客户端正确接收。

而后,以 javascript 语法的方式,生成一个function, function 名字就是传递上来的参数 'jsoncallback'的值 jsonp1236827957501 .

最后,将 json 数据直接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。客户端浏览器,解析script标签,并执行返回的 javascript 文档,此时javascript文档数据,做为参数, 传入到了客户端预先定义好的 callback 函数(如上例中jquery $.ajax()方法封装的的success: function (json))里。


http://www.ppmy.cn/news/941081.html

相关文章

ajax异域提醒框,使用jsonp跨域调用百度js实现搜索框智能提示,并实现鼠标和键盘对弹出框里候选词的操作【附源码和在线测试地址】...

项目中常常用到搜索,特别是导航类的网站。自己做关键字搜索不太现实,直接调用百度的是最好的选择。 使用jquery.ajax的jsonp方法可以异域调用到百度的js并拿到返回值,当然$.getScript也可以实现跨域调用js。 ok,了解了jsonp的原理…

新飞飞不显示服务器,《新飞飞》官方网站-新资料片《异域远征军》-网易Q萌战斗网游...

1、本游戏是一款即时制角色扮演类游戏,适用于年满12周岁及以上的用户,建议未成年人在家长监护下使用游戏产品。我们鼓励家长根据未成年人的实际情况管理其游戏行为,家长可以关注“网易家长关爱平台”微信公众号、拨打官方客服电话95163611或者…

异域之末路英雄

异域之末路英雄,看了让人伤感,不胜惆怅。

【2020.10.28 校网 普及组 模拟赛 3】T4 1404.最大异域和

题目描述 解题思路 让 x o r xor xor值更大,肯定最好能保证两个数每一个位(二进制位)都不一样,也就是1的位置要不一样 比如: 1001 x o r 0110 1111 , 1001 x o r 1000 0001 1001 xor 0110 1111, 1001 xor 1000 00…

ajax异域请求jsonp,前端ajax请求跨域,使用jsonp完美解决

【1】今天在html中ajax请求另外一个项目的接口出现跨域问题,好吧,那就想办法解决吧,网上百度了有jsonp解决方案,但是其中有各种坑(坑是因为自己不了解导致),直接上源码吧。。。。。。 【前端】 function showImg(){ $.…

ajax异域请求

一、jsonp与jsonpCallback 1.客户端请求代码 $.ajax( { type: "get", url: "http://domain/Handler.ashx", dataType: "jsonp", jsonpCallback: "cb", success: function (data, textStatus, jqXHR) { alert(data); …

ajax异域请求jsonp,[js]ajax-异源请求jsonp

ajax请求-解放每次手动输url js的XMLHttpRequest对象 我们使用XMLHttpRequest对象来发送一个Ajax请求 用xhr发一个ajax请求 因为我是webstorm,因此自带音响哈. 这里我们用ajax来请求这个接口,并将内容打印到console口 var xhr new XMLHttpRequest(); //1.创建xhr对象 xhr.open…

[2020年10月28日普级组]1404.最大异域和

最 大 异 或 和 最大异或和 最大异或和 题目解析 Code #include <cstdio> #include <iostream> #define ll long long using namespace std;int n; ll sum, ans, x, f[40];int main () {scanf ("%d", &n);f[0] 1;for (int i 1; i < 30; i)f[i…