自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一個簡單的跨域問題,一不小心就帶來三個大大的 BUG

開發(fā) 前端
我是阿粉,最近在做一個前后分離的項目,天天除了跟前端就是跟測試撕逼。今天,阿粉帶著大家來了解一下 最近在項目中遇到的一個坑。

hello 大家好,我是阿粉,最近在做一個前后分離的項目,天天除了跟前端就是跟測試撕逼。今天,阿粉帶著大家來了解一下 最近在項目中遇到的一個坑。

[[344473]]

需求

前端用了個富文本插件 Ueditor ,插件初始化的時候需要從后端獲取 config 配置。

入坑經(jīng)歷

首先看下最開始的代碼:

  1. @RequestMapping(value = "/getConfig"
  2.    public Object getConfig(HttpServletRequest request){ 
  3.       return readConfig(); 
  4.    } 
  5.  
  6. /** 
  7.     * 讀取配置文件 
  8.     * @return 
  9.     */ 
  10.    private UedConfig readConfig() { 
  11.        String path = this.getClass().getResource("/").getPath(); 
  12.        FileInputStream fileInputStream = new FileInputStream(path + "config/ued_config.json"); 
  13.        //讀出來,轉(zhuǎn)成對象返回 
  14.        ... 
  15.    } 

代碼大概就是這樣,然后啟動起來之后,前端告訴我沒有獲取到信息。納尼,我postman自測都沒問題,有數(shù)據(jù)返回。然后阿粉跑去問前端,有報錯嗎?前端說跨域了。當(dāng)時阿粉就不樂意了,馬上 ctrl+c 加上ctrl+v 把后端處理跨域請求的配置發(fā)給前端。然后前端告訴我是jsonp 請求跨域。阿粉一臉懵逼???jsonp 跨域?沒聽說過啊。馬上找度娘去,果然一搜全是處理方式。因為是 springboot 項目,所以找了個最簡單的。看代碼:

  1. @ControllerAdvice 
  2. public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice { 
  3.     public JsonpAdvice(){ 
  4.         super("callback"); 
  5.     } 

看,是不是很簡單。要是 AbstractJsonpResponseBodyAdvice 這個單詞下面沒有紅線就更完美了。沒有引入類嗎?怎么難得倒阿粉呢。alt+enter,嗯哼,什么情況,沒有這個類?不可能啊。馬上問度娘一下,原來這個類是 springboot 2.0以下才有。那怎么辦呢?2.0以上好像沒有處理 jsonp 跨域的方式啊。阿粉又在百度搜啊搜,果然,皇天不負(fù)有心人,阿粉看到 jackson 里面有個類 JSONPObject 可以處理,然后阿粉改了一下代碼:

  1. @RequestMapping(value = "/getConfig"
  2. public Object getConfig(String callback,HttpServletRequest request){ 
  3.     return new JSONPObject(callback,readConfig()); 

然后重啟,自測沒問題。讓前端試下,可以正常獲取。OK,完美。

后面項目完成了,前后端也對接完了,發(fā)到測試環(huán)境,讓測試人員測試。Duang~一個bug扔阿粉頭上,獲取配置失敗。不可能啊,肯定是前端的問題,跑去找前端讓前端看下。前端看了之后給我來了一句,測試環(huán)境不跨域。瞬間一萬頭草尼瑪從頭上飄過。阿粉辛辛苦苦花了幾個小時才把跨域問題處理了,你給我說測試環(huán)境不跨域。

哎,沒辦法,這口鍋只能自己含淚抗下了。然后阿粉又改了一次代碼:

  1. @RequestMapping(value = "/getConfig"
  2. public Object getConfig(String callback,HttpServletRequest request){ 
  3.     return StringUtils.isEmpty(callback) ? readConfig() : new JSONPObject(callback,readConfig()); 

還是做了個兼容,因為前端還需要連我本地調(diào)試。不過這次應(yīng)該沒有問題了吧,阿粉心里還是有些小得意。提交代碼,發(fā)測試,搞定。

Duang~同樣的bug再一次扔在了阿粉臉上。心都涼了,怎么回事呢?日志也沒報錯啊。搗鼓半天,不知道什么原因,阿粉只能加寫log,因為在測試環(huán)境不好調(diào)試,也沒報錯。然后讓運維配合一下,然后發(fā)現(xiàn) this.getClass().getResource("/").getPath() 得到的路徑不對,阿粉再一次一臉懵逼,這個不是獲取項目根路徑嗎?怎么回事呢。

然后阿粉又厚著臉皮找度娘,果然一下就找到原因了,因為 springboot 集成了tomcat,項目直接是打成 jar 包運行的,不能通過 this.getClass().getResource("/").getPath() 這種獲取項目根路徑的方式來獲取,只能通過流的方式,然后阿粉又改了下代碼:

  1. /** 
  2.      * 讀取配置文件 
  3.      * @return 
  4.      */ 
  5. private UedConfig readConfig() { 
  6.     InputStream resourceAsStream = this.getClass().getResourceAsStream("/"+"config/ued_config.json"); 
  7.     //讀出來,轉(zhuǎn)成對象返回 
  8.     ... 

好了,這次提交之后終于可以了。解決了 bug ,阿粉心里美滋滋。

總結(jié)

經(jīng)??吹揭恍┬』锇檎f,本地對接沒問題,怎么一到測試環(huán)境就那么多 bug 呢。阿粉總結(jié)了一下,主要還是以下幾點:

  • 系統(tǒng)不一樣,本地一般都是window系統(tǒng),而測試和線上一般都是 linux 系統(tǒng)。
  • 運行方式不一樣,本地 springboot 項目是通過代碼工具 (idea)啟動,而測試和線上是通過 jar 包啟動。
  • 比如還有一些其他 jar 引入的問題
  • 。。。

好了,阿粉這次的分享就到這里了。希望閱讀阿粉文章的朋友少走一些彎路。要是覺得有用的話,記得點個贊哦。

 

責(zé)任編輯:趙寧寧 來源: Java極客技術(shù)
相關(guān)推薦

2020-10-28 15:07:01

Arthas

2021-07-28 05:01:29

Lombok前端測試

2023-03-10 08:27:07

for循環(huán)項目線性結(jié)構(gòu)

2021-01-05 22:49:37

Python編程語言Java

2020-10-26 08:56:32

技術(shù)總監(jiān)程序員

2025-03-05 00:27:00

2021-05-11 16:20:02

網(wǎng)站HTTPHTTPS

2021-04-30 08:21:22

Linux管道設(shè)計

2021-03-29 18:47:53

APP服務(wù)端通信安全數(shù)據(jù)安全

2018-01-18 22:26:30

2021-10-07 16:45:06

MySQL數(shù)據(jù)庫

2024-05-13 07:58:52

開源項目PR

2021-01-30 09:50:54

MySQL密碼服務(wù)器

2019-09-19 20:47:29

刷臉支付人臉識別人工智能

2021-03-23 18:01:14

SQL數(shù)據(jù)庫前端

2022-11-03 17:33:40

JavaString 類型

2020-04-30 09:45:41

安卓App小米

2022-09-27 18:19:32

Java數(shù)據(jù)結(jié)構(gòu)

2022-05-27 07:03:04

JDK場景線程

2021-12-09 11:31:16

跨域后端開發(fā)
點贊
收藏

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