本文例程下載:https://files.cnblogs.com/files/heyang78/redisCache_Interceptor_sample_210922.rar
本文適用SpringBoot版本:v2.5.4
有這樣一個RestController類如下:
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class JsonCtrl { @RequestMapping("/sayhello") public String sayHello() { System.out.println("准備說你好"); return "hello"; } }
這個類就是一般的Rest控制器類,直接用控制器類也是可以的,里面沒有特殊設置。
如何給它設置前置攔截器呢,首先我們需要一個實現了HandlerInterceptor接口的攔截器類:
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; @Component public class Interceptor implements HandlerInterceptor{ /** * 在請求處理之前進行調用(Controller/RestController方法調用之前) */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { String path = request.getServletPath(); System.out.println("已攔截 path="+path); // 執行權限檢查、登錄驗證、緩存處理等 return true; } }
然后,我們需要一個實現了WebMvcConfigurer接口的WebConfig類把攔截器加載進來。
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer{ @Autowired private Interceptor interceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(interceptor); } }
注意,registry.addInterceptor()方法可以添加多個攔截器,不限個數。
然后把啟動類跑起來就好了。
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }
這個類沒什么特別的。
內嵌的Tomcat運行起來后,我們可以在瀏覽器里輸入http://localhost:8080/sayhello或是其它路徑,然后到控制台去看攔截器是否按預期運轉了。
2021-09-22 20:52:42.992 INFO 22764 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 0 ms 已攔截 path=/sayHello 已攔截 path=/error 已攔截 path=/sayhello 准備說你好 已攔截 path=/21332 已攔截 path=/error
正如預期般運轉,很好。
至此,一個RestController類的前置攔截器就搭建好了。
參考資料:https://www.cnblogs.com/itfeng813/p/13026652.html
--END--