Try   HackMD

攔截器是什麼

tags: 攔截器介紹

SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。

过滤器与拦截器的区别:拦截器是AOP思想的具体应用。

过滤器

​​​​servlet规范中的一部分,任何java web工程都可以使用

​​​​在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截

拦截器

​​​​拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用

​​​​拦截器只会拦截访问的控制器方法, 如果访问的是jsp/html/css/image/js是不会进行拦截的

程式碼

要在application.xml將攔截器先配置

<!--攔截器配置--> <mvc:interceptors> <mvc:interceptor> <!--包括這個請求下面的所有請求--> <mvc:mapping path="/**"/> <bean class="com.kuang.config.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors>

測試用代碼

@RestController public class TestController { @GetMapping("/c1") public String test(){ System.out.println("TestController==>test()執行了"); return "OK"; } }

攔截器代碼

要implements HandlerInterceptor才能創立
底下的代碼非強制執行,但要@Override才能執行攔截器的功能

測試為true:通過攔截器

public class MyInterceptor implements HandlerInterceptor { //return false:執行下一個過濾器,放行 //return true:不執行下一個過濾器 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("===========處理前============"); return true; } //攔截日誌 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("===========處理後============"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("===========清理============"); } }

成功通過攔截器,並且在console顯示結果

實際上只有preHandle在執行攔截工作,其餘兩個是做攔截的日誌紀錄

若為false

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("===========處理前============"); return false; }

原先該顯示的畫面沒有顯示

因為已經被攔截器攔截,因此只顯示preHandle的內容