`

JavaScript之跨域请求解决方案

阅读更多
浏览器处于安全原因,在使用 Ajax 进行请求访问时,不允许跨域请求。
因为这涉及到(被浏览器添加在每次请求的请求头中的)Cookie 会被外域服务器读取到。

不过我们发现,Web页面上使用 script 标签加载js文件时则不受是否跨域的影响。也就是可以加载其它域名下的 javascript 文件。(不仅如此,我们还发现凡是拥有"src"这个属性的标签都拥有跨域的能力,比如<script>、<img>、<iframe>);
基于此,实现跨域请求,只需要动态加载 js 文件就可以了。
但是动态加载 js 后,应该调用那个方法处理这些数据。我们只好把这个回调方法的名称以参数的形式传递给服务器。

这就是JSONP的实现原理:

1、动态的向页面中添加 src 属性为其它域名资源的 script 标签。
2、把回调方法写到 src 参数里,一起传递给服务器。
3、服务器在返回的 javascript 文件中,调用这个回调方法。


一、实现原理

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script type="text/javascript">

    // callback function.
    var flightHandler = function(data){
        console.log(data);
    };
    
    // 该 url 会返回一段 javascript 代码。
    var url = "http://remote.xx.com/xx?code=CA1998&callback=flightHandler";

    // 创建script标签
    var script = document.createElement('script');
    script.setAttribute('src', url);

    // 把script标签加入head,此时调用开始
    document.getElementsByTagName('head')[0].appendChild(script); 
    </script>
</head>
<body>

</body>
</html>


服务器端端返回值:
var obj = {
    "code": "CA1998",
    "price": 1780,
    "tickets": 5
};

flightHandler(obj);


为了不引起 obj 变量名冲突,写成 JSONP (JSON with Padding) 格式:
flightHandler({
    "code": "CA1998",
    "price": 1780,
    "tickets": 5
});





二、使用 JQuery 时,它把这种方式封装在了 ajax 方法中
但这绝不是 ajax 请求,实现原理不同。
$.ajax({
     type: "get",
     async: false,
     url: "http://remote.xx.com/xx?code=CA1998",
     dataType: "jsonp",
     jsonp: "callback",
     jsonpCallback:"flightHandler",
     success: function(data){
         console.log(data);
     },
     error: function(){
         alert('fail');
     }
 });




$.ajax({
     type: "get",
     async: false,
     url: "http://remote.xx.com/xx?code=CA1998",
     jsonp: "callback",
     jsonpCallback:"?", 
     success: function(data){
         console.log(data);
     },
     error: function(){
         alert('fail');
     }
 });

如果在 url 中含有 callback=? ,则 jquery 会认为是发送 jsonp 格式的请求。
并自动生成一个随机的回调函数名,传递给服务器。



JQuery 自动生成的 callback 方法名是如何调用 sucess 方法的?

$.ajax({
        url: 'http://url.of.my.server/submit',
        dataType: "jsonp",
        jsonp: 'callback',
        jsonpCallback: 'jsonp_callback'
    });

jsonp is the querystring parameter name that is defined to be acceptable by the server while the jsonpCallback is the javascript function name to be executed at the client.
When you use such url:

url: 'http://url.of.my.server/submit?callback=?'

the question mark ? at the end instructs jQuery to generate a random function while the predfined behavior of the autogenerated function will just invoke the callback -the sucess function in this case- passing the json data as a parameter.

$.ajax({
        url: 'http://url.of.my.server/submit?callback=?',
        success: function (data, status) {
            mySurvey.closePopup();
        },
        error: function (xOptions, textStatus) {
            mySurvey.closePopup();
        }
    });


The same goes here if you are using $.getJSON with ? placeholder it will generate a random function while the predfined behavior of the autogenerated function will just invoke the callback:

$.getJSON('http://url.of.my.server/submit?callback=?',function(data){
//process data here
});



引用

jsonpCallback
Type: String or Function()

Specify the callback function name for a JSONP request. This value will be used instead of the random name automatically generated by jQuery. It is preferable to let jQuery generate a unique name as it'll make it easier to manage the requests and provide callbacks and error handling. You may want to specify the callback when you want to enable better browser caching of GET requests. As of jQuery 1.5, you can also use a function for this setting, in which case the value of jsonpCallback is set to the return value of that function.




服务端返回数据的示例代码:
public void ProcessRequest (HttpContext context) {
	context.Response.ContentType = "text/plain";
	String callbackFunName = context.Request["callbackparam"];
	context.Response.Write(callbackFunName + "([ { name:\"John\"}])");
}





引用请注明,
原文出处:http://lixh1986.iteye.com/blog/2378307








-
引用:
http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html
http://api.jquery.com/jQuery.ajax/
https://stackoverflow.com/a/31087311/2893073



分享到:
评论

相关推荐

    跨域请求解决方案

    跨域请求是Web开发中一个常见的挑战,尤其是在使用Ajax进行异步数据交互时。这个问题源自浏览器的同源策略,该策略限制了...如果需要更深入的了解或实践代码示例,可以查看压缩包中的“java跨域请求解决方案”文件。

    跨域请求解决方案源代码(JSONP,CORS)

    "跨域请求解决方案源代码(JSONP, CORS)"这个主题主要关注如何绕过同源策略,实现跨域数据交互。以下是对这两个常见跨域解决方案的详细解释: **JSONP(JSON with Padding)** JSONP是一种早期的跨域数据交互方式...

    Javascript跨域访问解决方案

    JavaScript跨域访问解决方案 在Web开发中,JavaScript的同源策略是浏览器为了保障用户安全而实施的一项重要机制。它限制了脚本只能访问与当前页面具有相同协议(如http或https)、主机名和端口号的资源。然而,在...

    JQuery跨域访问解决方案

    在上面的例子中,`$.ajax()`方法用于发起跨域请求,`dataType: 'jsonp'`指定使用JSONP模式。`jsonp: 'jsoncallback'`参数指定了回调函数名的查询字符串参数名。`success`回调函数会在数据成功返回后执行,处理服务器...

    Tomcat跨域请求资源解决方案.zip

    本资料包“Tomcat跨域请求资源解决方案.zip”显然是针对这个问题提供了一个具体的解决方案,主要聚焦于如何在Apache Tomcat服务器上配置以允许跨域请求。 Tomcat是Java Servlet容器,广泛用于部署Java Web应用程序...

    Ajax跨域请求解决方案-JSONP

    然而,Ajax技术在实现动态网页交互时常常需要跨越这个限制,这时就引入了JSONP(JSON with Padding)作为跨域请求的一种解决方案。本文将详细介绍JSONP的工作原理以及如何在ASP.NET网站开发中应用JSONP解决Ajax跨域...

    JS跨域请求解决方案.docx

    ### JS跨域请求解决方案 #### 一、理解跨域与同源策略 **跨域**在Web开发中指的是从一个域名发起对另一个域名资源的请求。这种请求涉及到多个域名之间的数据交互,通常会受到浏览器安全策略——**同源策略**(Same...

    Javascript跨域和Ajax跨域解决方案

    JavaScript跨域和Ajax跨域是Web开发中常见的问题,尤其在进行前后端分离或API调用时,由于浏览器的同源策略限制,不同域名、协议或端口的资源请求会被阻止,这就是所谓的“跨域”。本文将深入探讨JavaScript和Ajax...

    Geoserver跨域问题解决方案

    - `cors-filter-1.7.jar`:这是Apache Shiro的一个扩展,用于处理跨域请求过滤。它提供了实现CORS策略的功能。 - `java-property-utils-1.9.jar`:这是一个Java库,用于处理属性文件和系统属性。在本例中,可能...

    js跨域解决方案

    JavaScript跨域是Web开发中一个常见的挑战,由于浏览器的同源策略限制,JavaScript无法直接访问不同源(协议、域名或端口不一致)的资源。本文将深入探讨JS跨域的解决方案,帮助开发者理解并解决这个问题。 首先,...

    Ajax跨域访问解决方案

    **Ajax跨域访问解决方案** 在Web开发中,Ajax(Asynchronous JavaScript and XML)技术被广泛用于实现页面的异步更新,提升用户体验。然而,由于浏览器的同源策略限制,Ajax请求只能向同源(协议、域名和端口相同)...

    arcgis api for javascript跨域处理方案

    ArcGIS API提供了一个内置的代理,名为"Resource Proxy",它允许开发者将敏感的服务或跨域请求路由到代理服务器,然后由代理服务器转发到实际的目标服务器。这样,浏览器将认为请求是在同一域内进行的,从而避免了...

    JS跨域访问解决方案总结

    JavaScript跨域访问解决方案 在Web开发中,由于浏览器的安全策略——同源策略(Same Origin Policy),不同源的脚本之间无法直接通信或访问彼此的资源。同源策略规定,只有当两个URL的协议、域名和端口都相同时,...

    解决JS跨域访问IFrame的解决方案

    "解决JS跨域访问IFrame的解决方案"这一主题关注的就是如何克服这个限制,使得在JSP页面中嵌入的跨域IFrame能够正常通信。下面我们将详细探讨这个问题以及可能的解决方案。 首先,理解同源策略是关键。同源策略是...

    请求跨域的解决方案.docx

    对于更复杂的跨域请求,如POST、PUT等非GET方法,或者需要设置自定义头部、处理预检请求(OPTIONS)的情况,我们需要使用CORS(Cross-Origin Resource Sharing)机制。CORS是现代浏览器支持的一种安全机制,允许...

    signalR跨域及解决方案

    JSONP 是一种早期的跨域解决方案,适用于只支持GET请求的浏览器。SignalR 1.x 版本支持 JSONP,但在 SignalR 2.x 及更高版本中已被 CORS 替代。如果需要支持旧浏览器,需要确保 SignalR Hub 支持 JSONP 请求。 3. ...

    JS跨域访问解决方案总结[参照].pdf

    JS 跨域访问解决方案总结为我们提供了一种更安全、方便的跨域请求方式来融合(Mashup)自己的 Web 应用。这种方式可以将请求分摊到不同的服务器,减轻单个服务器压力以提高响应速度;另外一种好处是可以将不同的业务...

    js跨域问题解决方案.

    本文将深入探讨JavaScript跨域问题的原因、影响以及多种解决方案,帮助开发者理解和解决这个问题。 ### 1. 同源策略 同源策略是浏览器为了安全考虑而实施的一项机制,它规定了只有相同协议(http、https等)、相同...

    xmlhttp跨域解决方案

    然而,由于浏览器的同源策略限制,XMLHttpRequest在发送请求时,通常只能请求与当前页面同一源的资源,这在进行跨域请求时会遇到“拒绝访问”的错误。为了解决这一问题,我们可以采用多种跨域解决方案,其中一种是...

Global site tag (gtag.js) - Google Analytics