配置了一个拦截器,拦截所有请求,但是当springmvc 拦截一个不存在的URL地址,无法正常拦截,这是为什么?,全局异常处理也无效
3条回答 默认 最新
关注 引自免费微信小程序:皆我百晓生
在Spring MVC中,全局拦截器通常能够处理所有请求,包括不存在的URL地址。但是,如果一个请求无法被任何已注册的Controller处理,那么它将不会到达你配置的拦截器,而是直接由Spring MVC的默认错误处理器处理(返回404状态码)。全局异常处理器也无法捕获这种情况,因为它主要处理的是在Controller执行过程中抛出的异常,而非找不到处理器的情况。
为了解决这个问题,你需要确保Spring MVC对未找到的URL路径进行适当的处理,使其能够经过拦截器链:
- 自定义错误处理器:首先,创建一个
ErrorController
实现类以处理所有未找到的请求。
import org.springframework.boot.web.servlet.error.ErrorController; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class CustomErrorController implements ErrorController { @Override public String getErrorPath() { return "/error"; // 自定义错误页面路径 } @RequestMapping("/error") public String handleError(Model model) { // 在这里可以添加逻辑让请求通过拦截器 // 并在模型中添加错误信息等 model.addAttribute("errorMessage", "The requested resource is not available."); // 你可以在此处调用拦截器链或者触发其他业务逻辑 // 然后转发到相应的视图 return "error"; // 这是错误页面名称,对应templates/error.html 或者 resources/static/error.html } }
- 确保拦截器能处理错误路径:确保你的拦截器配置能覆盖到"/error"这样的错误处理路径,这样当找不到资源时,请求会先进入拦截器,然后再到自定义的错误处理器。
import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private MyInterceptor myInterceptor; // 你的拦截器类 @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(myInterceptor) .addPathPatterns("/**") // 匹配所有路径,包括错误路径 .excludePathPatterns("/resources/**", "/static/**"); // 排除静态资源等 } }
- 全局异常处理:虽然全局异常处理器不直接处理未找到的URL,但你可以在异常处理器中捕获
NoHandlerFoundException
来达到类似效果。
import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.servlet.NoHandlerFoundException; @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(NoHandlerFoundException.class) public ResponseEntity<String> handleNoHandlerFoundException(NoHandlerFoundException ex) { // 在这里可以调用拦截器逻辑或进行其他处理 return new ResponseEntity<>("The requested URL was not found.", HttpStatus.NOT_FOUND); } }
请注意,尽管全局异常处理器不能自动处理未找到的URL,但通过上述方式,你可以间接地让这类请求进入自定义错误处理流程,从而也能“路过”你的拦截器。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报- 自定义错误处理器:首先,创建一个
悬赏问题
- ¥15 12864只亮屏 不显示汉字
- ¥20 三极管1000倍放大电路
- ¥15 vscode报错如何解决
- ¥15 前端vue CryptoJS Aes CBC加密后端java解密
- ¥15 python随机森林对两个excel表格读取,shap报错
- ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
- ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。
- ¥30 求给定范围的全体素数p的(p-2)/p的连乘积值
- ¥15 VFP如何使用阿里TTS实现文字转语音?
- ¥100 需要跳转番茄畅听app的adb命令