Spring Boot新增攔截器

超頻化石魚發表於2018-11-22

Servlet本身提供了Filter,用於過濾web請求。Spring提供了攔截器HandlerInterceptor,功能與過濾器類似,但更精細。攔截器攔截request請求後,可以對內容進行判斷,然後丟擲異常或者返回false,從而直接打斷request的後續執行。但攔截器是無法修改request的內容的。

要使用攔截器,必須使用配置類WebMvcConfigurer

1. 定義攔截器,定義方式有兩種:

public class TemplateInterceptor extends HandlerInterceptorAdapter {...}

或:

public class TemplateInterceptor implements HandlerInterceptor {...}

這兩種定義方式效果相同。但HandlerInterceptorAdapter多一個介面。

2. 定義配置檔案Configuration,定義方式有兩種:

@Configuration
public class TemplateConfig extends WebMvcConfigurerAdapter {...}

或:

@Configuration
public class TemplateConfig implements WebMvcConfigurer {...}

這兩種定義方式效果相同。

注意必須新增@Configuration註解,這樣spring才會將其注入到自身容器中。

3. 過載Configuration的addInterceptors()函式,註冊自定義的攔截器:

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new TemplateInterceptor()).addPathPatterns("/**");
}

這樣,攔截器就被配置到spring中了。當收到請求時,攔截器就會生效。

 

對於攔截器HandlerInterceptor,提供了3個介面用於過載:preHandle()postHandle()afterCompletion()

因此實現自定義的攔截器TemplateInterceptor時:

public class TemplateInterceptor implements HandlerInterceptor {
    /**
     *請求處理前呼叫
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }

    /**
     * 請求處理後呼叫
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }

    /**
     * 整個請求處理完畢時呼叫,即在檢視渲染完畢時回撥
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}
若TemplateInterceptor是extends HandlerInterceptorAdapter,則多一個介面afterConcurrentHandlingStarted()

 

相關文章