很多同學搞不懂攔截器和過濾器的區別,我們先說一下他們的區別:
- 過濾器和攔截器非常相似,但是它們有很大的區別
- 最簡單明瞭的區別就是過濾器可以修改request,而攔截器不能
- 過濾器需要在servlet容器中實現,攔截器可以適用於javaEE,javaSE等各種環境
- 攔截器可以調用IOC容器中的各種依賴,而過濾器不能
- 過濾器只能在請求的前後使用,而攔截器可以詳細到每個方法
通俗的說過濾器就是篩選出你要的東西,比如requeset中你要的那部分
攔截器在做安全方面用的比較多,比如終止一些流程。
接下來我們舉個簡單的例子:
1、建立interceptor包,在此包下建立Interceptor類。此處我們以處理Ajax跨域請求爲例,關於跨域請求,大家不懂的可以自行學習。代碼如下:
public class Interceptor implements HandlerInterceptor {
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// TODO Auto-generated method stub
}
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Methods", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type");
System.err.println("------------------>:已完成跨域處理");
return true;
}
}
注意此類實現了HandlerInterceptor接口。
2、我們還要註冊一下此攔截器才能被springboot檢測到,在config包下建立AppConfigurer類,代碼如下:
@Configuration
public class AppConfigurer extends WebMvcConfigurerAdapter {
@Bean
public HandlerInterceptor getMyInterceptor() {
return new Interceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(getMyInterceptor()).addPathPatterns("/**");
super.addInterceptors(registry);
}
}
注意此類繼承了WebMvcConfigurerAdapter類。getMyInterceptor方法爲攔截器實例注入方法。addInterceptors方法爲說明攔截目標方法。此處我們所有請求都攔截。
3、測試結果如下:
攔截器配置成功。