一、攔截器
1聪舒、攔截器不依賴與Servlet容器辨液,依賴于Spring等web框架。
2箱残、攔截器是一種AOP的應(yīng)用滔迈,底層是用的是Java反射機制來實現(xiàn)的止吁。
3、攔截器在springboot的配置中就是可以用@Bean 注解 或者@Autowired 來注入到容器燎悍。
/**
* 攔截器裝配
*/
@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter {
@Bean
MyInterceptor myInterceptor(){
return new MyInterceptor();
}
@Bean
MyInterceptor2 myInterceptor2(){
return new MyInterceptor2();
}
/**
* 添加攔截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
//添加多個攔截器
registry.addInterceptor(myInterceptor()).addPathPatterns("/**");
registry.addInterceptor(myInterceptor2()).addPathPatterns("/**");
}
}
/**
* 攔截器1
*/
package test.interceptor;
import com.sun.istack.internal.Nullable;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//方法前
System.out.println("preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
//視圖渲染前
System.out.println("postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
//完成之后x
System.out.println("afterCompletion");
}
}
/**
* 攔截器2
*/
package test.interceptor;
import com.sun.istack.internal.Nullable;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor2 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//方法前
System.out.println("preHandle2");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
//視圖渲染前
System.out.println("postHandle2");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
//完成之后x
System.out.println("afterCompletion2");
}
}
4敬惦、多個攔截器的調(diào)用順序,按調(diào)用鏈順序調(diào)用谈山,如下:
preHandle按攔截器定義順序調(diào)用
postHandler按攔截器定義逆序調(diào)用
afterCompletion按攔截器定義逆序調(diào)用
postHandler在攔截器鏈內(nèi)所有攔截器返成功調(diào)用
afterCompletion只有preHandle返回true才調(diào)用
5俄删、缺點:只能對controller請求進行攔截,對其他的一些比如直接訪問靜態(tài)資源的請求則沒辦法進行攔截處理奏路。
二畴椰、過濾器
1、優(yōu)點:在實現(xiàn)上基于函數(shù)回調(diào)鸽粉,可以對幾乎所有請求進行過濾斜脂。
2、缺點:一個過濾器實例只能在容器初始化時調(diào)用一次(一次請求調(diào)用次)
3触机、應(yīng)用場景:過濾器的目的是用來做一些過濾操作秽褒,獲取我們想要獲取的數(shù)據(jù),比如:在過濾器中修改字符編碼威兜;在過濾器中修改HttpServletRequest的一些參數(shù),包括:過濾低俗文字庐椒、危險字符等
三椒舵、總結(jié)
1、攔截器是基于java的反射機制的约谈,而過濾器是基于函數(shù)回調(diào)笔宿。
2、攔截器不依賴與servlet容器棱诱,過濾器依賴與servlet容器泼橘。
3、攔截器只能對action請求起作用(進入controller的)迈勋,而過濾器則可以對幾乎所有的請求起作用(包括靜態(tài)頁面)炬灭。
4、攔截器可以訪問action上下文靡菇、值棧里的對象重归,而過濾器不能訪問。
5厦凤、在action的生命周期中鼻吮,攔截器可以多次被調(diào)用,而過濾器只能在容器初始化時被調(diào)用一次
6较鼓、攔截器可以獲取IOC容器中的各個bean椎木,而過濾器就不行违柏,這點很重要,在攔截器里注入一個service香椎,可以調(diào)用業(yè)務(wù)邏輯漱竖。