一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - springboot+jsonp解決前端跨域問題小結

springboot+jsonp解決前端跨域問題小結

2021-05-09 12:22明人不說暗話___我喜歡你 Java教程

這篇文章主要介紹了springboot+jsonp解決前端跨域問題小結,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

現在咱們一起來討論瀏覽器跨域請求數據的相關問題。說這樣可能不是很標準,因為拒絕跨域請求數據并不是瀏覽器所獨有的,之所以會出現跨域請求不了數據,是因為瀏覽器基本都實現了一個叫"同源策略"的安全規范。該規范具體是什么呢?我們在mdn上找到了一份資料,地址如下:

瀏覽器同源策略講解

總的來說,當a網址和b網址在 協議 、 端口 、 域名 方面存在不同時,瀏覽器就會啟動同源策略,拒絕a、b服務器之間進行數據請求。

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

1、a服務器請求不了b服務器的情況

既然是跨域,我就假設我有兩個域名,分別是 a 和 localhost , a 表示小編在阿里云上主機域名, localhost 顧名思義就是小編的開發機器了。我們想象這樣一個場景,在 localhost 上部署一個 index.html 文件,在 a 服務器上部署一個簡單的 spring-boot 后臺服務,并提供一個簡單的接口暴露給 index.html 文件調用,最后瀏覽器請求 localhost 的 index.html 文件,看瀏覽器提示什么?

index.html

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!doctype html>
<html>
<head>
<title>測試跨域訪問</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",// 請求a服務器上的接口
        type : "json",
        success : function(data) {
        // 打印返回的數據
        console.log("success,and return data is " + data);
        }
      });
    });
  </script>
    <h2>hello world</h2>
</body>
</html>

瀏覽器上請求 index.html 文件,顯示如下:

springboot+jsonp解決前端跨域問題小結

可以發現,請求被瀏覽器給拒絕了,提示我們不允許跨域請求數據,很難受,怎么解決呢?

2、使用 jsonp 解決跨域請求

首先講下原理,jsonp解決跨域問題主要利用了 <script> 標簽的可跨域性,也就是 src 屬性中的鏈接地址可以跨域訪問的特性,因為我們經常將 src 屬性值設置為cdn的地址,已加載相關的js庫。

index.html

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!doctype html>
<html>
<head>
<title>測試跨域訪問</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",// 后端接口參數名
     jsonpcallback : "callbackfunction", // 回調函數名
     url : "http://a/hello/map/getuser.json",
     datatype : "jsonp", // 數據格式為 jsonp
     success : function(data) {
      console.log("success");
     }
     });
   });
  </script>
  <script type="text/javascript">
   var callbackfunction = function(data) {
   alert('接口返回的數據是:' + json.stringify(data));
   };
  </script>
</body>
</html>

a 服務器上的接口代碼為:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/**
 *
 * the class jsonbackcontroller.
 *
 * description:該控制器返回一串簡單的json數據,json數據由一個簡單的user對象組成
 *
 * @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);
  /**
   * 解決跨域請求數據
   * @param response
   * @param callbackname 前端回調函數名
   * @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響應寫入失??! 數據:" + user.tostring(), e);
    } finally {
     if (writer != null) {
     try {
      writer.close();
     } catch (ioexception e) {
      logger.error("輸出流關閉異常!", e);
     }
     writer = null;
     }
    }
  }
}

后端傳入一個參數 callbackname 回調函數名,然后返回一段js代碼給前端,js代碼格式如下:

callbackname + ( data ) + ;

瀏覽器請求 localhost 服務器上的 index.html 文件,結果如下:

springboot+jsonp解決前端跨域問題小結

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

localhost 服務器上的 index.html

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!doctype html>
<html>
<head>
<title>測試跨域訪問</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('接口返回的數據是:' + json.stringify(data));
 };
 </script>
 <script type="text/javascript" src="http://a/hello/map/getuser.json?callbackname=callbackfunction"></script>
</body>
</html>

瀏覽器顯示效果和上面一致。但此處需要注意的是, src 表示引入一個js文件,由于是直接調用接口,而接口返回的數據又剛好是一段js代碼,故能被執行。另外,第二個 <script> 標簽順序不能顛倒,不然會出現 callbackfunction 函數找不到的情況。

工程代碼地址 : https://github.com/smallercoder/jsonpdemo

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

原文鏈接:https://juejin.im/post/5b1f8bc05188257d7541c2ce

延伸 · 閱讀

精彩推薦
  • Java教程java實現字符串反轉案例

    java實現字符串反轉案例

    這篇文章主要為大家詳細介紹了java實現字符串反轉,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    star__king5402020-09-06
  • Java教程詳解spring boot中使用JdbcTemplate

    詳解spring boot中使用JdbcTemplate

    JdbcTemplate 是在JDBC API基礎上提供了更抽象的封裝,并提供了基于方法注解的事務管理能力。 通過使用SpringBoot自動配置功能并代替我們自動配置beans,下面給...

    牛頭人3842020-07-25
  • Java教程Java 中的 BufferedWriter 介紹_動力節點Java學院整理

    Java 中的 BufferedWriter 介紹_動力節點Java學院整理

    BufferedWriter 是緩沖字符輸出流。它繼承于Writer。接下來通過本文給大家分享Java 中的 BufferedWriter知識,需要的朋友參考下吧...

    動力節點4122020-10-05
  • Java教程Java中垃圾回收器GC對吞吐量的影響測試

    Java中垃圾回收器GC對吞吐量的影響測試

    這篇文章主要介紹了Java中垃圾回收器GC對吞吐量的影響測試,本文算是一個對垃圾回收器GC的優化文章,需要的朋友可以參考下 ...

    junjie2122019-11-29
  • Java教程詳解Java 包掃描實現和應用(Jar篇)

    詳解Java 包掃描實現和應用(Jar篇)

    這篇文章主要介紹了詳解Java 包掃描實現和應用(Jar篇),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下...

    zyndev3442020-07-26
  • Java教程java 實例化類詳解及簡單實例

    java 實例化類詳解及簡單實例

    這篇文章主要介紹了java 實例化類詳解及簡單實例的相關資料,需要的朋友可以參考下...

    夢碼人5372020-08-25
  • Java教程Maven學習教程之搭建多模塊企業級項目

    Maven學習教程之搭建多模塊企業級項目

    本篇文章主要介紹了Maven學習教程之搭建多模塊企業級項目 ,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    QuantSeven3442021-01-20
  • Java教程基于ZooKeeper實現隊列源碼

    基于ZooKeeper實現隊列源碼

    這篇文章主要介紹了基于ZooKeeper實現隊列源碼的相關內容,包括其實現原理和應用場景,以及對隊列的簡單介紹,具有一定參考價值,需要的朋友可以了解...

    MassiveStars10612021-01-05
主站蜘蛛池模板: 国产日韩欧美成人 | 欧亚精品一区二区三区 | 大乳孕妇一级毛片 | 好性20岁| 嫩草视频在线观看视频播放 | 国产美女久久精品香蕉69 | 亚洲精品第一国产综合高清 | 日本aaaaa高清免费看 | 校园纯肉H教室第一次 | 973影院 | 草莓丝瓜芭乐樱桃榴莲色多黄 | 色琪琪久久草在线视频 | 星空无限传媒xk8027穆娜 | 国产精品久久国产精品99 gif | 国产手机在线αⅴ片无码观看 | 国内精品久久久久小说网 | 成年人在线观看视频 | 亚洲不卡视频在线 | 美女沟厕撒尿全过程高清图片 | 人皮高跟鞋在线观看 | jzzjlzz亚洲乱熟在线播放 | 成人在线一区二区 | 日韩av线观看 | 日本韩国在线 | 深夜成人| 4455永久在线视频观看 | 亚洲乱码一区二区三区国产精品 | 向日葵视频app下载18岁以下勿看 | 洗濯屋动漫在线观看 | yellow在线 | 欧美一区二区三区综合色视频 | 欧美特黄三级在线观看 | 亚洲精品国产自在现线最新 | 114级毛片免费观看 1024亚洲天堂 | 国产玖玖在线观看 | 99国产在线视频 | 九九99香蕉在线视频免费 | 香蕉tv国产在线永久播放 | 久青草国产97香蕉在线视频 | 欧美色图日韩 | 国产欧美日韩免费一区二区 |