SpringBoot——使用Interceptor拦截器
创始人
2025-05-29 20:40:33
0

在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 b() {Callable callable = new Callable() {@Overridepublic 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 {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {System.out.println("preHandle 1, handler=" + handler);return request.getQueryString().length() < 10 ? true : false; }@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {System.out.println("postHandle 1");}@Overridepublic 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 {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {System.out.println("preHandle 2 " + new Date() + " ThreadId=" + Thread.currentThread().getId());return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {System.out.println("postHandle 2");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {System.out.println("afterCompletion 2");}@Overridepublic 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 {@ResourceMyInterceptor2 myinterceptor2;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor1()).addPathPatterns("/interceptor/a")        //添加拦截路径,两种参数List和String ....excludePathPatterns("/interceptor/b")        //排除路径,两种参数List和String ....order(1);        //设置拦截器顺序,由小到大,默认0registry.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可以看到前后使用的是两个线程;

相关内容

热门资讯

跨境电商高发!多部门共织“天罗... 东方网11月23日消息:11月21日,上海市人民检察院第三分院与上海海关缉私局、上海海警局、上海市第...
法律顾问能处理旅游法律事务吗 在旅游行业蓬勃发展的当下,各类旅游法律事务也日益增多,许多人会疑惑法律顾问是否能处理旅游法律事务。答...
法律顾问能处理哪些法律事务 在当今复杂多变的商业环境中,企业面临着各种各样的法律风险和挑战,法律顾问的重要性日益凸显。那么,法律...
原创 美... 美军的撤离速度印证了威慑效果。“尼米兹”号10月中旬进入南海后,10月26日接连发生两起舰载机坠机事...
王毅:中方绝不允许日本右翼势力... 当地时间2025年11月22日,中共中央政治局委员、外交部长王毅在杜尚别同塔吉克斯坦外长穆赫里丁举行...
上海特大案件曝光!涉案金额超亿... 今年以来,公安部会同金融监管总局开展打击金融领域黑灰产违法犯罪专项工作,对保险等领域违法犯罪进行重点...
关于单方面免签政策常见问题,国... 今天(11月23日),国家移民管理局针对单方面免签政策常见问题进行解答。 1.哪些国家人员可适用单方...
“最快护士”张水华再夺冠 新京报记者 刘锦涵
 制作 葛佳丹 ▲新京报我们视频出品(ID:wevideo) 11月23日,“最...
原创 沉... 在国际关系的复杂舞台上,每一个动作都可能引发连锁反应。近期,高市早苗的发言无疑是这一舞台上的一次重要...