springboot全局异常处理中的404的/error重复拦截问题
在springboot1.x与springboot2.x中,都可以直接使用@ControllerAdvice即可,对于异常在springboot1.5.10中,当存在请求没有controller匹配请求后404,同时会直接重定向/error,这个时候我们可以直接判断request中的uri是否包含/error,如果有抛出异常,再有@ControllerAdvice处理即可。对于springboot
前提:
GlobalExceptionHandler.java类中的@ControllerAdvice注解只处理经过Controller的不经过Controller的不进行处理
SpringBoot 默认提供了一个全局的 handler 来处理所有的 HTTP 错误, 并把它映射为 /error。当发生一个 HTTP 错误, 例如 404 错误时, SpringBoot 内部的机制会将页面重定向到 /error 中。
在springboot1.x
与springboot2.x
中,都可以直接使用@ControllerAdvice
即可
对于404的请求:
在springboot1.5.10
中,当存在请求没有controller匹配请求后404,同时会直接重定向/error,这个时候我们可以直接判断request中的uri是否包含/error,如果有抛出异常,再有@ControllerAdvice
处理即可。
对于springboot2.0问题来了,当404时,不仅会请求/error,原始请求也会来一次!!!
。这时候如果有拦截器,则会拦截两次,比如请求/api/test
,会拦截一次,404后,重定向到/api/error
,会再拦截一次
这时候不能直接简单的拦截/error来,这时候需要关闭工程中的资源文件建立映射
spring.resources.add-mappings=false
也可以
#出现错误时, 直接抛出异常
spring.mvc.throw-exception-if-no-handler-found=true
#关闭工程中的资源文件建立映射
spring.resources.add-mappings=false
这时候,就会抛出异常,再在@ControllerAdvice
中捕获NoHandlerFoundException
异常即可

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)