染指余忆 2024-02-02 14:46 采纳率: 96.3%
浏览 2
已结题

springmvc 如何拦截一个不存在的URL地址

配置了一个拦截器,拦截所有请求,但是当springmvc 拦截一个不存在的URL地址,无法正常拦截,这是为什么?,全局异常处理也无效

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-02-02 14:47
    关注

    引自免费微信小程序:皆我百晓生

    在Spring MVC中,全局拦截器通常能够处理所有请求,包括不存在的URL地址。但是,如果一个请求无法被任何已注册的Controller处理,那么它将不会到达你配置的拦截器,而是直接由Spring MVC的默认错误处理器处理(返回404状态码)。全局异常处理器也无法捕获这种情况,因为它主要处理的是在Controller执行过程中抛出的异常,而非找不到处理器的情况。

    为了解决这个问题,你需要确保Spring MVC对未找到的URL路径进行适当的处理,使其能够经过拦截器链:

    1. 自定义错误处理器:首先,创建一个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
        }
    }
    
    1. 确保拦截器能处理错误路径:确保你的拦截器配置能覆盖到"/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/**"); // 排除静态资源等
        }
    }
    
    1. 全局异常处理:虽然全局异常处理器不直接处理未找到的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,但通过上述方式,你可以间接地让这类请求进入自定义错误处理流程,从而也能“路过”你的拦截器。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 9月18日
  • 已采纳回答 9月10日
  • 创建了问题 2月2日

悬赏问题

  • ¥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命令