問(wèn)題描述:
服務(wù)端有兩個(gè)接口,一個(gè)是獲取驗(yàn)證碼接口闽铐,將生成的驗(yàn)證碼存儲(chǔ)到Shiro的session中,另一個(gè)是校驗(yàn)驗(yàn)證碼接口,將前端傳過(guò)來(lái)的驗(yàn)證碼與session中存儲(chǔ)的驗(yàn)證碼校驗(yàn)是否正確桨螺,但經(jīng)過(guò)測(cè)試發(fā)現(xiàn),H5画恰、Android彭谁、Postman都能正常獲取、校驗(yàn)驗(yàn)證碼允扇,只有IOS每次都校驗(yàn)失敗缠局。
查找問(wèn)題:
經(jīng)過(guò)調(diào)試發(fā)現(xiàn),IOS校驗(yàn)失敗是因?yàn)樵谛r?yàn)驗(yàn)證碼接口中考润,每次從session中獲取的驗(yàn)證碼為空狭园。
分析原因:
session中獲取的驗(yàn)證碼為空,有兩種情況糊治,一種是在獲取驗(yàn)證碼接口中沒有存儲(chǔ)成功唱矛,經(jīng)過(guò)排查,這種原因排除井辜;還有一種情況就是找錯(cuò)了session對(duì)象绎谦,驗(yàn)證碼存儲(chǔ)在sessionA對(duì)象,然后從sessionB對(duì)象中找驗(yàn)證碼粥脚,當(dāng)然為空窃肠。然后我們來(lái)分析第二種情況的原因。
首先刷允,來(lái)了解下Shiro的session的原理冤留,Shiro的session其實(shí)是基于Http的session實(shí)現(xiàn)的,而Http的session的實(shí)現(xiàn)原理是:服務(wù)器會(huì)為每個(gè)用戶瀏覽器創(chuàng)建一個(gè)會(huì)話對(duì)象(session對(duì)象)树灶,然后把session對(duì)象的id以cookie的形式返回給客戶端纤怒,當(dāng)用戶保持當(dāng)前瀏覽器的情況下再去訪問(wèn)服務(wù)器時(shí),會(huì)把session的id傳給服務(wù)器天通,服務(wù)器根據(jù)session的id找到對(duì)應(yīng)的session泊窘。
根據(jù)session的實(shí)現(xiàn)原理,我們知道,如果用戶在請(qǐng)求時(shí)不帶session的id州既,服務(wù)器會(huì)重新創(chuàng)建session對(duì)象谜洽。
經(jīng)過(guò)上述分析,很有可能是因?yàn)镮OS端每次請(qǐng)求時(shí)都沒有攜帶cookie導(dǎo)致的吴叶。所以只需要打印下兩個(gè)接口的request的cookie數(shù)據(jù)阐虚,即可定位問(wèn)題。