在***專案中,手機端使用賬戶A登入進入app,檢視模組B的內容XX,顯示正常,檢視模組C的內容XXX也顯示正常,然後進入模組D事件辦理,獲取事件列表,正常,但是選擇辦理的時候,呼叫介面E,一直提
最終解決方案:
經過排查,發現問題是,呼叫獲取事件列表介面,有個欄位為圖片,返回的為空字串,手機端未做判斷,強行載入圖片,導致PHPSESSID發生變化,服務端主動清空cookie,使用者資訊失效,TOKEN驗證失敗,解決辦法,手機端判斷,圖片欄位如果為空,則不載入。
解決問題過程描述:
1).TOKEN失效,首先想到的是session_id發生變化,有跨域請求,於是,在登入介面、模組B對應介面、模組C對應介面、模組D對應介面、事件辦理介面E列印session_id已經相關的session資訊,結果是登入介面、模組B對應介面、模組C對應介面、模組D對應介面session_id值、相關的session資訊均正常,值一致,但是介面E,session_id值、相關的session資訊均為空
2).根據1)的結果,判斷並沒有發生跨域請求,猜測應該是手機端做某個操作時候,觸發服務端session驗證函式,清空了session,於是服務端session驗證介面列印日誌資訊,結果顯示,手機端連續操作過程中,某個時間節點,PHPSESSID發生變化,cookie被清除,但是具體什麼操作,還是無法辨別出來
3).綜合1)、2)的情況,分析可能手機端做了清除cookie的操作,仔細排查並沒有
4).本來沒辦法了,但是和手機端同事溝通過程中,瞭解到他們處理圖片資源時候,有時候不管資源是否存在,都會載入資源,於是想到如果圖片路徑為空,手機端未做判斷,強行載入圖片,相當於直接訪問一次:http://ip:port, http://ip:port 該介面預設重定向到PC後臺首頁,而且該介面有做session驗證,判斷session_id() 與$_COOKIE['PHPSESSID'] 是否相等,如果不相等,則清除所有cookie,並退出,手機端初次登入,會生成PHPSESSID1,進入事件詳情頁面,強行載入空圖片,會生成PHPSESSID2,因為PHPSESSID1 != PHPSESSID2,故cookie被清空,儲存在session中的使用者資訊也被清空,所以呼叫介面E,一直提示TOKEN失效,到此,問題才水落石出!