首頁 > web前端 > js教程 > 主體

怎樣用JS跨域實現POST

php中世界最好的语言
發布: 2018-05-23 13:40:33
原創
1517 人瀏覽過

這次帶給大家怎樣用JS跨域實現POST,JS跨域實現POST的注意事項有哪些,下面就是實戰案例,一起來看一下。

javascript 跨域是一個很常見的問題,其中jsonp 是一個最常用的手段,但是jsonp 只支援get,不支援post,所以如果想透過jsonp 來post 一些數據,就頭大了。

此處透過在一個 iframe 中產生 form 表單的形式來實現 post,並透過 postMessage 來向呼叫者傳回值。

第一步,我們先實現一個接受 jsonp 的後端程式碼,至於用什麼語言實現,各位自已決定。

c#程式碼是:

protected void Page_Load(object sender, EventArgs e)
    {
      StringBuilder sbRet = new StringBuilder();
      sbRet.Append("<script>");
      sbRet.Append(Request["jsoncallback"]);
      sbRet.Append("({");
      foreach (string k in Request.Form) {
        if (k == "jsoncallback") continue;
        sbRet.Append("'"+k+"':'"+Request.Form[k]+"'");
      }
      
      sbRet.Append("});");
      sbRet.Append("</script>");
      Response.Write(sbRet.ToString());
      Response.End();
    }
登入後複製

比如說你想回傳給我的是    { userName:'user1', password:'pass1' }  ,當我呼叫 http://localhost/test ?jsoncallback=callme 的時候

你實際回傳<script>callme({ userName:'user1', password:'pass1' })</script> 即可。

第二步,本地資料夾內建立post測試頁面,如d:\test.html

<form action="http://localhost/test" method="post">
  <input type="text" name="userName" value="user1" />
  <input type="text" name="password" value="pass1" />
  <input type="text" name="jsoncallback" value="callme" />
  <input type="submit" value="提交" />
</form>
登入後複製

第三步,瀏覽一下並點擊提交,看看返回的如果是< ;script>callme({ userName:'user1', password:'pass1' })則表示後端程式沒有問題了。

第四步,我們寫段通用的程式碼來實現上面的html.

<!doctype html>
<html>
  <head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>测试一哈</title>
  </head>  
  <body>   
  <script>
  //源码 开始
   function postJSONP(url, data, callback) {
    var template = '<form action="{{url}}" method="post" id="form1">';   
    for (var k in data) {
     template = template
       + '  <input type="text" name="&#39;+k+&#39;" value="&#39;+data[k]+&#39;" />'
    }
      template = template 
      + '  <input type="text" name="jsoncallback" value="function callback(data) { parent.postMessage(data, \&#39;*\&#39;); } callback" />'
      + '</form>'
      + '<&#39;+&#39;script>'
      + 'document.getElementById("form1").submit();'
      + '</&#39;+&#39;script>';      
   template = template.replace("{{url}}", url);      
   var p = document.createElement("p");
   p.style.display = 'none';  
   p.innerHTML = '<iframe src=""></iframe>';
   document.body.appendChild(p);   
   var ifrm = p.children[0];
   var cwin = ifrm.contentWindow;
   cwin.document.write(template);   
   window.onmessage = function(e) {
   if (callback) callback(e.data);
   }
   }
   //源码 结束  
  //使用测试
   window.onload = function() {
   postJSONP('http://localhost:59898/WebForm1.aspx', { userName: '张静', password: '就不告诉你' }, function(data) {
    console.log(11, data);
   });
   postJSONP('http://localhost:59898/WebForm1.aspx', { 仓库: '1号大仓', 面积: '2万平米' }, function(data) {
    console.log(22, data);
   });
  }
 </script>
  </body>
</html>
登入後複製

第五步、安全性問題、

window.onmessage = function(e) {
  //可通过 e 来判断来源,并做一些安全方面的处理,此处读者自己去研究吧,可以加个 console.log(e) 看看 e 有哪些内容。
  if (callback) callback(e.data);
}
登入後複製

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:

JS怎麼求最小公倍數和最大公約數

VUE中地區選擇器元件使用詳解

以上是怎樣用JS跨域實現POST的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板