SpringBoot使用Interceptor拦截器的实例

 更新时间:2023年03月18日 10:47:15   作者:FlyLikeButterfly  
这篇文章主要介绍了SpringBoot使用Interceptor拦截器的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

在springboot中使用拦截器也比较简单,实现HandlerInterceptor或者AsyncHandlerInterceptor接口,再从配置里添加一下拦截器就完成了;

AsyncHandlerInterceptor接口继承了HandlerInterceptor,多了一个afterConcurrentHandlingStarted方法:

接口里的方法:

  • preHandle:在Controller之前执行,可以判断参数,执行的controller方法等,返回值为boolean,返回true继续往下运行(下面的拦截器和controller),否则开始返回操作(执行之前的拦截器返回等操作);
  • postHandle:在Controller之后,视图返回前执行,可对ModelAndView进行处理再返回;
  • afterCompletion:请求完成后执行;
  • afterConcurrentHandlingStarted:controller返回值是java.util.concurrent.Callable时才会调用该方法并使用新线程运行;

方法执行顺序有两种:

  • preHandle -> 执行Controller -> postHandle -> afterCompletion;
  • preHandle -> 执行Controller -> afterConcurrentHandlingStarted -> callable线程执行call()方法 -> 新线程开始preHandle -> postHandle -> afterCompletion;(controller方法返回Callable对象时)

配置拦截器:

实现WebMvcConfigurer接口里的addInterceptors方法,使用参数InterceptorRegistry对象添加自己的拦截器,可以添加指定拦截路径或者去掉某些过滤路径,还可以设置拦截器的优先级order,优先级由小到大,默认0;

多个拦截器的执行顺序:

preHandle方法按照order由小到大顺序,执行完controller后,其他方法则反向顺序,跟过滤器Filter类似;

测试启动类,默认配置:

/**
 * 2023年3月16日下午4:56:23
 */
package testspringboot.test9interceptor;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
/**
 * @author XWF
 *
 */
@SpringBootApplication
public class Test9Main {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        SpringApplication.run(Test9Main.class, args);
    }
 
}

controller类:

/**
 * 2023年3月16日下午4:58:02
 */
package testspringboot.test9interceptor;
 
import java.util.concurrent.Callable;
 
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
/**
 * @author XWF
 *
 */
@RestController
@RequestMapping("/interceptor")
public class Test9Controller {
 
    @RequestMapping("/a")
    public String a(String s) {
        System.out.println(">>>a():" + s);
        return "OK";
    }
    
    @RequestMapping("/b")
    public Callable<String> b() {
        Callable<String> callable = new Callable<String>() {
            @Override
            public String call() throws Exception {
                Thread.sleep(2000);
                System.out.println("call() thread id=" + Thread.currentThread().getId());
                Thread.sleep(2000);
                return "abcdefg";
            }
        };
        System.out.println(">>>b()");
        return callable;
    }
    
}

两个自定义拦截器1和2:

/**
 * 2023年3月16日下午5:14:14
 */
package testspringboot.test9interceptor;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
 
/**
 * @author XWF
 *
 */
public class MyInterceptor1 implements HandlerInterceptor {
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("preHandle 1, handler=" + handler);
        return request.getQueryString().length() < 10 ? true : false; 
    }
    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle 1");
    }
    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("afterCompletion 1");
    }
    
}
/**
 * 2023年3月16日下午5:15:28
 */
package testspringboot.test9interceptor;
 
import java.util.Date;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.AsyncHandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
 
/**
 * @author XWF
 *
 */
@Component
public class MyInterceptor2 implements AsyncHandlerInterceptor {
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("preHandle 2 " + new Date() + " ThreadId=" + Thread.currentThread().getId());
        return true;
    }
    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle 2");
    }
    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("afterCompletion 2");
    }
    
    @Override
    public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("afterConcurrentHandlingStarted 2 " + new Date());
    }
    
}

配置拦截器:

/**
 * 2023年3月16日下午5:20:31
 */
package testspringboot.test9interceptor;
 
import javax.annotation.Resource;
 
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
/**
 * @author XWF
 *
 */
@Configuration
public class MyInterceptorConfig implements WebMvcConfigurer {
 
    @Resource
    MyInterceptor2 myinterceptor2;
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor1())
            .addPathPatterns("/interceptor/a")        //添加拦截路径,两种参数List<String>和String ...
            .excludePathPatterns("/interceptor/b")        //排除路径,两种参数List<String>和String ...
            .order(1);        //设置拦截器顺序,由小到大,默认0
        registry.addInterceptor(myinterceptor2);    //也可以使用spring管理的对象
    }
    
}

发送一个post测试请求:http://192.168.1.30:8080/interceptor/a?s=hello,拦截器2的order默认0,拦截器1的order为1,preHandle先执行2的,controller执行之后,剩下的Handle都是先执行1再执行2的;

发送preHandle返回false的请求:http://192.168.1.30:8080/interceptor/a?s=hello123456789,拦截器1的preHandle返回false后,直接执行2的afterCompletion;

发送测试callable的请求:http://192.168.1.30:8080/interceptor/b?s=hello,拦截路径配置跳过拦截器1只执行拦截器2,通过threadid可以看到前后使用的是两个线程;

到此这篇关于SpringBoot使用Interceptor拦截器的文章就介绍到这了,更多相关SpringBoot使用Interceptor拦截器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中泛型总结(推荐)

    Java中泛型总结(推荐)

    这篇文章主要介绍了Java中泛型总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • SpringBoot项目启动执行任务的多种方法小结

    SpringBoot项目启动执行任务的多种方法小结

    这篇文章主要介绍了SpringBoot项目启动执行任务的多种方法小结,本文给大家分享的这几种方法经常会被用到,当我们的项目启动后需要调用对应的方法,用来项目的初始化等,本文通过示例代码讲解的非常详细,需要的朋友参考下吧
    2023-07-07
  • Spring事务失效的各种场景(13种)

    Spring事务失效的各种场景(13种)

    本文主要介绍了Spring事务失效的各种场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • swing jtextArea滚动条和文字缩放效果

    swing jtextArea滚动条和文字缩放效果

    这篇文章主要为大家详细介绍了swing jtextArea滚动条和文字缩放效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • 10中java常见字符串操作实例

    10中java常见字符串操作实例

    给大家分享10中java常见字符串操作方法以及相关实例代码,对此有需要的读者们可以学习参考下。
    2019-07-07
  • Java 高并发四:无锁详细介绍

    Java 高并发四:无锁详细介绍

    本文主要介绍Java 高并发无锁的知识,这里整理了 1.无锁类的原理详解 2.无锁类的使用的知识,并讲解其原理,有需要的小伙伴可以参考下
    2016-09-09
  • Java语言中cas指令的无锁编程实现实例

    Java语言中cas指令的无锁编程实现实例

    这篇文章主要介绍了Java语言中cas指令的无锁编程实现实例,具有一定参考价值,需要的朋友可以了解下。
    2017-09-09
  • SpringBoot @Test单元测试方式

    SpringBoot @Test单元测试方式

    这篇文章主要介绍了SpringBoot @Test单元测试方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • java策略枚举:消除在项目里大批量使用if-else的优雅姿势

    java策略枚举:消除在项目里大批量使用if-else的优雅姿势

    这篇文章主要给大家介绍了关于Java彻底消灭if-else的8种方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2021-06-06
  • 梳理总结Java static关键字的方法作用

    梳理总结Java static关键字的方法作用

    这篇文章主要介绍了梳理总结Java static关键字的方法作用, static 关键字可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属于某个对象的
    2022-06-06

最新评论