• <noscript id="ecgc0"><kbd id="ecgc0"></kbd></noscript>
    <menu id="ecgc0"></menu>
  • <tt id="ecgc0"></tt>

    前端跨域請求jsonp實現

          跨域問題來歷于JavaScript的同源策略,即只有 和談+本家兒機名+端標語 (如存在)不異,則許可彼此拜候,有一種分歧即不克不及拜候。也就是說JavaScript只能拜候和操作本身域下的資本,不克不及拜候和操作其他域下的資本。跨域問題是針對JS和ajax的,html自己沒有跨域問題,好比a標簽、script標簽、甚至form標簽(可以直接跨域發送數據并領受數據)等 。

          JSONP(JSON with Padding)是JSON的一種“利用模式”,可用于解決本家兒流瀏覽器的跨域數據拜候的問題。因為同源策略,一般來說位于 server1.example.com 的網頁無法與不是 server1.example.com的辦事器溝通,而 HTML 的<script> 元素是一個破例。操縱 <script> 元素的這個開放策略,網頁可以獲得從其他來歷動態發生的 JSON 資料,而這種利用模式就是所謂的 JSONP。用 JSONP 抓到的資料并不是 JSON,而是肆意的JavaScript,用 JavaScript 直譯器執行而不是用 JSON 解析器解析。

    東西/原料

    • 電腦
    • java便捷東西 intellij IDEA或者eclipse
    • 前端編纂東西HBuilder非必需可以利用java編纂東西取代

    第一步調:建立一個javaweb項目

    1. 1

      第一種:建立一個springboot的項目。

      1、 打開建立頁面 選擇File-new-project..

      2、選擇建立的項目為spring initializr 進入springboot項目建立步調(也可以選擇類型java,建立一個通俗java項目)

      3、輸入項目名字,選擇依靠web(按照項目需求選擇,此次需要),選擇存放目次-完當作(Finish)

    2. 2

      第二種:建立一個簡單的javaweb項目。

      1、直接打開:https://jingyan.baidu.com/article/ff411625048acf12e482373a.html

      2、或者百度搜刮:servlet類若何映射到url路徑 百度經驗

    第二步調:項目籌辦

    1. 1

      第一步:編寫被挪用項目標controller。

      1、需要集當作springmvc,springboot項目集當作web就包含springmvc,通俗的servlet需要:

      PrintWriter w = response.getWriter();w.print(json);

      2、端口默認8080

      3、controller代碼如下所示

      import org.springframework.web.bind.annotation.RequestMapping;

      import org.springframework.web.bind.annotation.RestController;

      import javax.servlet.http.HttpServletRequest;

      import javax.servlet.http.HttpServletResponse;

      import java.util.Map;

      @RestController

      public class TestController {

      @RequestMapping("/bean")

      public String testJson(HttpServletRequest request,

      HttpServletResponse response, Map paramMap) {

      String callback = request.getParameter("callback");

      String id = request.getParameter("id");

      String name = request.getParameter("name");

      String sex = request.getParameter("sex");

      String json = "{'id':" + id + ",'name':'" + name + "','sex':'" + sex

      + "'}";

      if (callback != null) {

      json = callback + "(" + json + ")";

      }

      return json;

      }

      }

      4、啟動辦事并測試:

      http://localhost:8080/bean?id=2&name=張三&sex=男

    2. 2

      第二步:挪用項目標籌辦。

      1、新建一個javaweb項目

      2、在端標語設置為8020

      3、編寫跨域挪用代碼,本家兒如果頁面js的編寫

    第二步調:jsonp事項跨域的體例

    1. 1

      第一種:原生的js實現跨域。

      1、借助于原生javascript實現,具體代碼如下所示:

      window.onload = function () {

       var script = document.createElement('script');

       script.setAttribute("type","text/javascript");

       script.src = 'http://localhost:8080/bean?callback=ajaxCallback&id=2&name=張三&sex=男';

       document.body.appendChild(script);

      }

       

      function ajaxCallback(data) {

       alert('response data: ' + JSON.stringify(data));

      };

    2. 2

      第二種:借助于jquery的getJSON實現。

      具體代碼如下所示:

      <!DOCTYPE html>

      <html>

      <head>

      <meta charset="UTF-8">

      <title>跨域測試</title>

      <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>

      </head>

      <body>

      <script>

      $.getJSON("http://localhost:8080/bean?callback=?", {id:2,name:'李四',sex:'男'},

          function(data) {

      alert(data.id+data.name+data.sex);

      });

      </script>

      </body>

      </html>

    3. 3

      第三種:借助于jquery的ajax實現。

      <!DOCTYPE html>

      <html>

      <head>

      <meta charset="UTF-8">

      <title>跨域測試</title>

      <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>

      </head>

      <body>

      <script>

      $.ajax({

              //設置請求類型

              type:"get",

              //請求超不時間

              timeout:5000,

              //設置請求地址

              url: 'http://localhost:8080/bean',

              //設置需要發送的數據

              data: {id:2,name:'李四',sex:'男'},

              //界說此請求為跨域請求

              dataType: 'jsonp',

              //界說回調函數

              jsonpCallback:"callbackUser",

              success: function (data) {

      console.log("當作功");

              },

              error: function (data) {

                 console.log(data)

              }

          })

      function callbackUser(data){

      alert("id:"+data.id+" name:"+data.name+" sex:"+data.sex);

      }

      </script>

      </body>

      </html>

    4. 4

      第四種:本家兒如果對三種的優化。

      1、本家兒如果去除jsonpCallback屬性,url中傳callback=?界說默認挪用ajax的回調函數。要與后臺代碼對應(String callback = request.getParameter("callback");)

      2、挪用項目頁面如下所示:

      <!DOCTYPE html>

      <html>

      <head>

      <meta charset="UTF-8">

      <title>跨域測試</title>

      <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>

      </head>

      <body>

      <script>

      $.ajax({

              //設置請求類型

              type:"get",

              //請求超不時間

              timeout:5000,

              //設置請求地址

              url: 'http://localhost:8080/bean?callback=?',

              //設置需要發送的數據

              data: {id:2,name:'李四',sex:'男'},

              //界說此請求為跨域請求

              dataType: 'jsonp',

              success: function (data) {

      console.log("當作功");

      alert("id:"+data.id+" name:"+data.name+" sex:"+data.sex);

              },

              error: function (data) {

                 console.log(data)

              }

          })

      </script>

      </body>

      </html>

    第四步調:總結

    1. 1

      1、jsonp實現的體例就是借助于script標簽的src屬性獲取數據,然后將數據作為參數傳給函數,解析數據。這一點我們需要連系后臺callback +  "(" + json + ")"

      可以看出一二。

      2、跨域問題的解決方案除了jsonp體例外還有一種CORS,與jsonp分歧的是這是一種后臺解決方案。

    注重事項

    • jdk 1.8
    • 發表于 2019-05-08 20:01
    • 閱讀 ( 709 )
    • 分類:其他類型

    你可能感興趣的文章

    相關問題

    0 條評論

    請先 登錄 后評論
    admin
    admin

    0 篇文章

    作家榜 ?

    1. xiaonan123 189 文章
    2. 湯依妹兒 97 文章
    3. luogf229 46 文章
    4. jy02406749 45 文章
    5. 小凡 34 文章
    6. Daisy萌 32 文章
    7. 我的QQ3117863681 24 文章
    8. 華志健 23 文章

    推薦文章

    聯系我們:uytrv@hotmail.com 問答工具
  • <noscript id="ecgc0"><kbd id="ecgc0"></kbd></noscript>
    <menu id="ecgc0"></menu>
  • <tt id="ecgc0"></tt>
    久久久久精品国产麻豆