SpringMVC进阶(自定义拦截器以及异常处理)

在 Spring MVC 中,自定义拦截器和异常处理是常见的高级用法,可以帮助你在应用程序中实现更灵活的请求处理和异常管理。下面我将为你介绍如何自定义拦截器和异常处理,并提供详细的代码示例。

自定义拦截器

拦截器可以在请求处理之前或之后执行特定的逻辑,比如记录日志、权限验证等。要自定义一个拦截器,你需要实现 HandlerInterceptor 接口,并覆盖其中的方法。通常,一个拦截器包含以下方法:

  • preHandle(HttpServletRequest request, HttpServletResponse response, Object handler): 在请求处理之前被调用,返回 true 则继续执行后续处理,返回 false 则中断请求。
  • postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView): 在请求处理之后、视图渲染之前被调用。
  • afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex): 在视图渲染之后被调用,通常用于资源清理。

下面是一个示例:

java 复制代码
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class CustomInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 在请求处理之前执行,可以进行权限验证等操作
        System.out.println("Pre-handle method is called");
        return true; // 返回 true 继续执行后续处理,返回 false 中断请求
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // 在请求处理之后、视图渲染之前执行
        System.out.println("Post-handle method is called");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
            Exception ex) throws Exception {
        // 在视图渲染之后执行,通常用于资源清理
        System.out.println("After completion method is called");
    }
}

注册拦截器

要在 Spring MVC 中注册自定义的拦截器,你需要在配置类(通常是 WebMvcConfigurer 的实现类)中重写 addInterceptors 方法,并将自定义拦截器添加到拦截器链中。

java 复制代码
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 {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new CustomInterceptor())
                .addPathPatterns("/**"); // 可以指定拦截的路径
    }
}

异常处理

在 Spring MVC 中,可以通过 @ControllerAdvice@ExceptionHandler 来实现全局异常处理。@ControllerAdvice 注解的类可以处理所有控制器抛出的异常。

下面是一个简单的异常处理示例:

java 复制代码
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleException(Exception ex) {
        // 自定义异常处理逻辑,返回适当的 HTTP 状态码和错误消息
        return new ResponseEntity<>("An error occurred: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

在上面的示例中,@ExceptionHandler 注解用于指定处理的异常类型,这里是 Exception.class,表示处理所有类型的异常。你可以根据需要指定特定的异常类型进行处理。

以上是关于自定义拦截器和异常处理的基本介绍和示例代码。你可以根据具体的需求和业务场景来进一步扩展和定制这些功能。

相关推荐
撒呼呼2 小时前
# 起步专用 - 哔哩哔哩全模块超还原设计!(内含接口文档、数据库设计)
数据库·spring boot·spring·mvc·springboot
天使day3 小时前
SpringMVC
java·spring·java-ee
壹佰大多5 小时前
【spring-cloud-gateway总结】
java·spring·gateway
CodeChampion5 小时前
60.基于SSM的个人网站的设计与实现(项目 + 论文)
java·vue.js·mysql·spring·elementui·node.js·mybatis
秋意钟5 小时前
Spring框架处理时间类型格式
java·后端·spring
科马9 小时前
【Redis】缓存
数据库·redis·spring·缓存
cloud___fly9 小时前
Spring AOP入门
java·后端·spring
zxguan11 小时前
Springboot 学习 之 logback-spring.xml 日志压缩 .tmp 临时文件问题
spring boot·学习·spring
繁川11 小时前
深入理解Spring AOP
java·后端·spring
AI人H哥会Java19 小时前
【Spring】Spring的模块架构与生态圈—Spring MVC与Spring WebFlux
java·开发语言·后端·spring·架构