SpringBoot2.0下如何添加一个Filter过滤器以及Intercpetor拦截器

Filter的配置

方式1

  1. 实现一个filter类,通过实现filter接口,关于filter接口以及相关功能在此不作介绍.
  2. 在上面使用@WebFilter注解
  3. 使用@ServletComponentScan在启动类上扫描filter

filter类

//filter
@WebFilter(urlPatterns = "/api/*")
public class MyFilter implements Filter {

    public void init(FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("执行了 MyFilter");
        filterChain.doFilter(servletRequest,servletResponse);
    }


    public void destroy() {

    }
}

启动类

要保证能够扫描到filter类

@SpringBootApplication
@ServletComponentScan
public class WebApplication {
    public static void main(String[] args){
        SpringApplication.run(WebApplication.class);
    }
}


运行日志

可以看到filter成功运行
运行日志

方式二

  1. 依然是自定义一个Filter类,不需要@WebFilter注解,只需要使用@Component注解
@Component
public class MyFilter implements Filter {

    public void init(FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("执行了 MyFilter");
        filterChain.doFilter(servletRequest,servletResponse);
    }


    public void destroy() {

    }
}

  1. 在启动类中注入Bean
@SpringBootApplication
public class WebApplication {
    public static void main(String[] args){
        SpringApplication.run(WebApplication.class);
    }


    @Bean
    public FilterRegistrationBean registrationBean(MyFilter myFilter){
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
	//将我们自己定义的过滤器设置进去
        registrationBean.setFilter(myFilter);
	//为当前的Filter添加拦截路径
        registrationBean.addUrlPatterns("/api/*");
	//为Filter配置一个名称
        registrationBean.setName("MyFilter");
	//为Filter设置在过滤器链中的执行顺序
        registrationBean.setOrder(1);
        return registrationBean;
    }
}


  1. 运行查看效果

很明显成功了~~~
运行效果

Interceptor配置

拦截器是SpringMvc中的,配置起来类似Filter

  1. 通过实现HandlerInterceptor接口来实现自定义的拦截器
@Component
public class MyInterceptor implements HandlerInterceptor {
    //前置处理,在执行controller之前处理
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        System.out.println("MyInterceptor preHandle 执行了");
        //如果return false那么就不会去执行controller
        return true;
    }

    //在执行了controller之后执行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor postHandle 执行了");
    }

    //最后执行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor afterCompletion 执行了");
    }
}

  1. 需要添加一个配置类,通过继承WebMvcConfigureAdaptor

但是这里有个问题,就是在springboot2中这个WebMvcConfigurerAdapter是被标志为过时了,不推荐使用了,但是用的话还是没问题,依旧可以正常使用。

//
@Component
public class MyWebMvcConfig extends WebMvcConfigurerAdapter {

    @Autowired
    private MyInterceptor myInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //添加拦截器并添加拦截器的拦截路径
        registry.addInterceptor(myInterceptor).addPathPatterns("/api/*");
    }
}

我们可以把继承这个WebMvcConfigurerAdapter换成实现WebMvcConfigure,因为在jdk8中接口提供了默认方法,所以不需要使用类来重写接口中的方法,所以也就不需要WebMvcConfigurerAdapter这个类了

@Component
public class MyWebMvcConfig implements WebMvcConfigurer {

    @Autowired
    private MyInterceptor myInterceptor;

    public void addInterceptors(InterceptorRegistry registry) {
        //添加拦截器并添加拦截器的拦截路径
        registry.addInterceptor(myInterceptor).addPathPatterns("/api/*");
    }
}

直接运行启动类,默认的控制台输出上不会显示是否添加了拦截器的信息,我们写一个controller来测试一下

@RestController
@RequestMapping("/api/web/user")
public class UserController {

    @GetMapping
    public String getUser(String id){
        System.out.println("执行了getUser:"+id);
        return "执行成功";
    }
}

启动后,输出地址来看一下测试结果 SpringBoot2.0下如何添加一个Filter过滤器以及Intercpetor拦截器_第1张图片

可以发现好像并没有执行interceptor,好像只执行了filter,这是为什么呢?

因为在上面我们为拦截器配置拦截路径的时候配置的是/api/*这个配置的是有问题的,因该配置为/api/**,我们修改配置后再来试一下。 SpringBoot2.0下如何添加一个Filter过滤器以及Intercpetor拦截器_第2张图片

成功了~~~~我们在这里也可以发现filter和interceptor的执行顺序

转载于:https://my.oschina.net/u/4089687/blog/3036554

你可能感兴趣的:(SpringBoot2.0下如何添加一个Filter过滤器以及Intercpetor拦截器)