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

創(chuàng)新互聯(lián)專(zhuān)注為客戶(hù)提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都做網(wǎng)站、網(wǎng)站建設(shè)、永安網(wǎng)絡(luò)推廣、微信小程序、永安網(wǎng)絡(luò)營(yíng)銷(xiāo)、永安企業(yè)策劃、永安品牌公關(guān)、搜索引擎seo、人物專(zhuān)訪(fǎng)、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供永安建站搭建服務(wù),24小時(shí)服務(wù)熱線(xiàn):18980820575,官方網(wǎng)址:www.cdcxhl.com
需求
前端用了個(gè)富文本插件 Ueditor ,插件初始化的時(shí)候需要從后端獲取 config 配置。
入坑經(jīng)歷
首先看下最開(kāi)始的代碼:
- @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");
- //讀出來(lái),轉(zhuǎn)成對(duì)象返回
- ...
- }
代碼大概就是這樣,然后啟動(dòng)起來(lái)之后,前端告訴我沒(méi)有獲取到信息。納尼,我postman自測(cè)都沒(méi)問(wèn)題,有數(shù)據(jù)返回。然后阿粉跑去問(wèn)前端,有報(bào)錯(cuò)嗎?前端說(shuō)跨域了。當(dāng)時(shí)阿粉就不樂(lè)意了,馬上 ctrl+c 加上ctrl+v 把后端處理跨域請(qǐng)求的配置發(fā)給前端。然后前端告訴我是jsonp 請(qǐng)求跨域。阿粉一臉懵逼???jsonp 跨域?沒(méi)聽(tīng)說(shuō)過(guò)啊。馬上找度娘去,果然一搜全是處理方式。因?yàn)槭?springboot 項(xiàng)目,所以找了個(gè)最簡(jiǎn)單的??创a:
- @ControllerAdvice
- public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice {
- public JsonpAdvice(){
- super("callback");
- }
- }
看,是不是很簡(jiǎn)單。要是 AbstractJsonpResponseBodyAdvice 這個(gè)單詞下面沒(méi)有紅線(xiàn)就更完美了。沒(méi)有引入類(lèi)嗎?怎么難得倒阿粉呢。alt+enter,嗯哼,什么情況,沒(méi)有這個(gè)類(lèi)?不可能啊。馬上問(wèn)度娘一下,原來(lái)這個(gè)類(lèi)是 springboot 2.0以下才有。那怎么辦呢?2.0以上好像沒(méi)有處理 jsonp 跨域的方式啊。阿粉又在百度搜啊搜,果然,皇天不負(fù)有心人,阿粉看到 jackson 里面有個(gè)類(lèi) JSONPObject 可以處理,然后阿粉改了一下代碼:
- @RequestMapping(value = "/getConfig")
- public Object getConfig(String callback,HttpServletRequest request){
- return new JSONPObject(callback,readConfig());
- }
然后重啟,自測(cè)沒(méi)問(wèn)題。讓前端試下,可以正常獲取。OK,完美。
后面項(xiàng)目完成了,前后端也對(duì)接完了,發(fā)到測(cè)試環(huán)境,讓測(cè)試人員測(cè)試。Duang~一個(gè)bug扔阿粉頭上,獲取配置失敗。不可能啊,肯定是前端的問(wèn)題,跑去找前端讓前端看下。前端看了之后給我來(lái)了一句,測(cè)試環(huán)境不跨域。瞬間一萬(wàn)頭草尼瑪從頭上飄過(guò)。阿粉辛辛苦苦花了幾個(gè)小時(shí)才把跨域問(wèn)題處理了,你給我說(shuō)測(cè)試環(huán)境不跨域。
哎,沒(méi)辦法,這口鍋只能自己含淚抗下了。然后阿粉又改了一次代碼:
- @RequestMapping(value = "/getConfig")
- public Object getConfig(String callback,HttpServletRequest request){
- return StringUtils.isEmpty(callback) ? readConfig() : new JSONPObject(callback,readConfig());
- }
還是做了個(gè)兼容,因?yàn)榍岸诉€需要連我本地調(diào)試。不過(guò)這次應(yīng)該沒(méi)有問(wèn)題了吧,阿粉心里還是有些小得意。提交代碼,發(fā)測(cè)試,搞定。
Duang~同樣的bug再一次扔在了阿粉臉上。心都涼了,怎么回事呢?日志也沒(méi)報(bào)錯(cuò)啊。搗鼓半天,不知道什么原因,阿粉只能加寫(xiě)log,因?yàn)樵跍y(cè)試環(huán)境不好調(diào)試,也沒(méi)報(bào)錯(cuò)。然后讓運(yùn)維配合一下,然后發(fā)現(xiàn) this.getClass().getResource("/").getPath() 得到的路徑不對(duì),阿粉再一次一臉懵逼,這個(gè)不是獲取項(xiàng)目根路徑嗎?怎么回事呢。
然后阿粉又厚著臉皮找度娘,果然一下就找到原因了,因?yàn)?springboot 集成了tomcat,項(xiàng)目直接是打成 jar 包運(yùn)行的,不能通過(guò) this.getClass().getResource("/").getPath() 這種獲取項(xiàng)目根路徑的方式來(lái)獲取,只能通過(guò)流的方式,然后阿粉又改了下代碼:
- /**
- * 讀取配置文件
- * @return
- */
- private UedConfig readConfig() {
- InputStream resourceAsStream = this.getClass().getResourceAsStream("/"+"config/ued_config.json");
- //讀出來(lái),轉(zhuǎn)成對(duì)象返回
- ...
- }
好了,這次提交之后終于可以了。解決了 bug ,阿粉心里美滋滋。
總結(jié)
經(jīng)常看到一些小伙伴說(shuō),本地對(duì)接沒(méi)問(wèn)題,怎么一到測(cè)試環(huán)境就那么多 bug 呢。阿粉總結(jié)了一下,主要還是以下幾點(diǎn):
- 系統(tǒng)不一樣,本地一般都是window系統(tǒng),而測(cè)試和線(xiàn)上一般都是 linux 系統(tǒng)。
- 運(yùn)行方式不一樣,本地 springboot 項(xiàng)目是通過(guò)代碼工具 (idea)啟動(dòng),而測(cè)試和線(xiàn)上是通過(guò) jar 包啟動(dòng)。
- 比如還有一些其他 jar 引入的問(wèn)題
- 。。。
好了,阿粉這次的分享就到這里了。希望閱讀阿粉文章的朋友少走一些彎路。要是覺(jué)得有用的話(huà),記得點(diǎn)個(gè)贊哦。
網(wǎng)站題目:一個(gè)簡(jiǎn)單的跨域問(wèn)題,一不小心就帶來(lái)三個(gè)大大的BUG
網(wǎng)站URL:http://fisionsoft.com.cn/article/ccddcsd.html


咨詢(xún)
建站咨詢(xún)
