springboot에서 인터셉터를 사용하는 것도 상대적으로 간단합니다. HandlerInterceptor 또는 AsyncHandlerInterceptor 인터페이스를 구현한 다음 구성에서 인터셉터를 추가합니다.
AsyncHandlerInterceptor 인터페이스는 추가 afterConcurrentHandlingStarted 메서드와 함께 HandlerInterceptor를 상속합니다. 인터페이스:
preHandle: 컨트롤러 이전에 실행되며 매개 변수, 실행된 컨트롤러 메서드 등을 결정할 수 있습니다. 반환 값은 부울이며 true를 반환하고 계속 실행합니다(아래 인터셉터 및 컨트롤러). 그렇지 않으면 Operation 반환을 시작합니다( 이전 인터셉터 반환 및 기타 작업 실행)postHandle: 컨트롤러 이후에 실행되고 뷰가 반환되기 전에 ModelAndView가 반환되기 전에 처리될 수 있습니다.
afterCompletion: 요청이 완료된 후 실행됩니다. afterConcurrentHandlingStarted: 이 메서드는 컨트롤러의 반환 값이 java.util.concurrent.Callable인 경우에만 새 스레드를 사용하여 호출되고 실행됩니다.
두 가지 메서드 실행 순서가 있습니다.
preHandle -> Controller -> postHandle -> afterCompletion;
preHandle -> afterConcurrentHandlingStarted -> 호출 가능한 스레드가 preHandle을 시작함 -> (컨트롤러 메소드는 호출 가능 객체를 반환함)
인터셉터 구성:
다중 인터셉터의 실행 순서:
테스트 시작 클래스, 기본 구성:
/** * 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); } }
/** * 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管理的对象 } }
후 테스트 요청 보내기: http://192.168.1.30:8080/interceptor/a?s=hello, 인터셉터 2의 순서는 기본적으로 0이고, 인터셉터 1의 순서는 1입니다. PreHandle은 컨트롤러가 실행된 후 2를 먼저 실행합니다. 먼저 1을 실행합니다.
preHandle이 false를 반환하는 요청을 보냅니다. http://192.168.1.30:8080/interceptor/a?s=hello123456789 인터셉터 1의 preHandle이 false를 반환한 후 직접 실행합니다. afterCompletion of 2;호출 가능 테스트 요청 보내기: http://192.168.1.30:8080/interceptor/b?s=hello, 차단 경로 구성은 인터셉터 1을 건너뛰고 인터셉터 2만 실행합니다. threadid를 통해 사용 전후는 두 개의 스레드가 있습니다.
위 내용은 SpringBoot에서 인터셉터 인터셉터를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!