>웹 프론트엔드 >JS 튜토리얼 >js 교차 도메인 요청_javascript 기술에 대한 5가지 솔루션

js 교차 도메인 요청_javascript 기술에 대한 5가지 솔루션

WBOY
WBOY원래의
2016-05-16 15:52:001175검색

교차 도메인 요청 데이터에 대한 솔루션에는 주로 다음 솔루션이 포함됩니다.

JSONP方式
表单POST方式
服务器代理
Html5的XDomainRequest
Flash request

별도 지침:

1. JSONP:

직관적 이해:

클라이언트에 동적으로 함수를 등록하는 것입니다

function a(data)를 호출하고 함수 이름을 서버에 전달하면 서버는 실행할 클라이언트에 a({/*json*/})를 반환하여 클라이언트의

를 호출합니다.

a(데이터) 기능을 통해 교차 도메인을 달성합니다.

출생 배경:

1. Ajax는 크로스 도메인 접근 문제가 있는 일반 파일을 정적 페이지, 동적 웹 페이지, 웹 서비스, wcf 등 상관없이 크로스 도메인으로 직접 요청합니다. 도메인 요청이 작동하지 않습니다.

2. 단, 웹페이지에서 js 파일을 호출할 때에는 이에 영향을 받지 않습니다

3. 추가 홍보를 통해 Src 속성이 있는 모든 태그에는 다음과 같은 도메인 간 기능이 있음을 확인했습니다.

4. 따라서 현재 순수 웹측을 통해 도메인 간 데이터에 액세스하려는 경우(ActiveX 컨트롤, 서버측 프록시, 향후 HTML5에 속하는 웹소켓 등은 포함되지 않음) 다음 방법: 원격 서버에서 클라이언트 호출 및 추가 처리를 위해 js 형식의 텍스트로 데이터를 로드해 보십시오.

5. JSON은 순수 문자 데이터 형식이며 js에서 기본적으로 지원할 수 있습니다.

6. 해결 방법은 다음과 같습니다. 웹 클라이언트는 스크립트를 호출하는 것과 똑같은 방식으로 크로스 도메인 서버에서 동적으로 생성된 js 형식 파일(일반적으로 접미사가 json임)을 호출합니다.

7. 클라이언트가 json 파일을 성공적으로 호출한 후 필요한 데이터를 가져오고 나머지는 자체 필요에 따라 처리하는 것입니다.

8 클라이언트의 데이터 사용을 용이하게 하기 위해 jsonp라는 비공식 전송 프로토콜이 점차 형성되었습니다. 이 프로토콜의 핵심은 사용자가 콜백 매개변수를 서버에 전달할 수 있도록 허용한 다음, 서버가 데이터를 반환할 때 이 콜백 매개변수를 함수 이름으로 사용하여 json 데이터를 래핑함으로써 클라이언트가 이를 사용자 정의할 수 있도록 한다는 것입니다. 반환된 데이터를 처리하는 자체 함수입니다.

상세 구현:

JQuery, extjs 또는 jsonp를 지원하는 다른 프레임워크이든 뒤에서 수행하는 작업은 동일합니다. 클라이언트에서 jsonp 구현을 단계별로 설명하겠습니다.

1. 크로스 도메인 js 파일의 코드(물론 웹 스크립트 보안 정책을 준수함)라도 웹 페이지는 무조건 실행될 수 있다는 것을 알고 있습니다.

원격 서버인 Remoteserver.com의 루트 디렉터리에 다음과 같은 Remote.js 파일 코드가 있습니다.

alert('나는 원격 파일입니다');

로컬 서버 localserver.com에는 다음과 같은 jsonp.html 페이지 코드가 있습니다.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title></title>
  <script type="text/javascript" src="http://remoteserver.com/remote.js"></script>
</head>
<body>

</body>
</html>

페이지에 도메인 간 호출이 성공했음을 알리는 프롬프트 창이 나타날 것이라는 데는 의심의 여지가 없습니다.

2. 이제 jsonp.html 페이지에 함수를 정의한 다음, remote.js에 데이터를 전달하여 호출합니다.

jsonp.html 페이지 코드는 다음과 같습니다.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title></title>
  <script type="text/javascript">
  var localHandler = function(data){
    alert('我是本地函数,可以被跨域的remote.js文件调用,远程js带来的数据是:' + data.result);
  };
  </script>
  <script type="text/javascript" src="http://remoteserver.com/remote.js"></script>
</head>
<body>

</body>
</html>

remote.js 파일 코드는 다음과 같습니다.

localHandler({"result":"나는 원격 js에서 가져온 데이터입니다"});
실행 후 결과를 확인합니다. 페이지에 프롬프트 창이 성공적으로 팝업되어 크로스 도메인 원격 js가 로컬 함수를 성공적으로 호출했으며 원격 js가 가져온 데이터도 수신했음을 보여줍니다. 도메인 간 원격 데이터 수집의 목적이 기본적으로 달성되어 매우 기쁩니다. 그러나 원격 js가 호출해야 하는 로컬 함수의 이름을 어떻게 알릴 수 있습니까? 결국 jsonp 서버는 많은 서비스 개체를 직면해야 하며 이러한 서비스 개체의 로컬 기능은 다릅니다. 아래를 살펴보자.

3. 똑똑한 개발자라면 서버에서 제공하는 js 스크립트가 동적으로 생성되기만 하면 호출자가 서버에 "XXX 함수를 호출하는 js 코드를 원합니다. 반환해 주세요"라고 알리는 매개변수를 전달할 수 있다고 쉽게 생각할 수 있습니다. to me"를 사용하면 서버가 js 스크립트를 생성하고 클라이언트의 요구에 따라 응답할 수 있습니다.

jsonp.html 페이지의 코드를 살펴보세요:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title></title>
  <script type="text/javascript">
  // 得到航班信息查询结果后的回调函数
  var flightHandler = function(data){
    alert('你查询的航班结果是:票价 ' + data.price + ' 元,' + '余票 ' + data.tickets + ' 张。');
  };
  // 提供jsonp服务的url地址(不管是什么类型的地址,最终生成的返回值都是一段javascript代码)
  var url = "http://flightQuery.com/jsonp/flightResult.aspx&#63;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>

이번에는 코드가 많이 변경되었습니다. 더 이상 원격 js 파일을 직접 작성하지 않고 동적 쿼리를 구현하는 코드입니다. 이는 jsonp 클라이언트 구현의 핵심 부분이기도 합니다. jsonp 호출의 전체 과정.

코드 매개변수가 호출 URL에 전달되어 내가 확인하려는 것이 CA1998 항공편의 정보임을 서버에 알리고, 콜백 매개변수는 내 로컬 콜백 함수가 flightHandler라고 서버에 알리는 것을 볼 수 있습니다. 쿼리 결과를 전달합니다. 이 함수를 호출하세요.

flightHandler({
  "code": "CA1998",
  "price": 1780,
  "tickets": 5
});

我们看到,传递给flightHandler函数的是一个json,它描述了航班的基本信息。运行一下页面,成功弹出提示窗口,jsonp的执行全过程顺利完成!

4、到这里为止的话,相信你已经能够理解jsonp的客户端实现原理了吧?剩下的就是如何把代码封装一下,以便于与用户界面交互,从而实现多次和重复调用。

什么?你用的是jQuery,想知道jQuery如何实现jsonp调用?好吧,那我就好人做到底,再给你一段jQuery使用jsonp的代码(我们依然沿用上面那个航班信息查询的例子,假定返回jsonp结果不变):

OK,服务器很聪明,这个叫做flightResult.aspx的页面生成了一段这样的代码提供给jsonp.html(服务端的实现这里就不演示了,与你选用的语言无关,说到底就是拼接字符串):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" >
 <head>
   <title>Untitled Page</title>
   <script type="text/javascript" src=jquery.min.js"></script>
   <script type="text/javascript">
   jQuery(document).ready(function(){ 
    $.ajax({
       type: "get",
       async: false,
       url: "http://flightQuery.com/jsonp/flightResult.aspx&#63;code=CA1998",
       dataType: "jsonp",
       jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
       jsonpCallback:"flightHandler",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"&#63;",jQuery会自动为你处理数据
       success: function(json){
         alert('您查询到航班信息:票价: ' + json.price + ' 元,余票: ' + json.tickets + ' 张。');
       },
       error: function(){
         alert('fail');
       }
     });
   });
   </script>
   </head>
 <body>
 </body>
 </html>

是不是有点奇怪?为什么我这次没有写flightHandler这个函数呢?而且竟然也运行成功了!哈哈,这就是jQuery的功劳了,jquery在处理jsonp类型的ajax时(还是忍不住吐槽,虽然jquery也把jsonp归入了ajax,但其实它们真的不是一回事儿),自动帮你生成回调函数并把数据取出来供success属性方法来调用,是不是很爽呀?

以上所述就是本文的全部内容了,希望大家能够喜欢。

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.