javascript跨域请求解决方法总结

javascript中有同源策略,javascript存在跨域通信的问题。典型例子如:Ajax无法直接请求跨域的普通文件,存在跨域无权限访问的问题。

几种常见的解决方法:

  1. JSONP  2.HTML5 postMessage 方法  3.document.domain + iframe  4.iframe+location.hash

一、JSONP

web页面上只有<script><img><iframe>这些拥有“src”属性的标签是拥有跨域能力的。所以当前解决跨域的JSONP方案就是通过<script>的这一特性来实现的。

原理:<script>标签的src属性是没有跨域的限制的。所以JSONP动态创建一个<script>标签,将本地方法名作为请求参数传递给src属性的url,服务器端获取请求中该参数即客户端的函数名,与要返回给库户端的json数据拼接成一个函数调用的javascript语句,返回给客户端,客户端获取返回的javascript语句并执行,该javascript函数的入参即为服务器端拼接的json数据,用这样的方法来实现在客户端来对异域服务器返回的请求数据进行处理。

简单概括即,JSONP返回给客户端一串javascript脚本的字符串,脚本中封装json数据。所以这个就决定了JSONP必须在服务器端对返回数据进行处理,加上callback的函数名

JSONP 的相关ajax方法 :

1.getJSON(url+"?callback=?",data,success(data,status,xhr));

例:

(server.php可以跨域放置,getJSON参数该为响应的地址即可)

function handleclick()
{
    $.getJSON("server.php?callback=?",function(data){
          alert(data.weatherinfo.city+":"+data.weatherinfo.weather);

});
}

2.get(url+"?callback=?",data,success(data,status,xhr),"jsonp");

例:

function handleclick()
{
    $.get("server.php?callback=?",function(data){
          alert(data.weatherinfo.city+":"+data.weatherinfo.weather);

},"jsonp");
}

3.$.ajax

例:

$.ajax({

url:"server.php",

dataType:"jsonp",

jsonp:"callback",

type:"GET",

success:function(data){

alert(data.weatherinfo.city+":"+data.weatherinfo.weather);

}

error:function(xhr,errortext,error){

console.log("requset state:"+xhr.readyState+";errorText:"+errortext);

}

});

服务器端:

server.php

<?php
    header("Content-Type:text/html;charset=utf-8");
    header("Cache-Control:no-cache");
     $callfunc=$_GET["callback"];
    $content=file_get_contents("http://www.weather.com.cn/data/cityinfo/101190101.html");
     echo $callfunc."(".$content.")";

?>

ajax 和 jsonp的本质区别是ajax是通过XMLHttpRequest来获取非本页内容,不能跨域,而jsonp是通过动态添加<script>标签来获取跨域服务器返回的脚本。

二、HTML5 postMessage 方法

简单的说就是:

A端用 iframe.postMessage(json,"*"); 来发送数据。

B端用onmessage(e)方法来获取及处理A发送的跨域的数据

未完待续

时间: 2024-12-16 15:26:50

javascript跨域请求解决方法总结的相关文章

Nginx反向代理、CORS、JSONP等跨域请求解决方法总结

由于 Javascript 同源策略的存在使得一个源中加载来自其它源中资源的行为受到了限制.即会出现跨域请求禁止. 通俗一点说就是如果存在协议.域名.端口或者子域名不同服务端,或一者为IP地址,一者为域名地址(在跨域问题上,域仅仅是通过“ url的首部 ”来识别而不会去尝试判断相同的IP地址对应着两个域或者两个域是否同属同一个IP),之中任意服务端旗下的客户端发起请求其它服务端资源的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源. 但很多时候我们却又不得不

Access to XMLHttpRequest at &#39;XXX&#39; from origin &#39;XX&#39; has been blocked by CORS policy: No &#39;Access-Control-Allow-Origin&#39; header is present o AJAX跨域请求解决方法

今天出现了一个问题找了好久先看代码: 这可能是个BUG吧插入代码: dataType: 'jsonp', crossDomain: true, 最终: Access to XMLHttpRequest at 'XXX' from origin 'XX' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present o AJAX跨域请求解决方法 原文地址:https://www.cnblogs

第114天:Ajax跨域请求解决方法(二)

一.什么是跨域 我们先回顾一下域名地址的组成: http:// www . google : 8080 / script/jquery.js   http:// (协议号) www  (子域名) google (主域名) 8080 (端口号) script/jquery.js (请求的地址) * 当协议.子域名.主域名.端口号中任意一各不相同时,都算不同的"域". * 不同的域之间相互请求资源,就叫"跨域". 比如:http://www.abc.com/index.

客户端ajax请求为实现Token验证添加headers后导致正常请求变为options跨域请求解决方法

客户端为了实现token认证,通过Jquery的ajaxSetup方法全局配置headers: 全局配置headers后会导致部分不需要token认证的请求变为options请求,导致跨域访问.报错信息如下: CORS概念 支持CORS请求的浏览器一旦发现ajax请求跨域,会对请求做一些特殊处理,对于已经实现CORS接口的服务端,接受请求,并做出回应. 有一种情况比较特殊,如果我们发送的跨域请求为"非简单请求",浏览器会在发出此请求之前首先发送一个请求类型为OPTIONS的"

web三种跨域请求数据方法

web三种跨域请求数据方法 以下测试代码使用php,浏览器测试使用IE9,chrome,firefox,safari <!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"> <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.2.min.

基于.Net Framework 4.0 Web API开发(5):ASP.NET Web APIs AJAX 跨域请求解决办法(CORS实现)

概述:  ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.但是在使用API的时候总会遇到跨域请求的问题,特别各种APP万花齐放的今天,API的跨域请求是不能避免的. 在默认情况下,为了防止CSRF跨站的伪造攻击(或者是 javascript的同源策略(Same-Origin Policy)),一个网页从另外一个域获取数据时就会收到限制.有一些方法可以突破这个限制,那就是大家熟知的JSONP, 当然这只是

JQuery - Ajax和Tomcat跨域请求问题解决方法!

在JQuery里面使用Ajax和Tomcat服务器之间进行数据交互,遇到了跨域请求问题,无法成功得到想要的数据! 错误信息部分截图: 通过错误信息判断知道已经发生在Ajax跨域请求问题了! 当前Tomcat服务器,是一个已经存在的工程,有APP同这部分代码一同工作.我所做的是开发另外一款手机应用程序,并且使用已有的接口!在这种情况下,实现Ajax跨域请求,而且对目前源代码影响越小越好!怎样达到这样的目标?最终通过为Tomcat添加过滤器方式完成! 由于此项目是商业项目,服务器并不是我管理,所以无

JS跨域(ajax跨域、iframe跨域)解决方法及原理详解(jsonp)

这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被当作是不同的域. 下表给出了相对 http://store.company.com/dir/page.html 同源检测的结果: 要解决跨域的问题,我们可以使用以下几种方法: 1.通过jsonp跨域[解决ajax跨域] 在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的

跨域:跨域及解决方法

一.什么是跨域 广义的跨域包括: 资源跳转:超链接<a>跳转.重定向.表单提交 资源嵌入:link.ifram.script.img,以及css样式中的background:url().@font-face()等外链接 脚本请求:js的ajax请求.js或DOM 中的跨域操作 狭义的跨域:指浏览器同源策略限制的请求 注意:并不是所有广义的跨域操作都不被允许,只有被同源策略限制的跨域操作是不被允许的 二.什么是浏览器同源限制 浏览器为了安全考虑不允许访问不同域下的资源 注意两点: 同源限制只是浏