【轉載】被踢出去的用戶

0

在尚未掌握所有證據以前就下結論會犯嚴重的錯誤,會使判斷帶有偏見。——《血字的研究》前端

「齊識,路老闆又來郵件了。」白娜一臉無耐地說。程序員

「必定沒好事吧?」齊識回頭看了一眼,手依舊在快速敲着代碼,並無停。瀏覽器

「你剛從泰國回來?」齊識說到。緩存

「你怎麼知道?」白娜瞪着眼睛一頭霧水。她清明假期去泰國玩這件事,並無告訴任何同事。安全

「你臉明顯比節前黑了,說明去了熱帶地區玩。你戴的耳環之前沒看到過,說明是假期新買的。耳環上刻着大象……」,齊識停下敲代碼的手,回過頭,「說明你去了視大象爲國寶的泰國。」服務器

「你……牛……,不愧是程序員名偵探……」。微信

「說吧,又出什麼事了?」齊識回到顯示器前繼續敲代碼。cookie

「仍是用戶被踢出去的那個問題。」工具

「上次不是已經查清楚了嗎?是低版本IE的鍋。」測試

「但是,此次是IE 11……」

「哎——」齊識長嘆一聲,「好吧,把郵件轉給我。」

「已經轉給你了。拜託了,我去開會了哈。」

齊識很不情願地將界面從IDE切換到網頁,打開了郵件。這是一封幾經轉發的郵件,一開始是路老闆的用戶向路老闆抱怨系統用着用着就自動登出了大家這什麼爛系統,路老闆回覆說多是低版本IE的鍋爸爸請考慮升級IE或換其餘瀏覽器。客戶說老子TM用的就是最新版IE你是否是在玩老子,因而路老闆轉發給項目經理白娜說今天必須解決不然炒了大家整個團隊。最後白娜轉發給齊識,只有三個字母:FYI……

很麻煩。這個問題之前也出現過幾回,一直沒有找到具體緣由。上一次時發現用戶用的是IE 8,而當時系統支持的IE最低版本是9。當全部人都焦頭爛額一籌莫展的時候,這位超級英雄背鍋俠IE站了出來。果不其然當用戶換了其餘瀏覽器後,就再也沒有出現過相似問題了。

但此次,背鍋俠說這鍋老子不背了。

齊識看了看錶,上午11點。不知道要爲這個問題加班到幾點。

他先打開了日誌分析工具,按照用戶名查詢與該用戶有關的日誌。永遠不要相信一個不懂電腦的用戶所描述的事實,全部的信息都要再次確認。但此次事實彷佛很無情無義無理取鬧,這個用戶用的確實是IE 11。

經過日誌,能夠看到這個用戶全部的訪問記錄:他先是登陸系統,打開幾個頁面,而後到了文件管理子系統,找到某個文件夾,上傳了一個文件,而後就登出了。若是用戶描述屬實的話,此次登出請求不是他主動觸發的,是系統自動把他踢出去了。

「用着好好的,怎麼就被踢出去了呢?」齊識自言自語道。

「怎麼了大偵探,愁眉苦臉的。」老夏端着泡了枸杞的保溫杯路過。如今是11點半,這杯應該是第三泡。老夏之前也是項目上的大牛,後來不知怎的,去了培訓部專門作員工培訓了。不過他時不時仍是會到研發部這邊溜達溜達,從背後窺探一下別人的屏幕,指出代碼上的一些問題,而後哈哈一笑揚長而去深藏功與名。

「用戶又被自動踢出去了。」齊識說。

「又是那個問題?不是IE的鍋嗎?」

「看來咱們有可能冤枉IE了,此次用戶用的是新版本IE,按理說咱們的前端是確定支持的,也在測試環境驗證過無數遍了。」

「這就怪了。這幾回出問題的用戶,是否是都用的IE?」

「是的。」

「那就仍是IE的鍋。」老夏吸溜了一口枸杞茶,走了。

他看似不經意的一句話,反倒提醒了齊識。他立馬繼續查詢日誌,找出幾個用不一樣瀏覽器的用戶,他們的各類操做錯落有致,最後的登出請求也並沒有破綻。只有一些IE用戶,他們的登出請求是在上傳完文件以後發生的。難道是上傳文件的後臺接口出了問題?但不一樣瀏覽器產生了不一樣的行爲,這現象又 不像是後臺的事兒啊。齊識一看錶,已經12點半了。得了,先去吃飯吧。

1

……權衡點滴證據,作出不一樣的假設,把它們進行對比,最後再肯定哪幾點是重要的、哪些是不真實的…… ——《巴斯克維爾的獵犬》

草草吃完,買了杯咖啡,齊識又坐到了電腦前。像這種線上問題,尤爲是本地沒法復現的線上問題,是他最喜歡的。定位這些問題的過程,就像是偵探在探案,從最初的案件出發,將看似毫無關聯的線索逐一梳理過濾,那最終惟一的真相也會慢慢浮出水面。每到這時,齊識就會感受像是個超級英雄同樣拯救了世界。這樣的問題解決得多了,同事們給他起了個外號,叫「程序員偵探」。他倒也不介意別人這麼叫他,反倒有點自豪。

但此次用戶被踢出的問題,齊識前先後後處理過三次,都沒法定位。按照目前系統的實現,用戶自動登出多是由於網站的登陸cookie過時且SSO上的登陸cookie也過時,這時當某個請求到達後臺時,會清空全部與認證有關的cookie並重定向到SSO的登陸頁面。登陸cookie的有效期是20分鐘,但用戶抱怨的是剛登陸不久就被自動踢出,從日誌上看也的確如此。因此「登陸cookie過時」的不在場證實至關完美。

另外的可能就是緩存掛了。每一個請求到達後臺時,都會到服務器緩存中取出在用戶登陸時存儲的一個token,將之與請求所攜帶的cookie中的token比較,若是不相符就自動登出。之因此這樣作是考慮用戶的安全,將僞造或竊取cookie登陸的黑客拒之門外。若是存儲或讀取緩存失敗,天然也會自動登出。齊識之前在讀寫緩存的地方加了很詳細的日誌,並沒看到任何錯誤發生。「緩存」做案的可能性也不大。

最後一個嫌犯是心跳請求。網站前端每隔2分鐘會自動向後臺發一個心跳請求,若是服務器發現本次心跳與上一次心跳間隔時間超過3分鐘,就認爲用戶已處於不活躍狀態,自動將其登出。這麼作也是爲了用戶安全,好比將全部網站頁面關閉,3分鐘後再次打開,將會自動跳轉到登陸頁面。若是心跳請求沒有發送成功,下次請求到來時極可能已經超過了3分鐘,就會把用戶踢出去。心跳請求能夠在Web服務器的日誌中查到,每次請求都是成功的。因此,「心跳」的嫌疑彷佛也撇清了。

就在上一次處理這個問題時,齊識偶然發現請求日誌裏顯示的UserAgent是網站不支持的IE 8。使用系統不支持的瀏覽器,任何詭異的事情均可能發生。當用戶升級了IE或使用了其餘瀏覽器後,問題再也不發生了。可是這一次,爲何新版的IE也不行了呢?

如今,齊識的目光集中在了上傳文件的後臺API上。這是此次發現的新嫌疑人,不,還有IE,多是團伙做案。如今掌握的最新線索是,用戶使用IE,無論什麼版本,在上傳完文件後,被自動登出。對於IE這種慣犯,不容易找出它的破綻,因此齊識決定先從API下手。

2

在沒有事實做爲參考之前妄下結論是個很大的錯誤。主觀臆斷的人老是爲了套用理論而扭曲事實,而不是用理論來解釋事實。——《波希米亞醜聞》

兩個小時過去了,仍是沒有任何進展。上傳文件的API若無其事地待在那裏,一臉蔑視地看着齊識。

「有新的線索嗎?」老夏又端着保溫壺過來了。如今是下午3點,壺裏應該泡上了新茶。老夏喜歡在午餐後泡一壺釅茶。

「今天的普洱味道如何?」齊識問。

「不是普洱,是正山小種。」

「咦?紅茶應該是週四泡的啊,今天週三應該是普洱纔對。」

「這個嘛,忽然就想喝紅茶了,呵呵。」老夏說完吐了吐茶沫。「你有不錯的洞察力,老是能發現別人不太在乎的事情。但有時候,根據那些事實並不能推理出你的結論。有些事情之間的關聯可能很偶然,並不具有規律性。」老夏微笑地看着齊識,「如今狀況如何?」

「我如今在看上傳文件的API。我發現每次用戶調用完這個API以後就會被踢出去。」

「哦?有意思,這個API作了什麼見不得人的事了嗎?」

「並無。我已經檢查了它和它所調用的全部方法,甚至還看了它自己的filter和全局filter,並無任何地方會清空cookie或者token緩存。只有清空這些纔會自動登出。」

「對了,你是怎麼發現調用完這個API後會被踢出的?」老夏接着問。

齊識調出了某個用戶全部請求日誌,定位到上傳文件的請求。「你看,這個POST請求是上傳文件,後面這些就是登出請求了,而前面的都是一些文件夾跳轉的請求。這是其中一個用戶的請求,這裏還有其餘用戶。」說着,齊識又開了幾個窗口,平鋪在了顯示器上。

「有意思。」老夏眯縫着眼睛緊盯着屏幕。「雖然他們都是上傳完文件就被踢出了,但能肯定就是上傳文件的API致使的嗎?是每次上傳完文件都會登出嗎?」

「還真不是!」

「並且別忘了IE,只有IE纔會踢出用戶不是麼?那就更能洗清後臺API的嫌疑了。」

「對啊老夏,我怎麼沒有想到?」齊識茅塞頓開。

「就像我連續兩週都是週三喝普洱週四喝紅茶,你認爲那是某種必然。但這是你的主觀臆斷。主觀判斷必定要有事實做爲依據,不然就都是臆斷。」老夏說着,拿起茶壺晃晃悠悠地走了。

「等等,老夏,別走啊,我須要你!」

「我還有事。」老夏回過頭衝齊識眨了眨眼睛說,「等你再須要個人時候我天然會出現的。」

3

他的表情再也不那樣淡漠,我看到他炯炯有神的雙眼迸射出智慧和興奮的光芒。——《格蘭奇莊園》

齊識的目光又聚焦在了日誌身上。若是用戶真的在上傳文件以後被踢出,必定能從日誌中找到什麼蛛絲馬跡。齊識又換了一個留下的操做日誌較多的用戶,將日誌按時間排好序。這個是登陸成功的請求,這個是進入文件管理子系統的請求,這個是進入某個文件夾的請求,這個是心跳請求,而後上傳文件,成功了,而後跳轉到其餘文件夾,繼續上傳文件,又發了個心跳,看看離上次心跳的間隔,嗯,2分鐘,沒有任何問題。齊識點擊進入了下一頁日誌。

又進入了另外一個文件夾,仍是上傳文件,成功了,而後……就登出了。這裏面必定有什麼貓膩。

齊識揉了揉眼睛,將全部注意力都集中到這幾行日誌身上,彷彿要看穿這屏幕,看到屏幕那頭的另外一個鏡像的宇宙。

用戶在15:32:26進入了第一個文件夾,15:32:45發送了第一個心跳請求,而後上傳了第一個文件,15:33:20跳轉到第二個文件夾,15:34:30上傳第二個文件,15:34:45發送了第二個心跳請求,15:35:07進入第三個文件夾,15:37:48上傳第三個文件,15:37:49,用戶被踢出。

齊識目不轉睛地盯着每一個請求的發送時間,忽然,他炯炯有神的雙眼迸射出智慧和興奮的光芒。用戶在15:37:48上傳第三個文件以前,丟失了一個心跳請求,這個心跳本應該在15:36:45發出來。

心跳怎麼斷了?若是是心跳斷了,是必然會被踢出的,這樣是解釋得通的。但心跳怎麼能斷呢?齊識打開發心跳請求的JavaScript文件,就是一個簡單的setInterval,沒有什麼特別的。是什麼,讓這個2分鐘的輪詢中止了呢?

老夏呢?老夏呢?這老傢伙跑哪去了?他說過會在我須要的時候出現的,如今我須要你,可你人呢?我發現了重要的線索,已經鎖定了嫌犯,如今就差證據了,就差證據了。

4

排除全部不可能,剩下的那個無論多難以想象,都是事實真相。——《四簽名》

「老夏?他說今天要去幼兒園接孩子,提早下班了。」培訓部的同事說。

齊識的一臉興奮變成了一臉沮喪,他本想告訴老夏這個重要的發現,而後跟他一塊兒找到問題的根本緣由的。但老夏他竟然提早下班走人了。

「你要有事,就給他打電話吧。」培訓部的同事看齊識如此低落,就提醒道。

對呀,我怎麼忘了這個世界上還有電話這麼神奇的存在。齊識撥通了老夏的電話,沒有人接。

「老夏,我有了重要的發現……」齊識把剛纔的線索編輯成一條微信,發給了老夏。而後回到座位上接着分析。

用戶前兩次上傳文件都沒有問題,但是第三次就被踢出了。從時間軸來看,前兩次進入文件夾後,都是很快便發出了上傳文件的請求,惟獨第三次,進入文件夾以後,停留了2分多鐘才發出了請求。用戶在幹什麼?進入文件夾後去喝茶聊天了?那樣的話心跳沒有理由斷掉啊。

齊識啓動IE,打開開發者工具,登陸本地的系統,進入文件管理子系統,打開一個文件夾。接下來該幹什麼?齊識發呆了幾分鐘,一個心跳請求發送出去了。他回過神來,點擊上傳文件的按鈕,彈出了選擇文件的窗口。上傳哪一個文件呢?該死,電腦裏沒有PDF文件。這個文件管理系統只能上傳PDF文件,而且作了文件頭校驗,直接改後綴名是不起做用的。因而齊識只好搜了一個TXT轉PDF的在線轉換工具,丟上去一個空的文本文件,獲得了一個PDF。而後切回剛剛打開的系統,選擇文件的窗口還開着。他找到轉換好的PDF,點擊按鈕。而後,而後瀏覽器就自動跳轉到了登陸界面……

什麼?復現了?這怎麼可能?這麼輕易就復現了?發生了什麼?

齊識又進入系統,上傳剛纔轉換好的PDF,一切正常。

鬧鬼了?齊識把剛剛全部操做的日誌拿出來看,第一次上傳文件——也就是失敗的那次——的時間,比進入文件夾晚了2分多鐘,比上次心跳請求晚了3分多鐘。按照系統的實現,超過3分鐘沒有心跳請求,後臺會認爲用戶已經不活躍,將其自動登出。也就是徹底復現了生產系統中用戶的問題。而在此期間,齊識是去轉換文件了。

齊識盯着日誌,良久以後,哈哈哈哈地笑出了聲。

5

經過搜索,齊識很快驗證了本身的想法。在IE下,像JavaScript引起的alert窗口或file組件打開的窗口,都屬於模態窗口,它們會阻塞全部主線程中正在執行的JavaScript代碼。至於Chrome、Firefox這樣的瀏覽器,打開的並非模態窗口,這也就是爲何只有IE頻繁報出相似的問題,其餘瀏覽器則一直表現良好。當這種模態窗口一直處於打開狀態時,心跳請求就被迫中斷了,繼而在上傳成功後,被自動登出。

證據確鑿,「兇手」就是你了!

必定要把這個消息告訴老夏。齊識拿起手機,看到老夏半個小時前的一條回覆:是否是上傳文件的窗口打開的時間太長了?

齊識不只震驚,更是欽佩得五體投地。他把剛纔的通過,一五一十地發給了老夏。過了一下子老夏回覆道:「哈哈哈,果真,是哪一個笨蛋用戶打開了窗口3分鐘都找不到文件?等等,不對,不是3分鐘,是1分鐘!」

「沒錯,因此問題出現得仍是很頻繁的。」齊識又和老夏聊了幾句,忽然想起來什麼,就問:「老夏,你明明不姓夏,但是爲何你們都叫你老夏呢?」

「呵呵,此次解決問題,或者叫探案的過程你感受怎麼樣?」老夏彷佛有點顧左右而言他,」我看前兩天你桌上放着一本福爾摩斯探案集,想必也是個Sherlockian,那你必定據說過那句話吧?」

世界上沒有真正完美的犯罪,其實真相一直就在咱們眼前,只不過尚未被發現。所謂推理,不過就是把重要的細節放大。

當齊識和老夏同時打出這句話時,兩我的都笑了。

6

「那個,我之前作開發的時候,你們都叫我夏洛克」。

原文連接 https://insights.thoughtworks.cn/user-kicked-out/

相關文章
相關標籤/搜索