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,表示处理所有类型的异常。你可以根据需要指定特定的异常类型进行处理。

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

相关推荐
fouryears_234177 小时前
Spring,Spring Boot 和 Spring MVC 的关系以及区别
java·spring boot·spring·mvc
设计师小聂!14 小时前
尚庭公寓----------分页查询
java·开发语言·spring·maven·mybatis
livemetee16 小时前
springboot 整合spring-kafka客户端:SASL_SSL+PLAINTEXT方式
spring boot·spring·kafka
要开心吖ZSH17 小时前
Spring Cloud LoadBalancer 详解
后端·spring·spring cloud
CodeWolf20 小时前
Filter过滤器和Interceptor拦截器的使用和区别
spring
丶小鱼丶21 小时前
Spring之【BeanDefinition】
java·spring
武子康21 小时前
Java-75 深入浅出 RPC Dubbo Java SPI机制详解:从JDK到Dubbo的插件式扩展
java·分布式·后端·spring·微服务·rpc·dubbo
NE_STOP1 天前
SpringBoot--自动配置的替换和关闭
java·spring
Honesty8610241 天前
深入排查:@Scope(“prototype“)与@RequestScope字段篡改问题全链路分析
java·spring boot·spring·原型模式
Honesty8610241 天前
Spring 作用域冲突深度解析:@Scope(“prototype“)与@RequestScope的冲突与解决方案
java·spring·原型模式