4月份開始996加班直到8月中旬結(jié)束冕香,然后就是忙碌的辭職、開始找工作镣奋,現(xiàn)在終于算是進(jìn)入一種理性的狀態(tài)了币呵。記錄一下工作中的一點(diǎn)坑。
初來公司侨颈,需要寫一個(gè)自己部門的查詢余赢,然后就開始籌備掸驱,所有東西都是從0開始搭建,還好第一步只實(shí)現(xiàn)能展現(xiàn)即可没佑。果斷選擇了spring boot毕贼。 ?因?yàn)橹肮疽灿蓄愃频男枨螅且粋€(gè)架構(gòu)搭建了一套蛤奢,我才第一次認(rèn)識(shí)到了spring boot鬼癣。然后自己私下學(xué)了簡單應(yīng)用,后來忙于工作和看書啤贩,這塊就扔掉了〈海現(xiàn)在算是一個(gè)全新的機(jī)會(huì)學(xué)習(xí)吧。
第一個(gè)問題:用httpClient請(qǐng)求遠(yuǎn)程數(shù)據(jù)接口遇到登錄問題痹屹,第一次用httpClient章郁,這下直接蒙圈了,這怎么解決志衍?之前開發(fā)的遠(yuǎn)程數(shù)據(jù)請(qǐng)求都是無權(quán)限驗(yàn)證暖庄,然后就開始百度,大概了解了機(jī)制后楼肪,開始解決這個(gè)問題培廓。
第一步:去到登錄頁,拿到登錄請(qǐng)求的鏈接的參數(shù)春叫,這一步具體怎么操作肩钠,稍微說一下,用chrom瀏覽器(就是為了頁面請(qǐng)求查看和調(diào)試方便)的調(diào)試臺(tái)暂殖,然后查看了請(qǐng)求鏈接价匠,和請(qǐng)求參數(shù).
第二步:根據(jù)請(qǐng)求信息自己構(gòu)造了PostMethod方法請(qǐng)求,這樣就實(shí)現(xiàn)了遠(yuǎn)程登錄呛每。然后我們內(nèi)部的系統(tǒng)是這樣的踩窖,登錄會(huì)攜帶一個(gè)returnUrl在成功后直接重定向到該請(qǐng)求,我的所有數(shù)據(jù)都是在這個(gè)請(qǐng)求里莉给,然后再在同一個(gè)httpClient對(duì)象實(shí)例下去直接請(qǐng)求數(shù)據(jù)源毙石,這樣就拿到了數(shù)據(jù)廉沮。
這里只是在請(qǐng)求數(shù)據(jù)源前多了一步登錄操作颓遏。問題還是非常容易解決。
其實(shí)這里還有個(gè)問題滞时,因?yàn)槲业恼?qǐng)求是并發(fā)的叁幢,創(chuàng)建多個(gè)線程去請(qǐng)求數(shù)據(jù),這樣就造成了每一次查詢都要并發(fā)的登錄N次坪稽,這樣的程序設(shè)計(jì)出來曼玩,呵呵鳞骤!那怎么解決呢?
如果對(duì)session和cookie原理理解的同學(xué)很容易就會(huì)想到黍判,我們可以把第一個(gè)請(qǐng)求的數(shù)據(jù)請(qǐng)求返回的結(jié)果中拿到這些值豫尽,然后保存起來,之后的每次創(chuàng)建httpClient對(duì)象就直接去容器中拿到這些信息攜帶過去就實(shí)現(xiàn)了顷帖,這里還有個(gè)問題是美旧,我們的session機(jī)制的問題,服務(wù)端會(huì)設(shè)置一定時(shí)間過期贬墩,那么過期后怎么辦呢榴嗅,這里呢我想了幾種解決方案。
方案1:請(qǐng)求進(jìn)來先去判斷容器里有沒有陶舞,沒有的話嗽测,去請(qǐng)求登錄并返回結(jié)果中拿到的值去放到容器中,然后再進(jìn)行數(shù)據(jù)請(qǐng)求肿孵,拿到的結(jié)果進(jìn)行驗(yàn)證唠粥,如果返回登錄頁,則清空容器再進(jìn)行登錄操作保存最新值停做。
方案2:單獨(dú)起一個(gè)線程去執(zhí)行登錄操作厅贪,并定時(shí)的拿這個(gè)值去驗(yàn)證是否過期,請(qǐng)求線程只負(fù)責(zé)拿值去請(qǐng)求即可雅宾。
方案3:借用生產(chǎn)者消費(fèi)者的模型养涮,如果請(qǐng)求數(shù)據(jù)發(fā)現(xiàn)請(qǐng)求過期、阻塞眉抬,喚醒一個(gè)永久存活的線程去執(zhí)行登錄操作贯吓,寫到容器中,然后執(zhí)行喚醒操作蜀变,自己請(qǐng)求返回正常則再次阻塞悄谐。
從復(fù)雜度來講,每個(gè)請(qǐng)求都去執(zhí)行登錄操作是最簡單的實(shí)現(xiàn)方式库北,其他幾種
第二個(gè)坑是springboot的靜態(tài)資源引用問題爬舰。
默認(rèn)情況下html是在templates下,js,img等是在static下寒瓦。在頁面引入的時(shí)候?qū)懼苯勇窂郊纯伞?/p>
我以為是我配置哪里有問題了情屹,搞到最后才明白,頁面引入資源的時(shí)候杂腰,寫的路徑一定是從static下一層開始的垃你,千萬別帶static。 這個(gè)問題搞了我2小時(shí),還是今天早上我百度時(shí)候看了另外一個(gè)路徑惜颇,然后自己嘗試了下發(fā)現(xiàn)能找到皆刺,請(qǐng)求時(shí)候沒寫static,然后切換回原來的路徑下發(fā)現(xiàn)也OK了凌摄。
這里的.. ?代表著 ?請(qǐng)求路徑前綴羡蛾,比如 ?http://localhost:8080/
如果這里配置了server.context-path=項(xiàng)目名? ? 則..代表著http://localhost:8080/項(xiàng)目名
如果不加..? 則 直接在填寫的js路徑前加上http://localhost:8080/
比如你引入路徑為 src="/a/b/c",? 則發(fā)現(xiàn)請(qǐng)求路徑是http://localhost:8080/a/b/c
問題3:通常jsp頁面我們一般用request對(duì)象獲取項(xiàng)目的path,這樣通過path+相對(duì)請(qǐng)求就可以構(gòu)建完整的請(qǐng)求锨亏,但是html沒有request對(duì)象林说,需要寫相對(duì)或者絕對(duì)路徑。在windows下昨晚用
http://127.0.0.1:8080/請(qǐng)求路徑 ? ?ajax調(diào)用 ? 不管怎么調(diào)試 ?都是進(jìn)入了error屯伞。百度了半天也沒有人說啥問題腿箩,今天早上又折騰了4小時(shí)就在最后快要絕望的時(shí)候,看到有個(gè)帖子說可能是跨域問題劣摇,于是我改了localhost ?發(fā)現(xiàn) ?請(qǐng)求就正常了珠移。又做了其他測(cè)試,發(fā)現(xiàn)和上面的類似末融。
如果配置為url:'http://127.0.0.1:8090/項(xiàng)目自定義名稱/請(qǐng)求路徑'钧惧,則ajax會(huì)因?yàn)榭缬蜻M(jìn)入error
如果配置為url:'http://localhost:8090/項(xiàng)目自定義名稱/請(qǐng)求路徑',則ajax請(qǐng)求正常
如果配置為:url:'/請(qǐng)求路徑'勾习,且未配置server.content-path浓瞪,請(qǐng)求正常
如果配置為:url:'/請(qǐng)求路徑',且配置server.content-path巧婶,請(qǐng)求報(bào)錯(cuò)
如果配置為:url:'../請(qǐng)求路徑'乾颁,且配置server.content-path,請(qǐng)求正常
這里留有疑問艺栈,關(guān)于linux和windows下對(duì)127.0.0.1的ajax的識(shí)別問題英岭。抽時(shí)間一定要搞清楚ajax請(qǐng)求判斷是否跨域這個(gè)問題是否與操作系統(tǒng)有關(guān)