spring系列 SpringMVC-拦截器

本文介绍了SpringMVC中的拦截器(Interceptor),对比了它与Servlet过滤器(Filter)的区别,并通过一个入门案例展示了拦截器的使用,包括预处理(preHandle)、后处理(postHandle)和完成处理(afterCompletion)的方法,以及如何配置拦截器路径和处理多个拦截器的执行顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

拦截器(Interceptor)是在SpringMVC中动态拦截控制器方法的执行。

拦截器执行流程:

拦截器与过滤器区别

归属不同:Filter属于Servlet技术,Interceptor属于SpringMVC技术

拦截内容不同:Filter对所有访问进行增强,Interceptor仅针对SpringMVC的访问进行增强

拦截器入门案例

@Component

public class ProjectInterceptor implements HandlerInterceptor {  

    //handler:被调用的处理器对象,本质上是一个方法对象,对反射技术中的Method对象进行了再包装  
    //原始方法调用前执行的内容
    //返回值类型可以拦截控制的执行,true放行,false终止

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String contentType = request.getHeader("Content-Type");
        HandlerMethod hm = (HandlerMethod)handler;
        System.out.println("preHandle..."+contentType);
        return true;
    }

    @Override
    //原始方法调用后执行的内容
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle...");
    }

    @Override
    //原始方法调用完成后执行的内容
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

        //表现层如果有异常抛出这里可以获取,但我们有统一异常处理,所以这里用得不多
        System.out.println("afterCompletion...");
    }

}

过滤静态资源

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    @Autowired
    private ProjectInterceptor projectInterceptor;

    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
    }

    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        //添加拦截器并设定拦截的访问路径,路径可以通过可变参数设置多个
        registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");
    }
}

定义配置类,com.xxz.config是上面support所在的位置,这样就把support配置上了:

@Configuration
@ComponentScan({"com.xxz.controller","com.xxz.config"})
@EnableWebMvc
//实现WebMvcConfigurer接口可以简化开发,但具有一定的侵入性
public class SpringMvcConfig implements WebMvcConfigurer {
    @Autowired
    private ProjectInterceptor projectInterceptor;
    @Autowired
    private ProjectInterceptor2 projectInterceptor2;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //配置多个拦截器
        registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");
        registry.addInterceptor(projectInterceptor2).addPathPatterns("/books","/books/*");
    }
}

 多个拦截器执行顺序,preHandle返回true时按顺序执行,而其他方法执行是倒序,preHandle返回false则只执行preHandle方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呀吼呀吼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值