精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

借一古老技術(shù)考察你對(duì)SpringBoot掌握程度

開發(fā) 前端
我們的服務(wù)端又該實(shí)現(xiàn)呢?直接在對(duì)應(yīng)的接口中進(jìn)行修改嗎?如果直接修改接口,那么當(dāng)我又希望返回的是數(shù)據(jù)又該如何,重新再來一個(gè)接口嗎?

環(huán)境:Spring3.2.5

本篇文章將通過一個(gè)古老的技術(shù)JSONP來考察在座的對(duì)SpringBoot中某些技術(shù)的掌握程度。

1. 簡介

JSONP(JSON with Padding)是一種非官方的協(xié)議,主要用于解決瀏覽器跨域數(shù)據(jù)訪問的問題。它利用HTML的<script>標(biāo)簽可以跨域加載資源的特性,通過服務(wù)器端生成包含JSON數(shù)據(jù)的JavaScript函數(shù)調(diào)用,并返回給客戶端執(zhí)行。客戶端需要預(yù)先定義好回調(diào)函數(shù),以便在數(shù)據(jù)加載完畢后接收并處理數(shù)據(jù)。JSONP簡單易用,但僅支持GET請(qǐng)求,且存在安全風(fēng)險(xiǎn),如XSS攻擊和CSRF攻擊。隨著技術(shù)的發(fā)展,CORS等更安全的跨域解決方案逐漸取代了JSONP。

關(guān)于JSONP的應(yīng)用示例

現(xiàn)有如下接口地址:http://localhost:9100/jsonps,返回?cái)?shù)據(jù)如下:

[{"id":1,"name":"張三"},{"id":2,"name":"李四"},{"id":3,"name":"王五"}]

JSONP需要我們傳遞一個(gè)類似回調(diào)的參數(shù),服務(wù)端拿到值后會(huì)將最終的響應(yīng)數(shù)據(jù)拼接成javascript函數(shù)調(diào)用的形式,如下:

<script src="http://localhost:9100/jsonps?callback=getUsers"></script>

通過<script>標(biāo)簽引用上面的即可地址,同時(shí)傳遞了callback參數(shù),當(dāng)請(qǐng)求到達(dá)服務(wù)端后會(huì)拿到callback參數(shù)對(duì)應(yīng)的getUsers值,與真正的數(shù)據(jù)做拼接,如下:

getUsers([{"id":1,"name":"張三"},{"id":2,"name":"李四"},{"id":3,"name":"王五"}]);

上面將是服務(wù)端響應(yīng)的最終結(jié)果。這就是javascript函數(shù)的調(diào)用,我們只要保證前端頁面中有g(shù)etUsers函數(shù)即可,它會(huì)自動(dòng)的執(zhí)行該函數(shù)。

以上就是JSONP實(shí)現(xiàn)的基本原理。

思考:我們的服務(wù)端又該實(shí)現(xiàn)呢?直接在對(duì)應(yīng)的接口中進(jìn)行修改嗎?如果直接修改接口,那么當(dāng)我又希望返回的是數(shù)據(jù)又該如何,重新再來一個(gè)接口嗎?

接下來我們通過HttpMessageConverter和ResponseBodyAdvice來實(shí)現(xiàn)即支持原始數(shù)據(jù)又支持JSONP格式的數(shù)據(jù)響應(yīng)。

2. 實(shí)戰(zhàn)案例

2.1 Rest接口定義

@RestController
@RequestMapping(("/jsonps"))
public class JsonpController {
  
  static List<User> DATAS = List.of(new User(1L, "張三"), new User(2L, "李四"), new User(3L, "王五")) ;
  
  @GetMapping("")
  public List<User> queryUsers() {
    return DATAS ;
  }
}

接口非常簡單直接返回List集合。

2.2 自定義JSON包裝器

public class JsonpMappingJacksonValue extends MappingJacksonValue {


  private String jsonpFunction ;
  
  public JsonpMappingJacksonValue(Object value) {
    super(value);
  }
  // getters, setters
}

該類繼承了MappingJacksonValue,同時(shí)增加了jsonpFunction的屬性,后面會(huì)根據(jù)該屬性是否有值對(duì)結(jié)果進(jìn)行處理,如果沒有值則原始返回。而MappingJacksonValue類的作用就是一個(gè)POJO序列化到JSON時(shí)提供額外的序列號(hào)指令。

SpringBoot默認(rèn)響應(yīng)JSON數(shù)據(jù)是通過MappingJackson2HttpMessageConverter類,在該類中的writeInternal方法中會(huì)判斷當(dāng)前輸出的值是否是MappingJacksonValue,如果是最終也會(huì)獲取其中的Value進(jìn)行輸出客戶端的。

2.3 自定義ResponseBodyAdvice

@ControllerAdvice
public class JsonpControllerAdvice implements ResponseBodyAdvice<Object> {


  // 參數(shù)值必須滿足該正則
  private static final Pattern CALLBACK_PARAM_PATTERN = Pattern.compile("[0-9A-Za-z_\\.]*");
  // 參數(shù)名稱默認(rèn)callback,你也可以通過配置方式設(shè)置
  private String jsonpQueryParamName = "callback" ;
  
  @Override
  public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
    // 只要轉(zhuǎn)換器是jackson(json數(shù)據(jù)輸出)
    // 當(dāng)然你也可以自定義實(shí)現(xiàn),比如:方法上有具體的某個(gè)注解等
    return AbstractJackson2HttpMessageConverter.class.isAssignableFrom(converterType);
  }
  @Override
  public Object beforeBodyWrite(
      Object body, MethodParameter returnType, 
      MediaType selectedContentType,
      Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
      ServerHttpResponse response) {
    // 創(chuàng)建MappingJacksonValue對(duì)象(包裝原始的數(shù)據(jù))
    JsonpMappingJacksonValue container = this.getOrCreateContainer(body) ;
    // 取得請(qǐng)求的callback參數(shù)值
    HttpServletRequest servletRequest = ((ServletServerHttpRequest) request).getServletRequest() ;
    String value = servletRequest.getParameter(jsonpQueryParamName) ;
    // 如果不存在直接返回,不做任何處理
    if (value != null) {
      // 不滿足條件也直接返回
      if (!CALLBACK_PARAM_PATTERN.matcher(value).matches()) {
        return container ;
      }
      // 設(shè)置響應(yīng)頭為:application/javascript;charset=utf-8
      MediaType contentTypeToUse = new MediaType("application", "javascript", StandardCharsets.UTF_8) ;
      response.getHeaders().setContentType(contentTypeToUse) ;
      // 設(shè)置jsonp函數(shù)名,后面就會(huì)根據(jù)該值判斷是否要進(jìn)行處理
      container.setJsonpFunction(value) ;
    }
    return container ;
  }
  // ...
}

自定義ResponseBodyAdvice的作用是將返回客戶端的數(shù)據(jù)包裝為MappingJacksonValue對(duì)象,然后設(shè)置jsonp會(huì)調(diào)用函數(shù)名。

接下來就是最重要的,如何在寫入客戶端時(shí),將數(shù)據(jù)改造成JSONP所需要的格式。

2.4 重寫HttpMessageConverter

@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
  MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter() {
    protected void writePrefix(JsonGenerator generator, Object object) throws IOException {
      // 我們上面設(shè)置的值在這里用上了,關(guān)鍵就在該值是否有
      // 只有有值的情況下我們才會(huì)進(jìn)行JSONP的處理
      String jsonpFunction =
          (object instanceof JsonpMappingJacksonValue ? ((JsonpMappingJacksonValue) object).getJsonpFunction() : null);
      if (jsonpFunction != null) {
        generator.writeRaw("/**/");
        generator.writeRaw(jsonpFunction + "(");
      }
    }
    protected void writeSuffix(JsonGenerator generator, Object object) throws IOException {
      String jsonpFunction =
          (object instanceof JsonpMappingJacksonValue ? ((JsonpMappingJacksonValue) object).getJsonpFunction() : null);
      if (jsonpFunction != null) {
        generator.writeRaw(");") ;
      }
    }
  } ;
  return converter ;
}

在這里我們自定義了MappingJackson2HttpMessageConverter 的writePrefix和writeSuffix方法,這兩個(gè)方法都進(jìn)行判斷,如果期望輸出的是JSONP格式才會(huì)進(jìn)行數(shù)據(jù)處理。

到此就完成了所有處理過程,每一步你都懂嗎?

說明:本篇文章不是教你實(shí)現(xiàn)JSONP這個(gè)技術(shù)并使用它,JSONP本就是用來解決跨域的問題,我用CORS技術(shù)不比它簡單,安全。這里只是借用這個(gè)JSONP來檢驗(yàn)?zāi)銓?duì)其它知識(shí)的掌握程度。

驗(yàn)證上面的代碼

不使用callback參數(shù)請(qǐng)求

圖片圖片

使用callback參數(shù)請(qǐng)求

圖片圖片

成功,當(dāng)你的頁面中有g(shù)etUsers方法時(shí),會(huì)自動(dòng)調(diào)用getUsers方法。

通過HTML頁面進(jìn)行測試

<html>
  <head>
    <script>
      function getUsers(users) {
        alert(JSON.stringify(users))
      }
    </script>
    <script src="http://localhost:9100/jsonps?callback=getUsers"></script>
  </head>
</html>

訪問上面的頁面,輸出結(jié)果:

圖片 圖片

責(zé)任編輯:武曉燕 來源: Spring全家桶實(shí)戰(zhàn)案例源碼
相關(guān)推薦

2024-11-01 08:34:18

Spring配置@Bean

2015-09-15 09:50:12

2020-11-09 07:25:20

函數(shù) JavaScript數(shù)據(jù)

2021-10-21 08:13:11

Springboot

2018-02-08 10:47:19

存儲(chǔ)技術(shù)列存儲(chǔ)

2020-12-10 11:00:37

JavaJVM命令

2025-05-21 09:32:28

2015-09-29 09:24:22

Node.js面試題

2023-03-23 08:11:59

2020-05-06 14:54:59

技術(shù)人工智能大數(shù)據(jù)

2023-10-24 11:44:21

2018-02-02 16:41:01

程序員編程Web

2024-04-12 09:01:08

2022-02-18 07:32:13

Linux項(xiàng)目代碼

2010-08-04 15:01:00

2019-09-29 15:30:58

JavaScript框架V8

2016-12-26 16:34:41

技術(shù)

2024-08-13 08:30:13

2022-07-24 09:56:40

大數(shù)據(jù)技術(shù)

2020-02-03 13:55:49

技術(shù)研發(fā)指標(biāo)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

www.成人在线观看| 欧美黑人欧美精品刺激| 亚洲小说区图片| 成人一区二区三区中文字幕| 538国产精品视频一区二区| 无码一区二区三区在线| 成人影院网站ww555久久精品| 亚洲精品高清在线| 蜜桃精品久久久久久久免费影院| 中文字幕无码乱码人妻日韩精品| 国产精品大片| 在线国产精品视频| 欧美做受高潮中文字幕| 日韩漫画puputoon| 亚洲国产精品嫩草影院| 亚洲成人一区二区三区| 色综合久久久久久| 国内久久婷婷综合| 6080yy精品一区二区三区| 亚洲熟女少妇一区二区| 亚洲高清极品| 欧美mv日韩mv国产| 色天使在线观看| 亚洲精品日产| 亚洲一区在线视频| 一区二区日本伦理| 精品影院一区| 不卡一卡二卡三乱码免费网站| 国产欧美精品一区二区三区-老狼| 国产无套粉嫩白浆内谢| 亚洲精品久久久| 在线播放日韩av| 国产精品无码一区二区三区免费 | 午夜精品免费观看| 久久久久久久久99精品大| 亚洲女人被黑人巨大进入al| 中文字幕制服丝袜| 国产麻豆一区二区三区| 欧美这里有精品| 国产女大学生av| 蜜桃传媒在线观看免费进入 | 青青操在线视频观看| 国产日韩视频在线| 日韩福利在线播放| 给我免费观看片在线电影的| 日韩免费一级| 91精品国产综合久久国产大片| 国产又大又黄又粗的视频| 亚洲欧美电影| 欧美性69xxxx肥| 男人用嘴添女人下身免费视频| 四虎影院观看视频在线观看| 亚洲天堂免费在线观看视频| 日韩欧美在线一区二区| 男生女生差差差的视频在线观看| 91免费版在线| 日本视频一区二区不卡| 国产在线一二三| 国产欧美一区二区三区网站| 日韩免费av电影| p色视频免费在线观看| 中文字幕乱码一区二区免费| 天堂av一区二区| 在线观看黄色av| 欧美激情中文字幕| 亚洲一区精品视频| 中文字幕中文字幕在线十八区 | 九九热精彩视频| 黄色工厂这里只有精品| 性金发美女69hd大尺寸| 国产一级淫片a| 午夜影院日韩| 国产精品久久在线观看| 国产精品高潮呻吟av| 国产一区二区在线观看免费| 99热最新在线| 色视频在线看| 亚洲国产精品精华液ab| 视频一区二区视频| 97在线超碰| 欧美日韩一区二区在线 | 日本视频在线一区| 国产一区二区香蕉| www香蕉视频| 91麻豆国产福利在线观看| 日本在线高清视频一区| 欧美成人二区| 亚洲成a人v欧美综合天堂下载| 春日野结衣av| 亚洲一区av| 亚洲福利视频专区| 国产伦精品一区二区三区视频女| 66久久国产| 91av视频在线| 国产精品欧美激情在线| 成人国产免费视频| 亚洲精品一区二区三| 欧美日韩经典丝袜| 在线免费观看日韩欧美| 中文字幕1区2区| 精品免费一区二区| 欧美激情视频网址| 国产精华7777777| 国产成人高清视频| 水蜜桃一区二区| 男人天堂视频在线观看| 欧美日本视频在线| 亚洲欧美色图视频| 欧美在线网站| 国产成人久久久| 好吊色在线观看| 国产成人精品无码高潮| 99久久精品国产精品久久| 亚洲午夜精品久久久久久浪潮| av中文字幕在线看| 在线播放日韩导航| 国产精品无码一区二区三区| 欧美日韩国产成人精品| 国产精品网红福利| 手机亚洲第一页| 亚洲专区一二三| 污污的视频免费观看| 九九综合久久| 2019av中文字幕| 成人久久久精品国产乱码一区二区 | 国产精品美女久久久久aⅴ| 国内精品在线观看视频| 91丨精品丨国产| 一区二区三区黄色| 亚洲图片在线视频| 波多野结衣亚洲一区| 色哺乳xxxxhd奶水米仓惠香| 国产激情久久| 亚洲天堂一区二区三区| 国产精品21p| 99精品视频在线观看免费| 中国女人做爰视频| 精品国产一区二| 久久精品国产亚洲| 亚洲永久精品视频| 中文字幕av资源一区| 日日摸天天爽天天爽视频| 日韩精品免费一区二区三区竹菊| 久久久久久久一区二区| www.桃色av嫩草.com| 亚洲人成在线播放网站岛国| 污网站在线免费| 五月综合激情| 亚洲一区二区日本| 在线电影福利片| 欧美大胆人体bbbb| 国产一级特黄毛片| 99久久久精品| 人妻有码中文字幕| 欧美人与牛zoz0性行为| 国产99久久久欧美黑人| 搞黄视频免费在线观看| 欧美色老头old∨ideo| 久久午夜精品视频| 精品一区二区日韩| 黄色a级在线观看| 激情综合五月| 国产综合在线视频| 日本成人一区二区三区| 91黄视频在线| 在线免费看视频| 国内久久婷婷综合| 国产黄色片免费在线观看| 欧美挤奶吃奶水xxxxx| 欧美亚洲激情在线| 波多野结衣在线影院| 欧美日韩一区不卡| 美国黄色小视频| 99久久免费精品高清特色大片| 无码人妻丰满熟妇区毛片18| jiujiure精品视频播放| 92国产精品视频| 成年人黄色大片在线| 亚洲摸下面视频| 国产精品久久久久久久免费看 | 熟妇熟女乱妇乱女网站| 日本高清精品| 2019精品视频| 思思99re6国产在线播放| 欧美大胆人体bbbb| 国产寡妇亲子伦一区二区三区四区| 欧美激情综合网| 91亚洲一线产区二线产区 | 国产精品国产三级国产有无不卡 | 7777在线视频| 香蕉久久精品日日躁夜夜躁| 国产精品网址在线| 1区2区3区在线| 中文字幕亚洲欧美日韩高清| 精品国产免费无码久久久| 欧美日韩国产在线看| 国产wwwwxxxx| 99国产精品久久久久久久久久久 | 国产精品夜夜嗨| 欧美日韩在线中文| 91精品1区| 日本一区二区在线视频| 91在线一区| 国产精品久久久久久久久久久新郎| av文字幕在线观看| 亚洲欧美中文在线视频| 国产高清视频免费| 欧美色涩在线第一页| 国产污污视频在线观看| 中文字幕一区二区三区在线播放| 97香蕉碰碰人妻国产欧美| 国产在线精品一区二区| 韩国一区二区av| 伊人久久综合| ijzzijzzij亚洲大全| 国产精品日韩精品中文字幕| 国产精品国色综合久久| 亚洲欧美在线人成swag| 国产mv免费观看入口亚洲| 黑人玩欧美人三根一起进| 日韩中文在线视频| 少妇性bbb搡bbb爽爽爽欧美| 欧美变态凌虐bdsm| 在线观看免费中文字幕| 欧美性猛交99久久久久99按摩| 潘金莲一级黄色片| 国产精品家庭影院| 六月婷婷七月丁香| 91丨九色porny丨蝌蚪| 岛国大片在线免费观看| 精品一区二区在线播放| 午夜激情在线观看视频| 天堂av在线一区| 免费看的黄色大片| 亚洲精品社区| 日韩亚洲欧美视频| 国产一区二区三区四区三区四| 中文字幕欧美日韩一区二区| 日本女优一区| 日韩一区二区三区资源| 精品中文一区| 欧美日韩在线观看一区二区三区| 天堂av一区二区三区在线播放| 国产久一道中文一区| 999久久精品| 91视频99| theporn国产在线精品| 成人女人免费毛片| 精品少妇一区| 精品久久一区二区三区蜜桃| 久久aimee| 久久一区二区三区av| 久久大胆人体视频| 色一区在线观看| 中文字幕一区综合| 国产亚洲一卡2卡3卡4卡新区| 久久久久高清| 国产一区二区三区电影在线观看 | 国产精品15p| 国产专区一区二区| 亚洲图片久久| 日本不卡二区| 成人情趣视频网站| 麻豆中文字幕在线观看| 久久久久国产| 国产一二三在线视频| 国产一区二区三区成人欧美日韩在线观看| 国产精品无码一区二区在线| 日韩亚洲在线| 成人羞羞国产免费网站| 日本美女一区二区三区视频| 亚洲美女性囗交| 国产成人啪午夜精品网站男同| 9191在线视频| 91片黄在线观看| 永久免费av无码网站性色av| 国产精品久久久久久亚洲伦| 永久免费未视频| 亚洲国产精品人人做人人爽| 亚洲婷婷综合网| 欧美人与z0zoxxxx视频| 国产激情视频在线播放| 亚洲精品二三区| jyzzz在线观看视频| 欧美成人免费视频| 波多野结衣亚洲| 成人淫片在线看| 久久男人av| 亚洲精品乱码视频| 禁久久精品乱码| 亚洲欧美在线精品| 成人午夜精品一区二区三区| 美女被到爽高潮视频| 亚洲欧美日本在线| 国产成人免费看| 91精品久久久久久久久99蜜臂| 日韩在线视频免费| xxxxx成人.com| 中文字幕21页在线看| 91精品中文在线| 久久综合色占| 中文精品无码中文字幕无码专区| 久久黄色影院| 韩国三级在线看| 国产精品美女久久福利网站| 国产精品一区二区6| 欧美精品v国产精品v日韩精品| 婷婷久久久久久| 精品在线免费观看| 麻豆成人在线播放| 亚洲成人最新网站| www.欧美日本| 波多野结衣在线aⅴ中文字幕不卡| 一级片黄色录像| 色综合久久中文字幕| 成人午夜免费在线观看| 日韩中文字幕在线精品| 成人影院大全| 国产欧美在线一区二区| 91精品国产调教在线观看| 久久久精品在线视频| 高清不卡在线观看av| av在线免费播放网址| 色综合久久久久综合体桃花网| 亚洲国产精品suv| 久久影视电视剧免费网站清宫辞电视 | 一区二区视频免费观看| 日韩大片免费观看视频播放| 天堂va在线| 97视频中文字幕| 999久久久免费精品国产| 能看的毛片网站| 久久综合99re88久久爱| 日本系列第一页| 精品国产123| 香蕉久久aⅴ一区二区三区| 国产精品丝袜一区二区三区| 国产一区网站| 精品少妇无遮挡毛片| 91免费小视频| 男人午夜免费视频| 日韩av在线一区| 色综合桃花网| 久久国产欧美精品| 亚洲伊人网站| 国产精品揄拍100视频| 欧美日韩美女在线| 亚洲三级黄色片| 欧美一级视频在线观看| 一本色道久久综合亚洲精品酒店 | 香蕉久久久久久久| 欧美日韩亚洲丝袜制服| www.91在线| 亚洲xxxxx性| 欧美影院一区| 东京热av一区| 精品人伦一区二区三区蜜桃免费| 无码国产色欲xxxx视频| 91po在线观看91精品国产性色| 日韩在线你懂的| 蜜臀av午夜一区二区三区| 国产亚洲欧美日韩日本| 免费在线不卡av| 久久韩剧网电视剧| 秋霞一区二区| 免费拍拍拍网站| 91免费看片在线观看| av首页在线观看| 久久精品在线播放| 亚洲精品在线国产| 国产极品粉嫩福利姬萌白酱| 久久久夜色精品亚洲| 中文字幕有码视频| 欧美巨大黑人极品精男| 国产精品2023| 日韩一级在线免费观看| 中文字幕一区在线观看| 亚洲精品久久久久久无码色欲四季| 欧美二区在线播放| 亚洲人成网站77777在线观看| 在线免费观看视频黄| 亚洲女人****多毛耸耸8| 欧美熟妇交换久久久久久分类 | 免费又黄又爽又色的视频| 日韩av资源在线播放| 中文字幕系列一区| 久久久久久久久网| 91免费在线看| 国产草草影院ccyycom| 91av视频在线观看| 97久久视频| 久久精品女同亚洲女同13| 欧美丝袜第三区| 牛牛精品视频在线| 香蕉久久夜色| 成人免费观看av| 中文字幕视频二区| 97超碰蝌蚪网人人做人人爽| 国产高清欧美| 蜜桃av免费看|