一、攔截器和過濾器的區(qū)別
1儿子、過濾器和攔截器觸發(fā)時機(jī)不一樣愉适,過濾器是在請求進(jìn)入容器后,但請求進(jìn)入servlet之前進(jìn)行預(yù)處理的。請求結(jié)束返回也是,是在servlet處理完后,返回給前端之前。
2意蛀、攔截器可以獲取IOC容器中的各個bean若贮,而過濾器就不行,因為攔截器是spring提供并管理的,spring的功能可以被攔截器使用速缨,在攔截器里注入一個service原茅,可以調(diào)用業(yè)務(wù)邏輯通贞。而過濾器是JavaEE標(biāo)準(zhǔn)茎用,只需依賴servlet api ,不需要依賴spring圆米。
3近速、過濾器的實(shí)現(xiàn)基于回調(diào)函數(shù)。而攔截器(代理模式)的實(shí)現(xiàn)基于反射
4、Filter是依賴于Servlet容器,屬于Servlet規(guī)范的一部分堂湖,而攔截器則是獨(dú)立存在的斥季,可以在任何情況下使用午绳。
5赎败、Filter的執(zhí)行由Servlet容器回調(diào)完成勇吊,而攔截器通常通過動態(tài)代理(反射)的方式來執(zhí)行钥屈。
6竭业、Filter的生命周期由Servlet容器管理,而攔截器則可以通過IoC容器來管理,因此可以通過注入等方式來獲取其他Bean的實(shí)例病曾,因此使用會更方便贡茅。
最簡單明了的區(qū)別:
1.過濾器可以修改request艘策,而攔截器不能
2.過濾器需要在servlet容器中實(shí)現(xiàn),攔截器可以適用于javaEE翩伪,javaSE等各種環(huán)境
3.攔截器可以調(diào)用IOC容器中的各種依賴当悔,而過濾器不能
4.過濾器只能在請求的前后使用,而攔截器可以詳細(xì)到每個方法
調(diào)用方法流程如下:
1磅甩、過濾器
1奕枝、實(shí)現(xiàn)方式
1.使用spring boot提供的FilterRegistrationBean注冊Filter
定義Filter:
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("MyFilter");
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
注冊Filter:
@Slf4j
@Order(1)
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("-----------------------MyFilter");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
Filter.super.destroy();
}
2.使用原生servlet注解定義Filter
@WebFilter(filterName = "LoginFilter" ,urlPatterns = "/*")
@Slf4j
@Order(2)
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("進(jìn)入過濾器init");
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("進(jìn)入過濾器"+servletRequest.getRemoteAddr()+"|"+servletRequest.getRemoteHost()+"|"+servletRequest.getLocalPort()+"|"+servletRequest.getServerPort()
);
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
log.info("進(jìn)入過濾器destroy");
Filter.super.destroy();
}
這里直接用@WebFilter就可以進(jìn)行配置,同樣,可以設(shè)置url匹配模式余佃,過濾器名稱等。這里需要注意一點(diǎn)的是@WebFilter這個注解是Servlet3.0的規(guī)范,并不是Spring boot提供的妄均。除了這個注解以外,我們還需在啟動類中加另外一個注解:@ServletComponetScan瘸爽,指定掃描的包。
2譬胎、應(yīng)用場景
1)過濾敏感詞匯(防止sql注入)
2)設(shè)置字符編碼
3)URL級別的權(quán)限訪問控制
4)壓縮響應(yīng)信息
2、攔截器
1、實(shí)現(xiàn)方式
1.自定義攔截器
@Slf4j
public class AuthInterceptor implements HandlerInterceptor {
@Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
log.info("preHandle");
String clientIP = ServletUtil.getClientIP(httpServletRequest);
log.info("訪問IP:"+clientIP);
log.info("請求路徑:{}", httpServletRequest.getRequestURI());
return true;
}
@Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
log.info("postHandle");
}
@Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
log.info("afterCompletion");
}
2.注冊攔截器
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
private final AuthInterceptor authInterceptor;
public WebMvcConfig(AuthInterceptor authInterceptor) {
this.authInterceptor = authInterceptor;
}
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authInterceptor)
.addPathPatterns("/**");
}
}
2、應(yīng)用場景
1.登錄驗證仲翎,判斷用戶是否登錄溯香。
2.權(quán)限驗證,判斷用戶是否有權(quán)限訪問資源勉痴,如校驗token
3.日志記錄,記錄請求操作日志(用戶ip筛谚,訪問時間等)谓晌,以便統(tǒng)計請求訪問量聂使。
4.處理cookie、本地化拐叉、國際化岩遗、主題等。
5.性能監(jiān)控凤瘦,監(jiān)控請求處理時長等宿礁。
6.通用行為:讀取cookie得到用戶信息并將用戶對象放入請求,從而方便后續(xù)流程使用蔬芥,還有如提取Locale梆靖、Theme信息等,只要是多個處理器都需要的即可使用攔截器實(shí)現(xiàn))
————————————————
原文鏈接:https://blog.csdn.net/weixin_44830949/article/details/127493342