Spring Boot 攔截器和過濾器
文章概覽
- 攔截器
- 過濾器
攔截器
我們可以使用攔截器做一些處理在一下兩種狀態:
- 發送請求到controller之前
- 響應信息到客戶端之前
攔截器步驟:
- 定義一個攔截器
- 註冊定義的攔截器
例子:在一個請求在到達controller之前,我們可以用攔截器給這個請求增加request header 的屬性;或在一個響應返回到客戶端之前,我們用攔截器給這個響應增加response header。
自定義攔截器,需要我們實現HandlerInterceptor接口,還要 @Component 註解的支持。
下面是三個方法來自HandlerInterceptor接口
- preHandle():該方法用來做一些處理,在請求到達controller之前。返回true時,纔會返回響應給客戶端。
- postHandle():該方法用來做一些處理,在響應到達客戶端之前。
- afterCompletion():該方法做一些處理,在完成請求和響應後。
代碼如下:
@Component
public class ProductServiceInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("pre Handle method is Calling");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("Post Handle method is Calling");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("Request and Response is completed");
}
}
註冊攔截器,我們需要InterceptorRegistry 來註冊攔截器,要實現WebMvcConfigurer 接口
@Component
public class ProductServiceInterceptorAppConfig implements WebMvcConfigurer {
@Autowired
ProductServiceInterceptor productServiceInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(productServiceInterceptor);
}
}
攔截器執行大概流程如下:
過濾器
過濾器用來攔截HTTP的請求和響應,我們可以使用過濾器處理一些操作:
- 在請求到達controller之前
- 在響應到達client之前
自定義一個過濾器(Filter),需要實現Filter接口,需要 @Component支持。Filter的三個方法:
- init():在初始化過濾器的時候就執行
- doFilter():可能會到過濾器,調用過濾器執行鏈。
- destroy():在銷燬過濾器時執行
代碼如下
@Component
public class SimpleFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("filter start init");
}
@Override
public void destroy() {
System.out.println("filter end!!!");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("Remote Host:"+servletRequest.getRemoteHost());
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("Remote1 Host:"+servletRequest.getRemoteHost());
}
}
過濾器的執行大概流程:
攔截器和過濾器的區別
- 過濾器能做的,攔截器能做
- 他們執行順序不一致