最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解讀過(guò)濾器(Filter)和攔截器(Interceptor)的使用

 更新時(shí)間:2025年06月29日 14:15:21   作者:找不到、了  
這篇文章主要介紹了過(guò)濾器(Filter)和攔截器(Interceptor)的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

關(guān)于SpringMVC的完整執(zhí)行流程,可如下圖所示:

整體的流程如下所示:

Request請(qǐng)求-->filterInit--->dofilter--->dispatcherServlet---->InterceptorPrehandler--->Controller-------InterceptorPosthandler------>dispatcherServlet---InterceptorAftercomption-->filterDestroy。

關(guān)于過(guò)濾器和攔截器在web容器里面的先后順序,可參考如下所示:

下面重點(diǎn)介紹下兩者的區(qū)別和聯(lián)系。

1、定義介紹

1.1、過(guò)濾器Filter

1、定義

是 Servlet 規(guī)范規(guī)定的,在 Servlet 前執(zhí)行的,用于攔截和處理 HTTP 請(qǐng)求和響應(yīng)。攔截的是request請(qǐng)求,基于回調(diào),攔截的是地址,粒度很大。

2、方法

通過(guò)實(shí)現(xiàn)Filter接口,分別是初始化方法,dofilter方法和銷毀方法隨著容器的啟動(dòng)和銷毀而初始化和銷毀,依賴于servlet容器。

過(guò)濾器攔截的是地址欄請(qǐng)求,過(guò)濾器實(shí)在進(jìn)入容器后執(zhí)行的servlet之前后執(zhí)行,針對(duì)的在處理業(yè)務(wù)之前的操作。

chain.doFilter(request, response);這個(gè)方法的調(diào)用作為分水嶺。事實(shí)上調(diào)用Servlet的doService()方法是在這個(gè)方法中進(jìn)行的。

3、位置

位于整個(gè)請(qǐng)求處理流程的最前端,因此在請(qǐng)求到達(dá) Controller 層前,都會(huì)先被過(guò)濾器處理。可以攔截多個(gè)請(qǐng)求或響應(yīng),一個(gè)請(qǐng)求或響應(yīng)也可以被多個(gè)過(guò)濾器攔截

4、使用場(chǎng)景

可用于身份認(rèn)證、授權(quán)、日志記錄和設(shè)置字符集(CharacterEncodingFilter)等場(chǎng)景。

1.2、攔截器Interceptor

1、介紹

基于Java的jdk動(dòng)態(tài)代實(shí)現(xiàn)的,實(shí)現(xiàn)HandlerInterceptor接口,不依賴于servlet容器。

攔截器針對(duì)于controller方法,并且能獲取到所有的類,對(duì)類里面所有的方法實(shí)現(xiàn)攔截,粒度更小,攔截器中可以注入service,也可以調(diào)用業(yè)務(wù)邏輯

2、方法

實(shí)現(xiàn)HandlerInterceptor接口。重寫preHandle()、postHandle()、afterCompletion();

3、執(zhí)行順序

執(zhí)行結(jié)果如下:

/*
0:過(guò)濾器1的初始化方法
1:過(guò)濾器1,客戶端向Servlet發(fā)送的請(qǐng)求被我攔截到了
2:攔截器1的前置方法 preHandle
3:攔截器2的前置方法 preHandle
4: controller主方法
5:攔截器2的后置方法postHandle(在controller主方法執(zhí)行之后執(zhí)行)
6:攔截器1的后置方法postHandle(在controller主方法執(zhí)行之后執(zhí)行)
7:攔截器2的完成后方法afterCompletion(在DispatcherServlet處理完請(qǐng)求后,才會(huì)執(zhí)行)
8:攔截器1的完成后方法afterCompletion(在DispatcherServlet處理完請(qǐng)求后,才會(huì)執(zhí)行)
9:過(guò)濾器1,Servlet向客戶端發(fā)送的響應(yīng)被我攔截到了
10:過(guò)濾器的銷毀方法
*/

2、實(shí)現(xiàn)方式

2.1、過(guò)濾器實(shí)現(xiàn)方式

1、通過(guò)@WebFilter注解(Servlet 3.0+)

@WebFilter(urlPatterns = "/*", filterName = "myFilter")
public class MyFilter implements Filter {
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化代碼
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, 
                         FilterChain chain) throws IOException, ServletException {
        // 前置處理
        System.out.println("Before Filter");
        
        // 執(zhí)行后續(xù)過(guò)濾器或Servlet
        chain.doFilter(request, response);
        
        // 后置處理
        System.out.println("After Filter");
    }

    @Override
    public void destroy() {
        // 銷毀代碼
    }
}

2、xml配置:

<filter>
      <filter-name>filterDemo1</filter-name>
      <filter-class>com.thit.filters.Filter1</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>filterDemo1</filter-name>
      <url-pattern>/*</url-pattern>
      <!-- /*是對(duì)所有的文件進(jìn)行攔截 -->
  </filter-mapping>

多個(gè)Filter的執(zhí)行順序:

  • 注解方式:按類名字母順序執(zhí)行
  • web.xml方式:<filter-mapping>定義的順序執(zhí)行

2.2、攔截器實(shí)現(xiàn)方式

1:實(shí)現(xiàn)WebMvcConfigurer接口(Spring 5+推薦)

//攔截器1
public class LoginInterceptor implements HandlerInterceptor{
	
 
	//預(yù)處理1.程序先執(zhí)行preHandle()方法,如果該方法的返回值為true,則程序會(huì)繼續(xù)向下執(zhí)行處理器中的方法,否則將不再向下執(zhí)行。
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		// TODO Auto-generated method stub
		System.out.println("1:攔截器1,程序進(jìn)入preHandle方法");
		User u=(User) request.getSession().getAttribute("user");
		if(u==null) {
			System.out.println("在進(jìn)入方法之前判斷session的用戶是否為空!");
			System.out.println("地址:"+request.getContextPath());
			//http://localhost:8080/login
			response.sendRedirect(request.getContextPath()+"/login");
			return false;
		}
 
		return true;
	}
	//后處理 	2.在業(yè)務(wù)處理器(即控制器Controller類)處理完請(qǐng)求后,會(huì)執(zhí)行postHandle()方法,然后會(huì)通過(guò)DispatcherServlet向客戶端返回響應(yīng)。
 
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("2:攔截器1,程序進(jìn)入postHandle方法");
		
	}
	//完工之后 	3.在DispatcherServlet處理完請(qǐng)求后,才會(huì)執(zhí)行afterCompletion()方法。
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		// TODO Auto-generated method stub
		System.out.println("3:攔截器1,程序進(jìn)入afterCompletion方法");
		
	}
 
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
                .addPathPatterns("/**")  // 攔截所有路徑
                .excludePathPatterns("/login"); // 排除登錄路徑
        
        // 可以添加多個(gè)攔截器
        registry.addInterceptor(new AnotherInterceptor())
                .addPathPatterns("/admin/**");
    }
}

2:XML配置

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <mvc:exclude-mapping path="/login"/>
        <bean class="com.example.MyInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

3、兩者聯(lián)系與區(qū)別

3.1、聯(lián)系

3.2、區(qū)別

4、總結(jié)

兩者都是AOP編程思想的實(shí)現(xiàn),都能夠?qū)崿F(xiàn)權(quán)限控制和日志記錄等問(wèn)題的處理,但是兩者粒度不同攔截對(duì)象不一樣。

  • 1、適用范圍不同

Filter是servlet的規(guī)范,只能用于web程序,但是攔截器可以用于application等程序。

  • 2、規(guī)范不同:

Filter是servlet的規(guī)范。但是Interceptor是Spring容器支撐,有Spring框架支持。

  • 3、使用資源不一樣:

Spring的攔截器由于依賴Spring,也是Spring的一個(gè)組件,因此能夠在攔截器中使用Spring的任何資源和對(duì)象。

例如Service對(duì)象,數(shù)據(jù)源,事務(wù)管理等,通過(guò)ioc注入攔截器即可,而filter不能.

  • 4、粒度不同:

Filter只能在servlet的前后起作用,而攔截器能在方法前后異常前后執(zhí)行,更加靈活,粒度更小,Spring框架程序優(yōu)先使用攔截器。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java初學(xué)者常問(wèn)的問(wèn)題(推薦)

    Java初學(xué)者常問(wèn)的問(wèn)題(推薦)

    本文介紹一些Java初學(xué)者常問(wèn)的問(wèn)題,很多朋友對(duì)可以用%除以一個(gè)小數(shù)嗎? a += b 和 a = a + b 的效果有區(qū)別嗎? 聲明一個(gè)數(shù)組為什么需要花費(fèi)大量時(shí)間? 為什么Java庫(kù)不用隨機(jī)pivot方式的快速排序?等等一系列問(wèn)題有疑惑,下面就通過(guò)本文給大家詳細(xì)介紹下
    2017-03-03
  • Java中守護(hù)線程介紹及使用

    Java中守護(hù)線程介紹及使用

    大家好,本篇文章主要講的是Java中守護(hù)線程介紹及使用,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • spring cloud學(xué)習(xí)教程之config修改配置詳解

    spring cloud學(xué)習(xí)教程之config修改配置詳解

    這篇文章主要給大家介紹了關(guān)于spring cloud學(xué)習(xí)教程之config修改配置的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • java方法重載示例

    java方法重載示例

    方法重載是以統(tǒng)一的方式處理不同數(shù)據(jù)類型的一種手段,這篇文章主要介紹了java方法重載示例,需要的朋友可以參考下
    2014-03-03
  • springboot后端解決跨域問(wèn)題

    springboot后端解決跨域問(wèn)題

    今天小編就為大家分享一篇關(guān)于springboot后端解決跨域問(wèn)題,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • java微信開發(fā)API第二步 獲取和回復(fù)消息

    java微信開發(fā)API第二步 獲取和回復(fù)消息

    這篇文章主要為大家詳細(xì)介紹了java微信開發(fā)API第二步,獲取消息和回復(fù)消息,感興趣的小伙伴們可以參考一下
    2016-06-06
  • 解決IDEA報(bào)錯(cuò):編碼GBK的不可映射字符問(wèn)題

    解決IDEA報(bào)錯(cuò):編碼GBK的不可映射字符問(wèn)題

    這篇文章主要介紹了解決IDEA報(bào)錯(cuò):編碼GBK的不可映射字符問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 深入理解IOC與DI:Spring容器初始化與依賴注入解析

    深入理解IOC與DI:Spring容器初始化與依賴注入解析

    文章主要介紹了Spring框架中的IOC(控制反轉(zhuǎn))和DI(依賴注入)機(jī)制,詳細(xì)講述了它們的基本概念、工作原理以及在Spring框架中的應(yīng)用,通過(guò)理解IOC和DI,開發(fā)者可以更好地管理對(duì)象的創(chuàng)建和依賴關(guān)系,提高系統(tǒng)的靈活性和可維護(hù)性,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • Java快速開發(fā)平臺(tái)若依、芋道、Jeesite、JeecgBoot詳細(xì)對(duì)比

    Java快速開發(fā)平臺(tái)若依、芋道、Jeesite、JeecgBoot詳細(xì)對(duì)比

    Java快速開發(fā)平臺(tái)是現(xiàn)代企業(yè)級(jí)Java應(yīng)用研發(fā)過(guò)程中提升效率、降低重復(fù)勞動(dòng)、加速交付周期的關(guān)鍵技術(shù)支撐體系,這篇文章主要介紹了Java快速開發(fā)平臺(tái)若依、芋道、Jeesite、JeecgBoot詳細(xì)對(duì)比的相關(guān)資料,需要的朋友可以參考下
    2026-05-05
  • 復(fù)雜JSON字符串轉(zhuǎn)換為Java嵌套對(duì)象的實(shí)現(xiàn)

    復(fù)雜JSON字符串轉(zhuǎn)換為Java嵌套對(duì)象的實(shí)現(xiàn)

    這篇文章主要介紹了復(fù)雜JSON字符串轉(zhuǎn)換為Java嵌套對(duì)象的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評(píng)論

赤峰市| 额尔古纳市| 白沙| 庆安县| 渭源县| 湘潭县| 黄大仙区| 南昌市| 大竹县| 邓州市| 大余县| 德阳市| 富裕县| 会昌县| 平邑县| 宜川县| 安乡县| 社旗县| 密山市| 多伦县| 库车县| 新丰县| 北海市| 丘北县| 丁青县| 万宁市| 天镇县| 武清区| 牟定县| 凤庆县| 陵川县| 新营市| 建平县| 望奎县| 蓬安县| 那坡县| 页游| 石林| 宜阳县| 秀山| 利辛县|