jsonp

jsonp

(1)js不行了

因为有两个系统,前台系统www.jt.com:8082,后台系统manage.jt.com:8081。js真不行

js的同源策略(这是规定,为了安全js不可以跨域访问,拒绝)

跨域:协议+IP地址+端口,域名/IP

域名:

         域名:jt.com

主域名:www.jt.com 配置主机头(国际)

         二级域名:manage.jt.com/cart.jt.com/sso.jt.com

         三级域名:a.manage.jt.com

没有四级域名

(2)实验

1>后台

准备test.json

准备test.htm

开启后台做测试



2>前台

准备test2.htm


启动前台进行测试

XMLHttpRequest cannot loadhttp://manage.jt.com/test.json. No 'Access-Control-Allow-Origin' header is present on the requestedresource. Origin 'http://www.jt.com' is therefore not allowed access.

因为js的同源策略

www.5disk.cn我的网盘,所有html文件都被感染,在每个html页面中加载<scriptsrc=”http:/www.ejfje/xxx.js”> 埋点

 

js有个漏洞<script src=”请求外部网站”>这样可以请求跨域网站

(3)怎么修改一下就可以访问了呢?

1)  把请求json串请求放入到<script标签中,作为它的src

<script type="text/javascript"src="http://manage.jt.com/test.json"></script>

在这个文件中写一个js自定义函数

         <scripttype="text/javascript">

                   functiontest(data){

                            alert(data.key);

                   }

         </script>

2)把json稍加改变,加一个类似函数调用方式,加一个函数名把真个json包括起来。函数名必须和test一致

test({

         "key":"jtgood!"

});

3)测试


上面这个方式叫jsonp,它就可以实现js跨域。

跨域只在js中特殊现象。

jsonp必须应用在js跨域环境中,而且返回值必须是json包装。

(4)jsonp使用的两个前提:

1)  在js中

2)  返回值是json,被包装的。

 

(5)jQuery支持jsonp,SpringMVC框架支持jsonp




<think>嗯,用户现在想了解JSONP的工作原理以及它如何解决跨域问题,还有和跨源的关系。之前用户已经提问过跨域和跨源的区别,我之前也回答过,现在需要结合引用的资料来详细解释JSONP。 首先,我需要明确用户的问题点:JSONP如何工作,为什么能解决跨域,以及它和跨域、跨源的关系。根据提供的引用,用户给出的资料提到JSONP是一种早期解决方案,利用script标签不受同源策略限制的特性。同时,JSONP只支持GET请求,而CORS是官方标准,支持更多方法但兼容性差。 用户可能已经知道跨域是由同源策略引起的,但需要更深入的理解JSONP的机制。可能需要从基本原理讲起,比如script标签可以跨域加载资源,服务器返回的数据包裹在回调函数中,前端预先定义好回调函数,这样就能获取数据。同时需要对比JSONP和Ajax的不同,比如引用[2]提到JSONP没有使用XMLHttpRequest,所以不算Ajax。 还要注意用户提到的引用内容,比如jQuery中的JSONP实现,虽然设置type为jsonp,但实际还是GET,无法使用POST。这部分需要在回答中解释清楚。另外,需要指出JSONP的优缺点,比如兼容性好但安全性问题,只支持GET,容易被注入恶意代码。 用户可能还想知道JSONP和跨源的关系,之前回答中提到跨域是跨源的子集,所以JSONP解决的是跨域问题中的资源加载限制,属于跨源通信的一种方式。但需要强调JSONP主要用于数据请求,而其他跨源方法如postMessage用于不同窗口通信。 需要确保回答结构清晰,分点说明原理、流程、与跨域/跨源的关系、优缺点,以及示例代码。同时,生成的相关问题要引导用户进一步了解CORS或其他方法,比如如何选择JSONP和CORS,或者JSONP的安全隐患。 最后,检查是否所有引用资料都被合理引用,比如引用[1]提到JSONP是前端程序员想出的临时方案,引用[3]的示例代码,引用[4]关于jQuery的实现方式等。确保回答准确,符合用户提供的资料,同时结合之前的回答内容,保持一致性。</think>### **JSONP 工作原理及与跨域/跨源的关系** --- #### **一、JSONP 的核心原理** **JSONP(JSON with Padding)** 是一种利用 `<script>` 标签**不受同源策略限制**的特性实现的跨域数据请求技术[^1][^3]。其核心逻辑如下: 1. **动态创建 `<script>` 标签** 前端通过动态创建 `<script>` 标签,向目标服务器发起请求,并在 URL 中指定一个回调函数名(如 `callback=handleData`)[^3][^5]。 ```javascript function handleData(data) { console.log(data); } const script = document.createElement('script'); script.src = 'http://api.example.com/data?callback=handleData'; document.body.appendChild(script); ``` 2. **服务器返回包裹数据的函数调用** 服务器将返回的数据包裹在指定的回调函数中,格式为:`handleData({...})`。例如: ```javascript handleData({ name: "John", age: 30 }); ``` 3. **前端执行回调函数** 浏览器加载并执行该脚本时,自动调用预定义的回调函数 `handleData`,从而获取数据[^3][^4]。 --- #### **二、JSONP 如何解决跨域问题** 1. **绕过同源策略限制** 浏览器禁止跨域 AJAX 请求(如 `XMLHttpRequest`),但允许跨域加载 `<script>`、`<img>` 等标签资源。JSONP 利用这一特性实现数据获取[^1][^2]。 2. **协议无关性** JSONP 通过普通的 HTTP 请求(GET)传递数据,无需依赖特定协议或复杂配置。 --- #### **三、JSONP 与跨域、跨源的关系** 1. **跨域场景的典型解决方案** - JSONP 主要解决**跨域 HTTP 请求被拦截**的问题(如 AJAX 请求不同源接口)。 - 它属于广义的**跨源通信**手段,但仅适用于数据请求场景,无法实现 DOM 操作或 Cookie 读取[^1][^2]。 2. **与 CORS 的对比** | 特性 | JSONP | CORS | |--------------------|---------------------------|--------------------------| | **请求类型** | 仅支持 GET | 支持 GET、POST 等 | | **安全性** | 存在 XSS 风险(需信任服务端) | 依赖服务端配置,更安全 | | **兼容性** | 兼容老旧浏览器(如 IE8) | 需浏览器支持 CORS 标准 | | **实现复杂度** | 简单(前端+服务端约定回调)| 需服务端设置响应头 | --- #### **四、JSONP 的局限性** 1. **仅支持 GET 请求** 由于 `<script>` 标签本质是资源加载,无法实现 POST、PUT 等复杂请求[^1][^4]。 2. **安全性风险** - 若服务端返回恶意代码,可能引发 XSS 攻击。 - 需完全信任目标服务器的安全性[^3]。 3. **错误处理困难** 无法通过 HTTP 状态码捕获错误,需依赖超时机制或冗余代码[^5]。 --- #### **五、示例代码(jQuery 实现)** ```javascript $.ajax({ url: "http://api.example.com/data", dataType: "jsonp", // 声明为 JSONP 请求 jsonpCallback: "handleData", // 自定义回调函数名 success: function(data) { console.log("Received:", data); }, error: function() { console.error("Request failed"); } }); ``` **服务端响应示例**: ```javascript handleData({ status: 200, message: "Success" }); ``` --- ### **总结** - **JSONP 的本质**:利用 `<script>` 标签的跨域能力,“欺骗”浏览器完成数据加载。 - **适用场景**:兼容老旧浏览器的简单 GET 请求,不涉及敏感数据的安全场景。 - **演进方向**:现代开发中,CORS 已逐渐取代 JSONP 成为主流跨域方案[^1][^3]。 --- ### **相关问题** 1. 如何防范 JSONP 的 XSS 攻击风险? 2. 为什么 JSONP 不支持 POST 请求?能否通过其他方式模拟? 3. 在 CORS 普及的今天,JSONP 还有哪些实际应用场景? 4. JSONP 与 WebSocket 在跨源通信上的区别是什么? : 引用1 [^2]: 引用2 : 引用3 [^4]: 引用4 [^5]: 引用5
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值