先說辦法,如果看官覺得合適再往下看原理吧
步驟:(
"/filter"
)@restcontroller
public
class
filtercontroller
}
request.
setattribute
("code"
,"***");
request.
getrequestdispatcher
("/filter/login_auth_fail").
forward
(request, response)
;
@controlleradvice
public
class
exphanlder
}
那為什麼沒有成功呢?關鍵在於@controlleradvice只是對controller做了加強,而filter在controller之前進行,故而異常就這樣逃出了咱們的「掌心」。
本文中介紹的辦法,恰是利用了這樣的執行順序,讓異常乖乖地丟擲去:既然filter中不能丟擲,那我先把錯誤資訊記錄下來,把請求**到乙個特定的介面(可認為是乙個「陷阱」),然後在這個介面中利用記錄的錯誤資訊復原乙個異常丟擲即可。
到這,解決辦法的原理已經介紹完了了,後面內容按需**,將和大家一起回顧filter與controller的業務流程。
借用spring 梳理 - filter、interceptor、aop實現與區別 -第二篇中的順序圖:
可以看到,spring在將請求交給controller的介面處理前、後分別呼叫filter鏈中filter的方法對處理進行增強。當prehandle中將異常丟擲時,並沒有到controller,故而@controlleradvice未能攔截該異常。
筆者是在整合shiro時,需要保留原有專案功能:在身份驗證失敗或越權時返回json格式錯誤資訊而遇到了這個問題,因為shiro是基於filter做的攔截,故而需要將filter中的錯誤資訊丟擲。
專案原先的登陸驗證是放在aop做的,而aop也在filter之後進行,關於filter、interceptor、aop及其異常丟擲順序,可以看下這篇文章:spring:過濾器filter、***interceptor、和aop的區別與聯絡
建構函式中拋異常
1 建構函式中是否可以拋異常?可以。2 有什麼限制嗎?有限制。構造拋異常之前必須把已經申請的資源釋放掉。這樣,就算你的物件是new出來的,也不會造成記憶體洩漏。因為析構函式不會被呼叫,所以丟擲異常後,你沒機會釋放資源。建議,在建構函式中不要做過多的事情,只是能對成員變數的做初始化工作就好了。真的需要...
建構函式中拋異常
1 建構函式中是否可以拋異常?可以。2 有什麼限制嗎?有限制。構造拋異常之前必須把已經申請的資源釋放掉。這樣,就算你的物件是new出來的,也不會造成記憶體洩漏。因為析構函式不會被呼叫,所以丟擲異常後,你沒機會釋放資源。建議,在建構函式中不要做過多的事情,只是能對成員變數的做初始化工作就好了。真的需要...
在MySQL中重複的插入資料不拋異常(效能待驗證)
最常見的方式就是為字段設定主鍵或唯一索引,當插入重複資料時,丟擲錯誤,程式終止,但這會給後續處理帶來麻煩,因此需要對插入語句做特殊處理,盡量避開或忽略異常,下面我簡單介紹一下,感興趣的朋友可以嘗試一下 這裡為了方便演示,我新建了乙個user測試表,主要有id,username,address這4個字...