Sie einen Controller schreiben können, die BasicErrorController
und schreiben Sie eine Methode, die eine @GetMapping
Anmerkung wie dieser hat sich:
@RestController
public class FilterExceptionController extends BasicErrorController {
private static final Logger LOGGER = LoggerFactory.getLogger(FilterExceptionController.class);
public FilterExceptionController(){
super(new DefaultErrorAttributes(),new ErrorProperties());
}
@GetMapping
private <T> ResponseResult<T> serviceExceptionHandler(HttpServletRequest request) {
Map<String,Object> body= getErrorAttributes(request,isIncludeStackTrace(request,MediaType.ALL));
String message = String.valueOf(body.get("message"));
body.forEach((k,v)->LOGGER.info("{} ==> {}",k,v));
return RestResultGenerator.genError(500,"Filter Error Occurred, Message: [ "+message+" ]");
}
@Override
public String getErrorPath() {
return "/error";
}
}
Es ist mein Testfilter:
@WebFilter(filterName = "ipFilter",urlPatterns = "/*")
public class IpFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
if(!Arrays.asList(new String[]{"127.0.0.1"}).contains(servletRequest.getRemoteAddr())){
throw new ServiceException(403,"ip forbid");
}
}
@Override
public void destroy() {
}
}
Thi s ist Ergebnis (aber nur Ausnahme Nachricht nicht Code erhalten): enter image description here
Bitte schreiben Sie den Code, wo Sie diesen Fehler werfen und wo Sie versuchen, es zu fangen. –
Haben Sie versucht, Ihren 'ExceptionHandler' in Ihren Filter anstatt' ControllerAdvice' zu schreiben? Weil die Anfrage möglicherweise Ihr DipatcherServlet nicht erreicht. – ansh