一次http請求刪除cookie時遇到攔截器攔截到兩次的問題

     在一次http請求的業務邏輯中,如果程序代碼有刪除cookie的地方,那麼必須等到response返回給瀏覽器或客戶端後纔會真正的刪除,代碼中cookie.setMaxAge(0)只是添加指令,只有客戶端收到指令以後纔會刪除。

     在此我分享一個案例,當時代碼遇到的一種奇怪的現象,不過現在知道原因了,我的項目是一個web項目,裏面有一個攔截器,主要是preHandle這個方法裏面,我的邏輯是當訪問A路徑請求時,攔截器攔截到了,此時從遠程校驗用戶身份有效性,如果無效則刪除本地cookie(刪除前會對cookie中的value進行decode解碼)票據隨後跳往B請求路徑(用的是request.dispatcher.forward),此時正好走到這個邏輯,刪除cookie邏輯已執行(往response中添加刪除指令,還沒返回前端),因爲B請求路徑並不在攔截器的豁免規則裏,所以又被攔截到了,上面的邏輯再次執行;

     本應該是死循環,但就是我們的一個rd在刪除cookie的邏輯中加了一句代碼cookie.setValue(null),導致第二次攔截器刪除cookie時雖然前端還沒收到刪除指令,但是那句代碼已經設爲null,最後發生了空指針異常。

     此處歸根結底是跳轉應該用response.sendRedirect,而不應該用request.dispatcher.forward,這就要回到轉發與重定向的區別了,重定向會返回客戶端再跳往另一個地址,那麼瀏覽器就會收到response正真刪除cookie,我們的邏輯就正常了

cookie.setPath("/");
cookie.setValue(null);
cookie.setMaxAge(0);
response.addCookie(cookie);

 

 

response.sendRedirect(forwardUrl);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章