国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

過濾器和攔截器的辨析

這篇具有很好參考價(jià)值的文章主要介紹了過濾器和攔截器的辨析。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

過濾器和攔截器的辨析

介紹

過濾器和攔截器都是為了在請求到達(dá)目標(biāo)處理器(Servlet或Controller)之前或者之后插入自定義的處理邏輯

  • 過濾器:

遵循AOP(面向切面編程)思想實(shí)現(xiàn),基于Servlet規(guī)范提供的Filter接口,它是位于客戶端請求與服務(wù)器響應(yīng)之間的一個組件,依賴于Servlet容器。當(dāng)請求到達(dá)服務(wù)器時,過濾器會在請求進(jìn)入實(shí)際目標(biāo)資源(如Servlet、JSP頁面)之前或之后執(zhí)行特定的操作,原理是基于函數(shù)回調(diào)

  • 攔截器

遵循AOP(面向切面編程)思想實(shí)現(xiàn),如Spring MVC中的HandlerInterceptor接口,它不依賴于Servlet容器的具體實(shí)現(xiàn),而是由應(yīng)用框架管理。攔截器是在請求進(jìn)入到控制器層(Controller)方法前后執(zhí)行自定義邏輯

原理解析

過濾器

為什么說過濾器基于函數(shù)回調(diào)?

過濾器基于函數(shù)回調(diào),所謂函數(shù)回調(diào)/回調(diào)函數(shù)指的是:一個函數(shù)(稱為回調(diào)函數(shù))作為參數(shù)傳遞給另一個函數(shù)(稱為調(diào)用函數(shù)),當(dāng)滿足一定條件或者在某個特定時刻,調(diào)用函數(shù)會調(diào)用傳遞過來的回調(diào)函數(shù)

由于Java中不直接支持函數(shù)指針,所以常常通過接口來實(shí)現(xiàn)回調(diào)機(jī)制

FilterChain就是一個接口

public interface FilterChain {

    public void doFilter(ServletRequest request, ServletResponse response)
            throws IOException, ServletException;

}

Filter的實(shí)現(xiàn)類中doFilter()方法中FilterChain作為參數(shù)被傳進(jìn)來,并且在合適的時機(jī)被回調(diào)了其doFilter方法

public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.info("hello");
        chain.doFilter(request,response);
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

攔截器

攔截器基于AOP(面向切面編程)思想實(shí)現(xiàn),但是并不一定用到動態(tài)代理或者切面,切點(diǎn)之類的技術(shù),以如Spring MVC中的HandlerInterceptor接口為例,從源碼看更像是直接將攔截器注入,形成了一個攔截器鏈,在controller層面上進(jìn)行代碼織入

DispatcherServlet作為SpringMVC框架的核心類,http請求的核心執(zhí)行方法為doService(),再進(jìn)入doDispatch()方法

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
		HttpServletRequest processedRequest = request;
        /**
         * 1.
         * HandlerExecutionChain 是一個對象
         * 包含了以下重要的屬性
         * private final Object handler; //處理器(controller和其最后的方法)
         * List<HandlerInterceptor> interceptorList = new ArrayList<>();//攔截器列表,用來存儲匹配處理器的攔截器
         */
		HandlerExecutionChain mappedHandler = null;
		boolean multipartRequestParsed = false;

		WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);

		try {
			ModelAndView mv = null;
			Exception dispatchException = null;

			try {
				processedRequest = checkMultipart(request);
				multipartRequestParsed = (processedRequest != request);

                /**
                 * 2.
                 * 下面這行代碼 大概做了以下事情
                 * 1.通過request和url 匹配了對應(yīng)的controller以及調(diào)用的方法 填充了HandlerExecutionChain.handler
                 * 2.通過匹配request和HandlerInterceptor的注冊信息(攔截哪些,放行哪些),往HandlerExecutionChain.interceptorList中添加對應(yīng)的攔截器
                 */
				mappedHandler = getHandler(processedRequest);
				if (mappedHandler == null) {
					noHandlerFound(processedRequest, response);
					return;
				}

				// Determine handler adapter for the current request.
				HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

				// Process last-modified header, if supported by the handler.
				String method = request.getMethod();
				boolean isGet = HttpMethod.GET.matches(method);
				if (isGet || HttpMethod.HEAD.matches(method)) {
					long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
					if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
						return;
					}
				}
                /**
                 * 3.執(zhí)行 攔截器鏈條中的所有前置方法
                 */
				if (!mappedHandler.applyPreHandle(processedRequest, response)) {
					return;
				}

                /**
                 * 4.交由處理器(controller對應(yīng)的方法)去處理方法中的業(yè)務(wù)邏輯
                 */
				mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

				if (asyncManager.isConcurrentHandlingStarted()) {
					return;
				}

				applyDefaultViewName(processedRequest, mv);
                
                /**
                 * 5.倒序執(zhí)行 攔截器鏈條中的所有后置方法
                 */
				mappedHandler.applyPostHandle(processedRequest, response, mv);
			}}
        //...

流程解析

由于Filter依賴于Servlet容器所以不同的容器Filter,FilterChain的實(shí)現(xiàn)類存在差異,這里以Tomcat為例分析

1.向后臺發(fā)起一次請求

2.接待線程接收到,將任務(wù)轉(zhuǎn)交給工作線程

3.判斷協(xié)議,封裝必要對象

4.將request,response一路轉(zhuǎn)交至StandardWrapperValve.invoke(Request request, Response response)

5.創(chuàng)建過濾鏈ApplicationFilterFactory.createFilterChain(request, wrapper, servlet);

? 5.1從上下文中獲取注冊好的過濾器

? 5.2遍歷過濾器,匹配URL,Servlet等,將匹配好的過濾器加入到過濾器鏈

6.依次回調(diào)FilterChain的doFilter方法filterChain.doFilter(request.getRequest(),response.getResponse());

7.將所有過濾器的前置代碼執(zhí)行完畢,進(jìn)入servlet,servlet.service(request, response);

8.進(jìn)入DispatcherServlet統(tǒng)一調(diào)度

9.調(diào)用攔截器前置方法

10.進(jìn)入controller中的對應(yīng)方法,執(zhí)行具體的業(yè)務(wù)邏輯

11.調(diào)用攔截器后置(數(shù)組倒序執(zhí)行)

12.將所有過濾器的后置代碼執(zhí)行完畢(方法棧,先進(jìn)后出)

13.將結(jié)果返回給請求者

注意,過濾器和攔截器實(shí)現(xiàn)先進(jìn)后出的實(shí)現(xiàn)方式是不同的,過濾器基于函數(shù)回調(diào),方法棧結(jié)構(gòu)天生支持先進(jìn)后出;攔截器則是直接使用循環(huán)倒序遍歷

總結(jié)

同:

  • 過濾器和攔截器都遵循面向切面編程的思想(AOP),實(shí)現(xiàn)了在請求到達(dá)目標(biāo)處理器(Servlet/Controller)之前或者之后插入自定義的處理邏輯

異:

  • 使用范圍不同

    過濾器實(shí)現(xiàn)的是javax.servlet.Filter該接口在Servlet規(guī)范中定義,依賴WEB容器

    攔截器是一個Spring組件,由Spring管理,并不依賴Tomcat容器,可以單獨(dú)使用(Application,Swing)

  • 使用的場景不同

    攔截器更加接近業(yè)務(wù)系統(tǒng),所以攔截器更適用于處理統(tǒng)一的業(yè)務(wù)邏輯,比如權(quán)限判斷等

    過濾器通常用來實(shí)現(xiàn)通用功能,比如xss過濾,敏感詞,處理跨域等等

  • 觸發(fā)的時機(jī)不同

    過濾器的觸發(fā)時機(jī)早于攔截器

  • 底層實(shí)現(xiàn)細(xì)節(jié)不同

    過濾器實(shí)現(xiàn)先進(jìn)后出基于方法棧的數(shù)據(jù)結(jié)構(gòu)

    攔截器實(shí)現(xiàn)先進(jìn)后出基于循環(huán)倒序遍歷文章來源地址http://www.zghlxwxcb.cn/news/detail-838494.html

到了這里,關(guān)于過濾器和攔截器的辨析的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 過濾器,監(jiān)聽器與攔截器的區(qū)別

    過濾器,監(jiān)聽器與攔截器的區(qū)別

    ? 過濾器和監(jiān)聽器不是Spring MVC中的組件,而是Servlet的組件,由Servlet容器來管理。攔截器是Spring MVC中的組件,由Spring容器來管理 ? Servlet過濾器與Spring MVC 攔截器在Web應(yīng)用中所處的層次如下圖所示: 過濾器是Servlet的高級特性之一,是實(shí)現(xiàn)Filter接口的Java類。其基本功能就是對

    2024年02月14日
    瀏覽(53)
  • spring boot 過濾器&攔截器與aop

    spring boot 過濾器&攔截器與aop

    在使用 Spring 框架時,可以通過在 web.xml 配置文件中注冊過濾器,使其在請求進(jìn)入 Spring 前就能夠進(jìn)行預(yù)處理。這樣可以在請求進(jìn)入 Spring MVC 的 DispatcherServlet 之前,對請求進(jìn)行攔截、修改或者過濾。 過濾器在 Spring 中的應(yīng)用場景包括但不限于: 字符編碼過濾:通過過濾器,在

    2024年02月01日
    瀏覽(23)
  • 登錄頁面jwt密鑰,過濾器,攔截器,異常處理

    需求: 用戶未登錄時,訪問其他也沒面,操作添加、刪除等操作時,強(qiáng)行跳轉(zhuǎn)至登錄頁面。 實(shí)現(xiàn)方法: 1.使用Cookie,登錄后后端添加一個cookie,每次頁面判斷是否有cookie, 2。使用session,原理同上,只不過session是存儲在服務(wù)器里的,cookie是在瀏覽器里。 3。使用jwt令牌,登

    2023年04月25日
    瀏覽(26)
  • Springboot中使用攔截器、過濾器、監(jiān)聽器

    Springboot中使用攔截器、過濾器、監(jiān)聽器

    Javaweb三大組件:servlet、Filter(過濾器)、?Listener(監(jiān)聽器) SpringBoot特有組件:Interceptor(攔截器) 過濾器、攔截器、監(jiān)聽器、AOP(后續(xù)文章介紹)、全局異常處理器(后續(xù)文章介紹)是搭建系統(tǒng)框架時,經(jīng)常用到的部分,全局異常處理器的作用很明顯,就是處理接口執(zhí)行

    2024年02月03日
    瀏覽(26)
  • Spring Boot攔截器與過濾器的區(qū)別

    Spring Boot攔截器與過濾器的區(qū)別

    在使用Spring Boot開發(fā)Web應(yīng)用程序時,您可能需要在處理請求之前或之后執(zhí)行某些操作。這些操作可以包括身份驗(yàn)證、日志記錄、性能監(jiān)測等。在這種情況下,您可以使用兩種不同的機(jī)制:攔截器和過濾器。本文將介紹這兩種機(jī)制及其區(qū)別,并提供一些示例代碼來演示如何在S

    2024年02月08日
    瀏覽(24)
  • springbboot攔截器,過濾器,監(jiān)聽器及執(zhí)行流程

    springbboot攔截器,過濾器,監(jiān)聽器及執(zhí)行流程

    過濾器是在請求進(jìn)入容器后,但請求進(jìn)入servlet之前進(jìn)行預(yù)處理的。請求結(jié)束返回也是,是在servlet處理完后,返回給前端之前 請求按照上圖進(jìn)入conteoller后執(zhí)行完再返回 過濾器是Servlet規(guī)范中定義的一種組件,可以用于在請求進(jìn)入Web應(yīng)用程序之前或響應(yīng)離開Web應(yīng)用程序之前對請

    2024年02月13日
    瀏覽(20)
  • 過濾器(Filter)和攔截器(Interceptor)有什么不同?

    過濾器(Filter)和攔截器(Interceptor)有什么不同?

    過濾器(Filter)和攔截器(Interceptor)是用于處理請求和響應(yīng)的中間件組件,但它們在實(shí)現(xiàn)方式和應(yīng)用場景上有一些不同。 過濾器 是Servlet規(guī)范中定義的一種組件,通常以Java類的形式實(shí)現(xiàn)。過濾器通過在 web.xml 配置文件中聲明來注冊,并在Web應(yīng)用程序的請求和響應(yīng)鏈中攔截請

    2024年02月07日
    瀏覽(24)
  • SpringBoot2.0(過濾器,監(jiān)聽器,攔截器)

    SpringBoot2.0(過濾器,監(jiān)聽器,攔截器)

    使用Servlet3.0的注解進(jìn)行配置 啟動類里面增加 @ServletComponentScan ,進(jìn)行掃描 新建一個Filter類,implements Filter ,并實(shí)現(xiàn)對應(yīng)接口 @WebFilter 標(biāo)記一個類為Filter,被spring進(jìn)行掃描 urlPatterns:攔截規(guī)則,支持正則 控制chain.doFilter的方法的調(diào)用,來實(shí)現(xiàn)是否通過放行, 不放行的話,web應(yīng)用

    2024年02月07日
    瀏覽(21)
  • 75.SpringMVC的攔截器和過濾器有什么區(qū)別?執(zhí)行順序?

    75.SpringMVC的攔截器和過濾器有什么區(qū)別?執(zhí)行順序?

    攔截器不依賴與servlet容器,過濾器依賴與servlet容器。 攔截器只能對action請求(DispatcherServlet 映射的請求)起作用,而過濾器則可以對幾乎所有的請求起作用。 攔截器可以訪問容器中的Bean(DI),而過濾器不能訪問(基于spring注冊的過濾器也可以訪問容器中的bean)。 過濾器 和 攔

    2024年02月22日
    瀏覽(26)
  • SpringBoot 統(tǒng)計(jì)API接口用時該使用過濾器還是攔截器?

    SpringBoot 統(tǒng)計(jì)API接口用時該使用過濾器還是攔截器?

    統(tǒng)計(jì)請求的處理時間(用時)既可以使用 Servlet 過濾器(Filter) ,也可以使用 Spring 攔截器(Interceptor) 。兩者都可以在請求處理前后插入自定義邏輯,從而實(shí)現(xiàn)對請求響應(yīng)時間的統(tǒng)計(jì)。 如果你需要在更底層、與框架無關(guān)的地方記錄所有請求(包括靜態(tài)資源請求)的處理時間

    2024年01月18日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包