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

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

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

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

整體的流程如下所示:

Request請求-->filterInit--->dofilter--->dispatcherServlet---->InterceptorPrehandler--->Controller-------InterceptorPosthandler------>dispatcherServlet---InterceptorAftercomption-->filterDestroy

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

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

1、定義介紹

1.1、過濾器Filter

1、定義

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

2、方法

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

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

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

3、位置

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

4、使用場景

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

1.2、攔截器Interceptor

1、介紹

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

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

2、方法

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

3、執(zhí)行順序

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

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

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

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

1、通過@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ù)過濾器或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>
      <!-- /*是對所有的文件進(jìn)行攔截 -->
  </filter-mapping>

多個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,則程序會繼續(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類)處理完請求后,會執(zhí)行postHandle()方法,然后會通過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處理完請求后,才會執(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"); // 排除登錄路徑
        
        // 可以添加多個攔截器
        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)限控制和日志記錄等問題的處理,但是兩者粒度不同攔截對象不一樣。

  • 1、適用范圍不同

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

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

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

  • 3、使用資源不一樣:

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

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

  • 4、粒度不同:

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

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

相關(guān)文章

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

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

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

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

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

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

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

    java方法重載示例

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

    springboot后端解決跨域問題

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

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

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

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

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

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

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

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

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

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

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

最新評論

浠水县| 丹东市| 高要市| 荔波县| 迁西县| 洛浦县| 察隅县| 罗山县| 河间市| 龙海市| 无棣县| 乌苏市| 扶沟县| 英德市| 新疆| 桃园县| 随州市| 马公市| 孙吴县| 荆州市| 梁平县| 乌恰县| 柳林县| 双江| 汝城县| 孝感市| 集安市| 黄陵县| 龙胜| 桂平市| 阿尔山市| 毕节市| 靖宇县| 从江县| 临高县| 普定县| 青阳县| 承德市| 广东省| 周至县| 连平县|