经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring Boot » 查看文章
SpringBoot使用Interceptor拦截器的实例
来源:jb51  时间:2023/3/20 8:40:15  对本文有异议

在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类似;

测试启动类,默认配置:

  1. /**
  2. * 2023年3月16日下午4:56:23
  3. */
  4. package testspringboot.test9interceptor;
  5. import org.springframework.boot.SpringApplication;
  6. import org.springframework.boot.autoconfigure.SpringBootApplication;
  7. /**
  8. * @author XWF
  9. *
  10. */
  11. @SpringBootApplication
  12. public class Test9Main {
  13. /**
  14. * @param args
  15. */
  16. public static void main(String[] args) {
  17. SpringApplication.run(Test9Main.class, args);
  18. }
  19. }

controller类:

  1. /**
  2. * 2023年3月16日下午4:58:02
  3. */
  4. package testspringboot.test9interceptor;
  5. import java.util.concurrent.Callable;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RestController;
  8. /**
  9. * @author XWF
  10. *
  11. */
  12. @RestController
  13. @RequestMapping("/interceptor")
  14. public class Test9Controller {
  15. @RequestMapping("/a")
  16. public String a(String s) {
  17. System.out.println(">>>a():" + s);
  18. return "OK";
  19. }
  20. @RequestMapping("/b")
  21. public Callable<String> b() {
  22. Callable<String> callable = new Callable<String>() {
  23. @Override
  24. public String call() throws Exception {
  25. Thread.sleep(2000);
  26. System.out.println("call() thread id=" + Thread.currentThread().getId());
  27. Thread.sleep(2000);
  28. return "abcdefg";
  29. }
  30. };
  31. System.out.println(">>>b()");
  32. return callable;
  33. }
  34. }

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

  1. /**
  2. * 2023年3月16日下午5:14:14
  3. */
  4. package testspringboot.test9interceptor;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import org.springframework.web.servlet.HandlerInterceptor;
  8. import org.springframework.web.servlet.ModelAndView;
  9. /**
  10. * @author XWF
  11. *
  12. */
  13. public class MyInterceptor1 implements HandlerInterceptor {
  14. @Override
  15. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
  16. throws Exception {
  17. System.out.println("preHandle 1, handler=" + handler);
  18. return request.getQueryString().length() < 10 ? true : false;
  19. }
  20. @Override
  21. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
  22. ModelAndView modelAndView) throws Exception {
  23. System.out.println("postHandle 1");
  24. }
  25. @Override
  26. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
  27. throws Exception {
  28. System.out.println("afterCompletion 1");
  29. }
  30. }
  1. /**
  2. * 2023年3月16日下午5:15:28
  3. */
  4. package testspringboot.test9interceptor;
  5. import java.util.Date;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import org.springframework.stereotype.Component;
  9. import org.springframework.web.servlet.AsyncHandlerInterceptor;
  10. import org.springframework.web.servlet.ModelAndView;
  11. /**
  12. * @author XWF
  13. *
  14. */
  15. @Component
  16. public class MyInterceptor2 implements AsyncHandlerInterceptor {
  17. @Override
  18. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
  19. throws Exception {
  20. System.out.println("preHandle 2 " + new Date() + " ThreadId=" + Thread.currentThread().getId());
  21. return true;
  22. }
  23. @Override
  24. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
  25. ModelAndView modelAndView) throws Exception {
  26. System.out.println("postHandle 2");
  27. }
  28. @Override
  29. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
  30. throws Exception {
  31. System.out.println("afterCompletion 2");
  32. }
  33. @Override
  34. public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler)
  35. throws Exception {
  36. System.out.println("afterConcurrentHandlingStarted 2 " + new Date());
  37. }
  38. }

配置拦截器:

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

发送一个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拦截器内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号