欢迎访问宙启技术站
智能推送

spring boot加入拦截器Interceptor过程解析

发布时间:2023-05-14 15:14:17

Spring Boot是一个快速构建基于Spring框架的应用程序的工具。可以快速地完成数据库连接、配置和发布等各种工作,实现简单快捷的Web应用程序的开发。在使用Spring Boot开发Web应用程序的过程中,经常需要加入拦截器Interceptor处理一些共性的业务逻辑,如请求、响应头的处理、防止CSRF攻击等。本文将解析Spring Boot加入拦截器Interceptor的过程,帮助开发者更好的理解和使用Spring Boot。

一、定义Interceptor

在Spring Boot中定义Interceptor需要实现HandlerInterceptor接口,并重写preHandle、postHandle、afterCompletion三个方法。

1.preHandle是处理请求前调用的方法,返回值决定请求是否被拦截。例如,返回false表示不继续处理请求,可以在这个方法中实现登录验证、防止CSRF攻击等。

2.postHandle是处理请求后调用的方法,可以在这个方法中修改ModelAndView等数据。

3.afterCompletion是处理完请求后调用的方法,可以在这个方法中进行资源清理的操作。

具体的代码实现如下:

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws Exception {
        // 拦截逻辑
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // 处理逻辑
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
            Exception ex) throws Exception {
        // 资源清理
    }
}

二、配置Interceptor

在使用拦截器之前,需要将我们定义的Interceptor配置到Spring Boot的请求拦截链中。在Spring Boot中,实现拦截器的配置有三种方法。

1.配置类

可以通过编写配置类来配置Interceptor,将Interceptor注册到Spring容器中。首先需要声明一个继承WebMvcConfigurerAdapter类的配置类,然后重写addInterceptors方法,实现拦截器的注册功能。

@Configuration
public class MyInterceptorConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
    }
}

其中,addPathPatterns方法表示拦截所有的请求,也可以根据需要匹配特定的请求,如:

registry.addInterceptor(new MyInterceptor()).addPathPatterns("/user/**");

2.注解方式

可以通过在拦截器类上使用@Component注解或@Bean注解的方式来配置Interceptor。

种方式是在拦截器类上使用@Component注解,将Interceptor注册到Spring容器中。

@Component
public class MyInterceptor implements HandlerInterceptor {...}

第二种方式是在配置类中使用@Bean注解将Interceptor注册到Spring容器中。

@Configuration
public class MyInterceptorConfig {
    @Bean
    public MyInterceptor myInterceptor() {
        return new MyInterceptor();
    }
}

然后可以使用@Autowired注解将Interceptor注入到需要使用的Controller中,如:

@RestController
public class UserController {
    @Autowired
    private MyInterceptor myInterceptor;
    @RequestMapping("/login")
    public Object login() {
        // 业务逻辑
    }
}

3.继承WebMvcConfigurerAdapter方式

使用继承WebMvcConfigurerAdapter方式注册就不需要显式调用InterceptorRegistry.addInterceptor()方法了,在配置类中,只需要重写addInterceptors方法,并且调用super.addInterceptors(registry)即可。

@Configuration
public class MyInterceptorConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor());
        super.addInterceptors(registry);
    }
}

三、Interceptor的执行顺序

Spring Boot中的Interceptor执行顺序与JavaWeb中的Filter执行顺序类似,是按照Interceptor在配置中添加顺序来决定的。如下面的例子:

@Configuration
public class MyInterceptorConfig extends WebMvcConfigurerAdapter {

@Bean
    public MyInterceptor myInterceptor1() {
        return new MyInterceptor1();
    }

    @Bean
    public MyInterceptor myInterceptor2() {
        return new MyInterceptor2();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor1()).addPathPatterns("/user/**");
        registry.addInterceptor(myInterceptor2()).addPathPatterns("/user/**");
        super.addInterceptors(registry);
    }
}

这里配置了两个Interceptor,并且添加到了/user/**的请求拦截列表中,这时Interceptor执行顺序是按照添加到拦截列表中的顺序,即先执行myInterceptor1()再执行myInterceptor2()。

需要注意的是,如果使用继承WebMvcConfigurerAdapter方式来注册Interceptor,还需要调用super.addInterceptors(registry)方法,否则其他Interceptor将不能按照正确的顺序执行。

总结

在Spring Boot中加入拦截器Interceptor的过程包括以下三个步骤:

步:定义Interceptor,实现HandlerInterceptor接口,重写preHandle、postHandle、afterCompletion三个方法。

第二步:配置Interceptor,有三种方式,包括配置类方式、注解方式和继承WebMvcConfigurerAdapter方式。

第三步:定义Interceptor的执行顺序,按照Interceptor在配置中添加的顺序来决定。

拦截器Interceptor是Spring Boot中的一个重要组件,通过对拦截器的使用,可以对请求和响应进行各种业务处理,有助于开发高质量、易维护的Web应用程序。