java 攔截器和過濾器的區(qū)別

一、攔截器和過濾器的區(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末笔诵,一起剝皮案震驚了整個濱河市返吻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乎婿,老刑警劉巖测僵,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異谢翎,居然都是意外死亡捍靠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門森逮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來榨婆,“玉大人,你說我怎么就攤上這事褒侧×挤纾” “怎么了谊迄?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長烟央。 經(jīng)常有香客問我统诺,道長,這世上最難降的妖魔是什么吊档? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任篙议,我火速辦了婚禮,結(jié)果婚禮上怠硼,老公的妹妹穿的比我還像新娘鬼贱。我一直安慰自己,他們只是感情好香璃,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布这难。 她就那樣靜靜地躺著,像睡著了一般葡秒。 火紅的嫁衣襯著肌膚如雪姻乓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天眯牧,我揣著相機(jī)與錄音蹋岩,去河邊找鬼。 笑死学少,一個胖子當(dāng)著我的面吹牛剪个,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播版确,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼扣囊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了绒疗?” 一聲冷哼從身側(cè)響起侵歇,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吓蘑,沒想到半個月后惕虑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡磨镶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年溃蔫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棋嘲。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡酒唉,死狀恐怖矩桂,靈堂內(nèi)的尸體忽然破棺而出沸移,到底是詐尸還是另有隱情痪伦,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布雹锣,位于F島的核電站网沾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蕊爵。R本人自食惡果不足惜辉哥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望攒射。 院中可真熱鬧醋旦,春花似錦、人聲如沸会放。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咧最。三九已至捂人,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間矢沿,已是汗流浹背滥搭。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捣鲸,地道東北人瑟匆。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像摄狱,于是被迫代替她去往敵國和親脓诡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容