今天有同事用到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