spring mvc中如何对所有Controller进行拦截呢?

欢喜 SpringMVC 发布时间:2025-06-23 14:16:51 阅读数:616 1
下文笔者讲述springmvc中对所有Controller进行拦截的方法及示例分享,如下所示

所有Controller拦截的实现思路

方式1:
   使用`HandlerInterceptor`实现拦截器

方式2:
   使用`@ControllerAdvice` 
       或
	`@RestControllerAdvice` 

方式3:
   使用Filter(Servlet 过滤器)

方式4:
   使用AOP(面向切面编程)    

1.使用`HandlerInterceptor`实现拦截器

步骤如下:
 (1)创建一个拦截器类

@Component
public class GlobalInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在 Controller 方法执行前调用
        System.out.println("Before Controller: " + request.getRequestURI());
        return true; // 返回 false 表示中断请求
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // Controller 方法执行后,视图渲染前调用
        System.out.println("After Controller, before view rendered.");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 整个请求完成后调用(包括异常情况)
        System.out.println("Request completed.");
    }
}

 (2)注册拦截器

如果是Spring Boot项目
  创建配置类注册拦截器:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private GlobalInterceptor globalInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(globalInterceptor)
                .addPathPatterns("/**")      // 拦截所有请求
                .excludePathPatterns("/static/**", "/error"); // 排除某些路径
    }
}

2.使用`@ControllerAdvice`

`@RestControllerAdvice`

适用于全局异常处理、数据绑定等场景,但不能拦截请求流程本身
 
@RestControllerAdvice
public class GlobalControllerAdvice {

    @ModelAttribute
    public void logRequest(HttpServletRequest request) {
        System.out.println("Request URL: " + request.getRequestURL());
    }
}

3.使用Filter(Servlet过滤器)

Filter
  更底层的拦截机制
  作用于更早阶段(甚至可以拦截静态资源)

例:
 
@Component
public class GlobalFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        System.out.println("Filter: Request URI = " + req.getRequestURI());

        chain.doFilter(request, response); // 继续后续流程
    }
}

4.使用AOP(面向切面编程)

如果你需要基于方法级别的拦截(如所有 `@RequestMapping` 注解的方法),可以使用 Spring AOP。
 
@Aspect
@Component
public class ControllerAspect {

    @Pointcut("execution(* com.example.controller..*.*(..))")
    public void controllerMethods() {}

    @Before("controllerMethods()")
    public void before(JoinPoint joinPoint) {
        System.out.println("AOP Before Method: " + joinPoint.getSignature().getName());
    }

    @AfterReturning(pointcut = "controllerMethods()", returning = "result")
    public void afterReturning(JoinPoint joinPoint, Object result) {
        System.out.println("AOP After Returning: " + result);
    }
}

各种拦截方法对比

方式 是否能拦截 Controller 能否获取 Request/Response 是否支持路径匹配 是否推荐用于全局拦截
`HandlerInterceptor` ✅ 强烈推荐
`@ControllerAdvice` ❌(仅能处理 ModelAttribute、异常等) ❌ | 否
`Filter` ✅(但无法获取 Controller 信息)
`AOP` ❌(难以获取完整上下文) ✅(通过包路径) 可选
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/SpringMVC/202506/8496.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者