最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot+jsonp解決前端跨域問題小結(jié)

 更新時(shí)間:2018年06月13日 10:07:55   作者:明人不說暗話___我喜歡你  
這篇文章主要介紹了springboot+jsonp解決前端跨域問題小結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

現(xiàn)在咱們一起來討論瀏覽器跨域請(qǐng)求數(shù)據(jù)的相關(guān)問題。說這樣可能不是很標(biāo)準(zhǔn),因?yàn)榫芙^跨域請(qǐng)求數(shù)據(jù)并不是瀏覽器所獨(dú)有的,之所以會(huì)出現(xiàn)跨域請(qǐng)求不了數(shù)據(jù),是因?yàn)闉g覽器基本都實(shí)現(xiàn)了一個(gè)叫"同源策略"的安全規(guī)范。該規(guī)范具體是什么呢?我們?cè)贛DN上找到了一份資料,地址如下:

瀏覽器同源策略講解

總的來說,當(dāng)A網(wǎng)址和B網(wǎng)址在 協(xié)議 、 端口 、 域名 方面存在不同時(shí),瀏覽器就會(huì)啟動(dòng)同源策略,拒絕A、B服務(wù)器之間進(jìn)行數(shù)據(jù)請(qǐng)求。

說了同源策略,紙上得來終覺淺,絕知此事要躬行,到底同源策略是怎么體現(xiàn)的呢?下面我將結(jié)合代碼一步一步進(jìn)行演示。

1、A服務(wù)器請(qǐng)求不了B服務(wù)器的情況

既然是跨域,我就假設(shè)我有兩個(gè)域名,分別是 A 和 localhost , A 表示小編在阿里云上主機(jī)域名, localhost 顧名思義就是小編的開發(fā)機(jī)器了。我們想象這樣一個(gè)場(chǎng)景,在 localhost 上部署一個(gè) index.html 文件,在 A 服務(wù)器上部署一個(gè)簡(jiǎn)單的 spring-boot 后臺(tái)服務(wù),并提供一個(gè)簡(jiǎn)單的接口暴露給 index.html 文件調(diào)用,最后瀏覽器請(qǐng)求 localhost 的 index.html 文件,看瀏覽器提示什么?

index.html

<!DOCTYPE html>
<html>
<head>
<title>測(cè)試跨域訪問</title>
<meta charset="utf-8"/>
</head>
<body>
  <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
  <script type="text/javascript">
    $(document).ready(function() {
      $.ajax({
        type : "get",
        async : true,
        url : "http://A/hello/map/getUser.json",// 請(qǐng)求A服務(wù)器上的接口
        type : "json",
        success : function(data) {
        // 打印返回的數(shù)據(jù)
        console.log("success,and return data is " + data);
        }
      });
    });
  </script>
    <h2>hello world</h2>
</body>
</html>

瀏覽器上請(qǐng)求 index.html 文件,顯示如下:

可以發(fā)現(xiàn),請(qǐng)求被瀏覽器給拒絕了,提示我們不允許跨域請(qǐng)求數(shù)據(jù),很難受,怎么解決呢?

2、使用 jsonp 解決跨域請(qǐng)求

首先講下原理,jsonp解決跨域問題主要利用了 <script> 標(biāo)簽的可跨域性,也就是 src 屬性中的鏈接地址可以跨域訪問的特性,因?yàn)槲覀兘?jīng)常將 src 屬性值設(shè)置為cdn的地址,已加載相關(guān)的js庫(kù)。

index.html

<!DOCTYPE html>
<html>
<head>
<title>測(cè)試跨域訪問</title>
<meta charset="utf-8" />
</head>
<body>
  <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
  <script type="text/javascript">
   $(document).ready(function() {
     $.ajax({
     type : "get",
     async : true,
     jsonp : "callbackName",// 后端接口參數(shù)名
     jsonpCallback : "callbackFunction", // 回調(diào)函數(shù)名
     url : "http://A/hello/map/getUser.json",
     dataType : "jsonp", // 數(shù)據(jù)格式為 jsonp
     success : function(data) {
      console.log("success");
     }
     });
   });
  </script>
  <script type="text/javascript">
   var callbackFunction = function(data) {
   alert('接口返回的數(shù)據(jù)是:' + JSON.stringify(data));
   };
  </script>
</body>
</html>

A 服務(wù)器上的接口代碼為:

/**
 * 
 * The class JsonBackController.
 *
 * Description:該控制器返回一串簡(jiǎn)單的json數(shù)據(jù),json數(shù)據(jù)由一個(gè)簡(jiǎn)單的User對(duì)象組成
 *
 * @author: huangjiawei
 * @since: 2018年6月12日
 * @version: $Revision$ $Date$ $LastChangedBy$
 *
 */
@RestController
@RequestMapping(value = "/map")
public class JsonBackController {
  private static final Logger logger = LoggerFactory.getLogger(JsonBackController.class);
  /**
   * 解決跨域請(qǐng)求數(shù)據(jù)
   * @param response
   * @param callbackName 前端回調(diào)函數(shù)名
   * @return
   */
  @RequestMapping(value = "getUser.json")
  public void getUser(HttpServletResponse response, @RequestParam String callbackName) {
    User user = new User("huangjiawei", 22);
    response.setContentType("text/javascript");
    Writer writer = null;
    try {
     writer = response.getWriter();
     writer.write(callbackName + "(");
     writer.write(user.toString());
     writer.write(");");
    } catch (IOException e) {
     logger.error("jsonp響應(yīng)寫入失??! 數(shù)據(jù):" + user.toString(), e);
    } finally {
     if (writer != null) {
     try {
      writer.close();
     } catch (IOException e) {
      logger.error("輸出流關(guān)閉異常!", e);
     }
     writer = null;
     }
    }
  }
}

后端傳入一個(gè)參數(shù) callbackName 回調(diào)函數(shù)名,然后返回一段js代碼給前端,js代碼格式如下:

callbackName + ( data ) + ;

瀏覽器請(qǐng)求 localhost 服務(wù)器上的 index.html 文件,結(jié)果如下:

上面這種方式是通過 jquery + jsonp 解決跨域問題的,剛剛不是說可以用 <script> 標(biāo)簽的 src 屬性嗎?四的。

localhost 服務(wù)器上的 index.html

<!DOCTYPE html>
<html>
<head>
<title>測(cè)試跨域訪問</title>
<meta charset="utf-8" />
</head>
<body>
 <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
 <script type="text/javascript">
 var callbackFunction = function(data) {
  alert('接口返回的數(shù)據(jù)是:' + JSON.stringify(data));
 };
 </script>
 <script type="text/javascript" src="http://A/hello/map/getUser.json?callbackName=callbackFunction"></script>
</body>
</html>

瀏覽器顯示效果和上面一致。但此處需要注意的是, src 表示引入一個(gè)js文件,由于是直接調(diào)用接口,而接口返回的數(shù)據(jù)又剛好是一段js代碼,故能被執(zhí)行。另外,第二個(gè) <script> 標(biāo)簽順序不能顛倒,不然會(huì)出現(xiàn) callbackFunction 函數(shù)找不到的情況。

工程代碼地址 : https://github.com/SmallerCoder/jsonpDemo

最后總結(jié)下,解決跨域的方案有很多種,jsonp只是其中一種,具體情況需要具體分析。希望此文對(duì)你有幫助,謝謝閱讀,歡迎github給顆 start ,么么噠!也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot中配置雙數(shù)據(jù)源的實(shí)現(xiàn)示例

    SpringBoot中配置雙數(shù)據(jù)源的實(shí)現(xiàn)示例

    在許多應(yīng)用程序中,可能會(huì)遇到需要連接多個(gè)數(shù)據(jù)庫(kù)的情況,本文主要介紹了SpringBoot中配置雙數(shù)據(jù)源的實(shí)現(xiàn)示例,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • JVM 體系結(jié)構(gòu)詳解

    JVM 體系結(jié)構(gòu)詳解

    本文主要介紹了JVM體系結(jié)構(gòu)的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-03-03
  • 基于springboot i18n國(guó)際化后臺(tái)多種語(yǔ)言設(shè)置的方式

    基于springboot i18n國(guó)際化后臺(tái)多種語(yǔ)言設(shè)置的方式

    這篇文章主要介紹了基于springboot i18n國(guó)際化后臺(tái)多種語(yǔ)言設(shè)置的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Kafka使用Java客戶端進(jìn)行訪問的示例代碼

    Kafka使用Java客戶端進(jìn)行訪問的示例代碼

    本篇文章主要介紹了Kafka使用Java客戶端進(jìn)行訪問的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • TF-IDF理解及其Java實(shí)現(xiàn)代碼實(shí)例

    TF-IDF理解及其Java實(shí)現(xiàn)代碼實(shí)例

    這篇文章主要介紹了TF-IDF理解及其Java實(shí)現(xiàn)代碼實(shí)例,簡(jiǎn)單介紹了tfidf算法及其相應(yīng)公式,然后分享了Java實(shí)現(xiàn)代碼,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • springboot循環(huán)依賴問題案例代碼及解決辦法

    springboot循環(huán)依賴問題案例代碼及解決辦法

    在 Spring Boot 中,如果兩個(gè)或多個(gè) Bean之間存在循環(huán)依賴(即 Bean A 依賴 Bean B,而 Bean B 又依賴 Bean A),會(huì)導(dǎo)致 Spring 的依賴注入機(jī)制無(wú)法正確處理,從而拋出異常,下面給大家介紹springboot循環(huán)依賴問題及其解決辦法,感興趣的朋友一起看看吧
    2025-04-04
  • gradle使用maven-publish發(fā)布jar包上傳到私有maven配置

    gradle使用maven-publish發(fā)布jar包上傳到私有maven配置

    這篇文章主要介紹了gradle使用maven-publish發(fā)布jar包上傳到私有maven的配置示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • SpringBoot實(shí)現(xiàn)接口版本控制的示例代碼

    SpringBoot實(shí)現(xiàn)接口版本控制的示例代碼

    這篇文章主要介紹了springboot如何實(shí)現(xiàn)接口版本控制,接口版本控制,比如微服務(wù)請(qǐng)求中某個(gè)接口需要升級(jí),正常做法是升級(jí)我們的版本,文中有詳細(xì)的代碼示例供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-03-03
  • itextpdf提取PDF文件中的任意頁(yè)碼實(shí)現(xiàn)示例

    itextpdf提取PDF文件中的任意頁(yè)碼實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了itextpdf提取PDF文件中的任意頁(yè)碼實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • SpringBoot將Spring fox更換為Springdoc的方法詳解

    SpringBoot將Spring fox更換為Springdoc的方法詳解

    由于項(xiàng)目中使用Spring fox已經(jīng)不維護(hù)更新了,代碼掃描,掃出問題,需要將Spring fox更換為Spring Doc,所以本文給大家介紹了SpringBoot將Spring fox更換為Springdoc的方法,文中有相關(guān)的代碼供大家參考,需要的朋友可以參考下
    2024-01-01

最新評(píng)論

彰化市| 榆中县| 兴山县| 呼伦贝尔市| 景德镇市| 元氏县| 望都县| 嘉义县| 高密市| 苗栗市| 休宁县| 蓝山县| 斗六市| 苏尼特左旗| 博湖县| 长子县| 凤冈县| 泾川县| 绥芬河市| 西和县| 紫云| 绥芬河市| 合水县| 新沂市| 嫩江县| 克什克腾旗| 监利县| 宽甸| 长宁区| 盖州市| 常山县| 屯留县| 麻阳| 葫芦岛市| 乌兰察布市| 安新县| 昌吉市| 休宁县| 自治县| 松滋市| 长治县|