問題來源於一個臨時訂單重複提交管控場景,經過在Session中寫入本次提交的臨時訂單ID防止同個表單的重複提交。但在用戶使用某些瀏覽器(如QQ瀏覽器、微信內置瀏覽器)時,仍有偶發性的重複提交現象。
相關核心代碼以下:
瀏覽器
該問題主要緣由是由於當有A、B兩個同樣的請求時,若是在A還沒響應完畢的時候SpringMvc又接收了B請求,B請求在獲取Session中的值時,會獲取到A請求改寫以前的數據。
其根本緣由在於SpringSession在寫入或刪除Session屬性時,會根據配置中的FlushMode決定在何時序列化到Redis,而默認的FlushMode爲ON_SAVE,API原文是這樣的:
也就是說,在默認狀況下只有在Response被提交時Session內容纔會序列化到Redis。因此致使了併發場景下的Session數據髒讀問題微信
目前咱們採起將RedisFlushMode改成IMMEDIATE,修改方法爲在@EnableRedisHttpSession註解中指定flushMode:
如此修改後,在每次調用removeAttribure後,都能正確的觀察到Redis中相應的屬性被置爲空,問題也就基本獲得瞭解決。併發