<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 2673字,需瀏覽 6分鐘

           ·

          2020-10-01 19:55

          每天早上七點(diǎn)三十,準(zhǔn)時(shí)推送干貨

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

          需求

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

          入坑經(jīng)歷

          首先看下最開始的代碼:

          ?@RequestMapping(value?=?"/getConfig")
          ????public?Object?getConfig(HttpServletRequest?request){
          ???????return?readConfig();
          ????}

          ?/**
          ?????*?讀取配置文件
          ?????*?@return
          ?????*/

          ????private?UedConfig?readConfig()?{
          ????????String?path?=?this.getClass().getResource("/").getPath();
          ????????FileInputStream?fileInputStream?=?new?FileInputStream(path?+?"config/ued_config.json");
          ????????//讀出來,轉(zhuǎn)成對象返回
          ????????...
          ????}

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

          @ControllerAdvice
          public?class?JsonpAdvice?extends?AbstractJsonpResponseBodyAdvice?{
          ????public?JsonpAdvice(){
          ????????super("callback");
          ????}
          }

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

          @RequestMapping(value?=?"/getConfig")
          public?Object?getConfig(String?callback,HttpServletRequest?request){
          ????return?new?JSONPObject(callback,readConfig());
          }

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

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

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

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

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

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

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

          /**
          ?????*?讀取配置文件
          ?????*?@return
          ?????*/

          private?UedConfig?readConfig()?{
          ????InputStream?resourceAsStream?=?this.getClass().getResourceAsStream("/"+"config/ued_config.json");
          ????//讀出來,轉(zhuǎn)成對象返回
          ????...
          }

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

          總結(jié)

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

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

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


          瀏覽 37
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  中国美女一级特黄大片视频软件 | 后入少妇视频在线观看 | AV中文字幕乱伦 | 久久精品免费 | 中文无码一区二区三区四区五区六区七区 |