這是一次關(guān)于服務(wù)器session丟失原因的排查莲蜘、分析和解決方案的整理
環(huán)境描述
自從app的2.2 版本上線以來(lái)谭确,就有一個(gè)問(wèn)題困擾著我,那就是我們的測(cè)試環(huán)境session丟失問(wèn)題票渠。但正是環(huán)境卻不會(huì)發(fā)生逐哈,所以這個(gè)問(wèn)題就一直拖著了。而正式環(huán)境和測(cè)試環(huán)境唯一的差別就是:測(cè)試環(huán)境使用的是IP地址问顷,并且其中商城模塊(做web請(qǐng)求的主要頁(yè)面)和普通接口請(qǐng)求(API)共用相同的IP地址鞠眉,只是端口不同,正式環(huán)境中商城的web請(qǐng)求和 API 請(qǐng)求使用域名服務(wù)器择诈。API的每次請(qǐng)求,都會(huì)保證當(dāng)前處于登陸狀態(tài)出皇,如果沒(méi)有登陸狀態(tài)羞芍,那么會(huì)自動(dòng)登陸,并且返回session郊艘,每次請(qǐng)求的登陸狀態(tài)驗(yàn)證荷科。如果客戶(hù)端發(fā)送請(qǐng)求中所帶的session和服務(wù)器不一致,那就是未登錄狀態(tài)纱注,從而要自動(dòng)重新登陸畏浆。
問(wèn)題發(fā)生
在測(cè)試環(huán)境中,從app頁(yè)面狞贱,進(jìn)入到商城(商城是作為整個(gè)客戶(hù)端的一個(gè)小模塊刻获,主要是web頁(yè)面通過(guò)JS 與本地APP進(jìn)行交互。商城獨(dú)立運(yùn)營(yíng))瞎嬉。在商城中操作蝎毡,知道需要調(diào)用原生的充值功能,在充值成功之后氧枣,通過(guò)OC的UIWebView的借口沐兵,調(diào)用商城的JS方法,達(dá)到刷新進(jìn)入原生充值頁(yè)面之前的web頁(yè)面便监。但問(wèn)題就是在這個(gè)時(shí)候發(fā)生扎谎,當(dāng)我通過(guò)web view調(diào)用js 的recharge方法時(shí)候,商城后臺(tái)接收到了方法烧董,并且也調(diào)用了更新webview 頁(yè)面的方法毁靶,但是,在客戶(hù)端解藻,沒(méi)有接收到webview的更新老充,也就是說(shuō),他們雖然調(diào)用了方法螟左,但實(shí)際上這個(gè)方法在執(zhí)行過(guò)程中啡浊,是失敗的觅够,沒(méi)有達(dá)到目的。通過(guò)調(diào)試巷嚣,發(fā)現(xiàn)商城的session(商城和API請(qǐng)求使用不同的session)丟失了喘先。所以webview的重新渲染是沒(méi)有發(fā)生的。
分析原因
我試著google 找了一些關(guān)于cookie的知識(shí)廷粒,然后通過(guò)apple的文檔窘拯,了解了apple中關(guān)于cookie的文檔,發(fā)現(xiàn)對(duì)于cookie而言坝茎,只要其名字涤姊,域名,和保存路徑相同嗤放,那么后一次寫(xiě)入的cookie就會(huì)覆蓋前一次的思喊。既然這樣蛤袒,我嘗試著自己來(lái)改變cookie凉蜂,自己設(shè)定他們的名字,再向服務(wù)器提交請(qǐng)求磨德,但請(qǐng)求之后再回來(lái)看cookie岳服,又變回默認(rèn)的名字剂公。那就可以推斷是服務(wù)器將請(qǐng)求發(fā)送過(guò)去的cookie信息重寫(xiě)了,所以我這邊怎么改變都是沒(méi)用的吊宋。這個(gè)時(shí)候纲辽,我開(kāi)始與商城中做前段的同事強(qiáng)哥交流請(qǐng)教,(強(qiáng)哥之前是做服務(wù)器段的璃搜,所以服務(wù)器那段的他都是知道的)文兑。因?yàn)樯坛莣eb請(qǐng)求與API請(qǐng)求的服務(wù)器都是使用IP地址,只是端口不同腺劣,那問(wèn)題就在端口上了绿贞,應(yīng)該是后臺(tái)服務(wù)器在向app端傳遞cookie時(shí)候,沒(méi)有加上端口的處理橘原,所以不管是商城請(qǐng)求還是API請(qǐng)求籍铁,后一次的cookie都會(huì)覆蓋前一次的cookie,具體到app里趾断,那就是從app 進(jìn)入到商城模塊拒名,這個(gè)時(shí)候,商城的cookie覆蓋了API的cookie芋酌,然后從商城進(jìn)入充值增显,在完成充值請(qǐng)求的時(shí)候,app發(fā)現(xiàn)cookie中的session與服務(wù)器不一致脐帝,于是app重新登陸同云,這個(gè)時(shí)候糖权,商城的cookie又被API的cookie覆寫(xiě)。也就是商城的session丟失了炸站。當(dāng)充值完成之后星澳,app端調(diào)用商城后臺(tái)的js 方法更新web的頁(yè)面,這個(gè)時(shí)候旱易,帶到商城后臺(tái)去的cookie禁偎,實(shí)際上是API的cookie,所以造成了調(diào)用失敗阀坏,無(wú)法更新app端的UI如暖。
解決問(wèn)題
解決問(wèn)題的方法,那就針對(duì)相同的域名/IP地址忌堂,在使用不同端口劃分模塊時(shí)候装处,修改服務(wù)器的配置,使兩個(gè)功能模塊的cookie能區(qū)分開(kāi)來(lái)浸船。具體的處理,這得跟后臺(tái)交流寝蹈,也可以參考這里李命。
總結(jié)
- 這個(gè)問(wèn)題在正式環(huán)境一般都不會(huì)發(fā)生的,但問(wèn)題的原因確實(shí)是需要了解的
- 解決問(wèn)題的一般步驟如上箫老,確定變量封字,抓住問(wèn)題,進(jìn)行分析耍鬓,尋求解決方案阔籽,最后別忘了做個(gè)記錄,別掉進(jìn)相同的坑兩次牲蜀。
- 交流笆制,很多問(wèn)題并非是app端的問(wèn)題,像本文章的問(wèn)題涣达,所以積極的交流才能讓自己少做彎路在辆,更何況,交流中你就自然而然學(xué)到了不少東西度苔。
- 在向別人尋求幫助之前匆篓,應(yīng)該先自己想想,通過(guò)搜索引擎尋求方法寇窑,因?yàn)槟阌龅降膯?wèn)題鸦概,很多人都遇到過(guò)。