通過(guò)實(shí)例解析java過(guò)濾器和攔截器的區(qū)別
區(qū)別
1.使用范圍和規(guī)范不同
filter是servlet規(guī)范規(guī)定的,只能用在web程序中.
攔截器即可以用在web程序中, 也可以用于application, swing程序中, 是Spring容器內(nèi)的, 是Spring框架支持的
2.觸發(fā)時(shí)機(jī)不同
順序: Filter-->Servlet-->Interceptor-->Controller
- 過(guò)濾器是在請(qǐng)求進(jìn)入容器后,但請(qǐng)求進(jìn)入servlet之前進(jìn)行預(yù)處理的。請(qǐng)求結(jié)束返回也是,是在servlet處理完后,返回給前端之前過(guò)濾器處理。
- 攔截器是方法到達(dá)Controller層之前生效的
3.過(guò)濾器的實(shí)現(xiàn)基于回調(diào)函數(shù)。而攔截器(代理模式)的實(shí)現(xiàn)基于反射,代理分靜態(tài)代理和動(dòng)態(tài)代理,動(dòng)態(tài)代理是攔截器的簡(jiǎn)單實(shí)現(xiàn)。
何時(shí)使用攔截器?何時(shí)使用過(guò)濾器?
- 如果是非spring項(xiàng)目,那么攔截器不能用,只能使用過(guò)濾器。
- 如果是處理controller前后,既可以使用攔截器也可以使用過(guò)濾器。
- 如果是處理dispaterServlet前后,只能使用過(guò)濾器。
4.在action的生命周期中,攔截器可以多次被調(diào)用,而過(guò)濾器只能在容器初始化時(shí)被調(diào)用一次。
5.攔截器可以訪問(wèn)action上下文、值棧里的對(duì)象,而過(guò)濾器不能訪問(wèn)。
6.攔截器只能對(duì)action請(qǐng)求起作用,而過(guò)濾器則可以對(duì)幾乎所有的請(qǐng)求起作用。
7.攔截器可以獲取IOC容器中的各個(gè)bean,而過(guò)濾器就不行,在攔截器里注入一個(gè)service,可以調(diào)用業(yè)務(wù)邏輯。
SpringBoot使用過(guò)濾器
兩種方式:
1、使用spring boot提供的FilterRegistrationBean注冊(cè)Filter
2、使用原生servlet注解定義Filter
兩種方式的本質(zhì)都是一樣的,都是去FilterRegistrationBean注冊(cè)自定義Filter
封裝Filter
package com.theeternity.common.baseFilter; import javax.servlet.Filter; /** * @program: ApiBoot * @description: 封裝Filter * @author: TheEternity Zhang * @create: 2019-02-17 13:08 */ public interface MappingFilter extends Filter { String[] addUrlPatterns(); int order(); }
自定義Filter
package com.theeternity.beans.filterConfig; import com.theeternity.common.baseFilter.MappingFilter; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.*; import javax.servlet.FilterConfig; import java.io.IOException; /** * @program: ApiBoot * @description: 權(quán)限過(guò)濾器 * @author: TheEternity Zhang * @create: 2019-02-17 13:14 */ public class AuthFilter implements MappingFilter { @Override public String[] addUrlPatterns() { return new String[]{"/*"}; } @Override public int order() { return 0; } @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { filterChain.doFilter(servletRequest,servletResponse); } @Override public void destroy() { } }
注冊(cè)過(guò)濾器
package com.theeternity.beans.filterConfig; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @program: ApiBoot * @description: 注冊(cè)過(guò)濾器 * @author: TheEternity Zhang * @create: 2019-02-17 13:10 */ @Configuration public class FilterConfig { @Bean public FilterRegistrationBean registFilter() { FilterRegistrationBean registration = new FilterRegistrationBean(); AuthFilter authFilter=new AuthFilter(); registration.setFilter(authFilter); registration.addUrlPatterns(authFilter.addUrlPatterns()); registration.setOrder(authFilter.order()); registration.setName("AuthFilter"); return registration; } }
SpringBoot使用攔截器
封裝Interceptor
package com.theeternity.common.baseInterceptor; import org.springframework.web.servlet.HandlerInterceptor; /** * @program: ApiBoot * @description: 封裝Interceptor * @author: TheEternity Zhang * @create: 2019-02-15 17:49 */ public interface MappingInterceptor extends HandlerInterceptor { String[] addPathPatterns(); String[] excludePathPatterns(); int order(); }
自定義Interceptor
package com.theeternity.beans.interceptorConfig; import com.theeternity.common.baseInterceptor.MappingInterceptor; import org.springframework.stereotype.Component; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * @program: BoxApi * @description: 跨域攔截器 * @author: tonyzhang * @create: 2018-12-21 14:44 */ @Component public class CrossOriginInterceptor implements MappingInterceptor { @Override public String[] addPathPatterns() { return new String[]{"/**"}; } @Override public String[] excludePathPatterns() { return new String[0]; } @Override public int order() { return 0; } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { logger.info("允許的頭信息"+request.getHeader("Origin")); response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "*"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); //是否允許瀏覽器攜帶用戶身份信息(cookie) response.setHeader("Access-Control-Allow-Credentials","true"); 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 { } }
注冊(cè)Interceptor
package com.theeternity.beans.interceptorConfig; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** * @program: ApiBoot * @description: 攔截器注冊(cè) * @author: TheEternity Zhang * @create: 2019-02-15 17:55 */ @Configuration public class InterceptorConfig implements WebMvcConfigurer { @Autowired private CrossOriginInterceptor crossOriginInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(crossOriginInterceptor).addPathPatterns(crossOriginInterceptor.addPathPatterns()); } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot中使用Redis作為全局鎖示例過(guò)程
這篇文章主要為大家介紹了SpringBoot中使用Redis作為全局鎖示例過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03Java數(shù)據(jù)結(jié)構(gòu)之圖的兩種搜索算法詳解
在很多情況下,我們需要遍歷圖,得到圖的一些性質(zhì)。有關(guān)圖的搜索,最經(jīng)典的算法有深度優(yōu)先搜索和廣度優(yōu)先搜索,接下來(lái)我們分別講解這兩種搜索算法,需要的可以參考一下2022-11-11解決Mybatis映射文件mapper.xml中的注釋問(wèn)題
這篇文章主要介紹了解決Mybatis映射文件mapper.xml中的注釋問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。2022-01-01SpringBoot?Starter自定義全局加解密組件的詳細(xì)流程
SpringBoot?Starter作用將一組相關(guān)的依賴打包,簡(jiǎn)化項(xiàng)目的配置和初始化過(guò)程,通過(guò)特定的Starter開(kāi)發(fā)者可以快速的實(shí)現(xiàn)特定功能模塊的開(kāi)發(fā)和擴(kuò)展,本文給大家介紹了SpringBoot?Starter自定義全局加解密組件的詳細(xì)流程,需要的朋友可以參考下2024-02-02