0、背景:在由於不想在小項目中引入SpringSecurity這種重量級安全框架,我自定義了一個LoginFilter來處理認證+授權邏輯。對於認證或授權失敗的情況,最初是在filter中拋出異常,並攜帶401狀態碼,然後利用Spring的ControllerAdvice全局捕獲這些異常並轉換後返回 ...
0、背景:在由於不想在小項目中引入SpringSecurity這種重量級安全框架,我自定義了一個LoginFilter來處理認證+授權邏輯。對於認證或授權失敗的情況,最初是在filter中拋出異常,並攜帶401狀態碼,然後利用Spring的ControllerAdvice全局捕獲這些異常並轉換後返回給前端。
1、實踐中發現Controller層以及下層的異常均能被捕獲,唯獨LoginFilter這層的異常不能捕獲,其原因是ControllerAdvice的作用的縱深在filter之下,所以filter層發生異常時請求根本還沒到到ControllerAdvice。
~~2、解決辦法是直接在filter發生錯誤的地方直接將提示信息裝入Response,首先,設置Response的status為401。然後,通過Response的輸出流,直接輸出json格式的提示信息的位元組。
***~~
3、由於提示信息欄位較多,我使用了枚舉類。但Jackson不能方便的序列化多欄位枚舉類,所以使用了FastJson和它的SerilizeConfig+枚舉泛型,將枚舉進行完整json序列化返回。
至此實現了需求。
4、以上方案中手動封裝json返回值的部分不夠優雅,其實HttpServletResponse已經提供了sendError(int status, String message);方法來返回錯誤信息給客戶端,所以此時就可以直接調用該方法並傳遞相應參數即可。