記一次RestControllerAdvice無法攔截Filter內(nèi)拋出異常

今天有同事用到Shiro使用JWT的時候在Filter里做身份驗證,然后在里面catch捕獲并拋出了自定義異常。我們這邊是用的RestControllerAdvice做統(tǒng)一異常處理,然后這個異常并沒有被RestControllerAdvice所攔截到

原因

請求進(jìn)來 會按照 filter -> interceptor -> controllerAdvice -> aspect -> controller的順序調(diào)用

當(dāng)controller返回異常 也會按照controller -> aspect -> controllerAdvice -> interceptor -> filter來依次拋出

這種Filter發(fā)生的404、405、500錯誤都會到Spring默認(rèn)的異常處理。如果你在配置文件配置了server.error.path的話,就會使用你配置的異常處理地址,如果沒有就會使用你配置的error.path路徑地址,如果還是沒有,默認(rèn)使用/error來作為發(fā)生異常的處理地址。如果想要替換默認(rèn)的非Controller異常處理直接實現(xiàn)Spring提供的ErrorController接口就行了

解決方案

新建一個ErrorControllerImpl 實現(xiàn)ErrorController 把ErrorPath 指向error 再寫一個方法把Error拋出 然后Controller全局統(tǒng)一異常處理RestControllerAdvice就能捕獲到異常了


import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;

/**
 * @author Joe
 * createTime 2020/07/27 14:39
 * mail joe-code@foxmail.com
 */
@Controller
public class ErrorControllerImpl implements ErrorController {

    @Override
    public String getErrorPath() {
        return "/error";
    }

    @RequestMapping("/error")
    
    public void handleError(HttpServletRequest request) throws Throwable {
        if (request.getAttribute("javax.servlet.error.exception") != null) {
            throw (Throwable) request.getAttribute("javax.servlet.error.exception");
        }
    }
}

參考stackoverflow鏈接 https://stackoverflow.com/questions/34595605/how-to-manage-exceptions-thrown-in-filters-in-spring

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容