日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

netty springmvc_springmvc源码架构解析之HandlerMapping

發(fā)布時間:2023/12/4 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 netty springmvc_springmvc源码架构解析之HandlerMapping 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

說在前面

前期回顧

sharding-jdbc源碼解析?更新完畢

spring源碼解析 更新完畢

spring-mvc源碼解析 更新完畢

spring-tx源碼解析 更新完畢

spring-boot源碼解析 更新完畢

rocketmq源碼解析 更新完畢

dubbbo源碼解析 更新完畢

netty源碼解析 更新完畢

spring源碼架構更新完畢

springmvc源碼架構更新中

springboot源碼架構計劃中

github https://github.com/tianheframe

sharding-jdbc源碼解析 更新完畢

rocketmq源碼解析?更新完畢

seata 源碼解析 更新完畢

dubbo 源碼解析 更新完畢

netty 源碼解析 更新完畢

源碼解析

org.springframework.web.servlet.HandlerInterceptor 公共接口HandlerInterceptor,工作流接口,允許定制處理程序執(zhí)行鏈。應用程序可以為特定的處理程序組注冊任意數(shù)量的現(xiàn)有或自定義攔截器,以添加公共預處理行為,而不需要修改每個處理程序實現(xiàn)。在適當?shù)腍andlerAdapter觸發(fā)處理程序本身的執(zhí)行之前,將調用HandlerInterceptor。此機制可用于大量的預處理方面,例如用于授權檢查,或用于語言環(huán)境或主題更改等公共處理程序行為。它的主要目的是允許分解出重復的處理程序代碼。在異步處理場景中,當主線程退出而不呈現(xiàn)或調用postHandle和afterCompletion回調時,處理程序可能在單獨的線程中執(zhí)行。當并發(fā)處理程序執(zhí)行完成時,請求被發(fā)送回去,以便繼續(xù)呈現(xiàn)模型,并再次調用此契約的所有方法。

通常,攔截器鏈是為每個HandlerMapping bean定義的,共享其粒度。為了能夠將某個攔截器鏈應用于一組處理程序,需要通過一個HandlerMapping bean映射所需的處理程序。攔截器本身在應用程序上下文中定義為bean,由映射bean定義通過其“攔截器”屬性引用(在XML中:的)。HandlerInterceptor基本上類似于Servlet過濾器,但與后者相比,它只允許自定義預處理(帶有禁止處理程序本身執(zhí)行的選項)和自定義后處理。過濾器更強大,例如,它們允許交換傳遞到鏈中的請求和響應對象。請注意,過濾器是在web中配置的。應用程序上下文中的HandlerInterceptor。作為基本的指導原則,細粒度處理程序相關的預處理任務是HandlerInterceptor實現(xiàn)的候選任務,特別是分解出來的公共處理程序代碼和授權檢查。另一方面,篩選器非常適合于請求內容和視圖內容處理,比如多部分表單和GZIP壓縮。這通常顯示當需要將篩選器映射到特定的內容類型(例如圖像)或所有請求時。

boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;

攔截處理程序的執(zhí)行。在HandlerMapping確定適當?shù)奶幚沓绦驅ο笾笳{用,但在HandlerAdapter調用處理程序之前調用。DispatcherServlet在執(zhí)行鏈中處理一個處理程序,該處理程序由任意數(shù)量的攔截器組成,處理程序本身位于執(zhí)行鏈的末端。使用此方法,每個攔截器可以決定中止執(zhí)行鏈,通常是發(fā)送HTTP錯誤或編寫自定義響應。

void postHandle( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception;

攔截處理程序的執(zhí)行。在HandlerAdapter實際調用處理程序之后調用,但在DispatcherServlet呈現(xiàn)視圖之前調用。可以通過給定的ModelAndView向視圖公開其他模型對象。DispatcherServlet在執(zhí)行鏈中處理一個處理程序,該處理程序由任意數(shù)量的攔截器組成,處理程序本身位于執(zhí)行鏈的末端。通過這種方法,每個攔截器可以對一個執(zhí)行進行后處理,以執(zhí)行鏈的相反順序應用。

void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;

請求處理完成后的回調,即呈現(xiàn)視圖后的回調。將在處理程序執(zhí)行的任何結果上調用,從而允許適當?shù)馁Y源清理。注意:只有當這個攔截器的preHandle方法成功完成并返回true時才會被調用!與postHandle方法一樣,該方法將在鏈中的每個攔截器上以相反的順序調用,因此第一個攔截器將是最后一個被調用的攔截器。

org.springframework.web.servlet.AsyncHandlerInterceptor 使用在異步請求處理啟動后調用的回調方法擴展HandlerInterceptor。當一個處理程序啟動一個異步請求時,DispatcherServlet在沒有調用postHandle和afterCompletion的情況下退出,就像它通常對同步請求所做的那樣,因為請求處理的結果(例如ModelAndView)可能還沒有準備好,并且將從另一個線程并發(fā)生成。在這樣的場景中,會調用afterConcurrentHandlingStarted,從而允許實現(xiàn)在將線程釋放到Servlet容器之前執(zhí)行清理線程綁定屬性等任務。當異步處理完成時,請求被分派到容器進行進一步處理。在這個階段,DispatcherServlet調用預句柄、postHandle和afterCompletion。為了區(qū)分初始請求和異步處理完成后的后續(xù)分派,攔截器可以檢查javax.servlet。DispatcherType javax.servlet。ServletRequest是“REQUEST”或“ASYNC”。注意,當異步請求超時或出現(xiàn)網(wǎng)絡錯誤時,HandlerInterceptor實現(xiàn)可能需要執(zhí)行工作。對于這種情況,Servlet容器不會分派,因此不會調用postHandle和afterCompletion方法。相反,攔截器可以注冊以通過WebAsyncManager上的registerCallbackInterceptor和registerDeferredResultInterceptor方法跟蹤異步請求。無論異步請求處理是否啟動,都可以對來自preHandle的每個請求主動執(zhí)行此操作。

void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;

調用,而不是postHandle和afterCompletion,此時a處理程序正在并發(fā)執(zhí)行。實現(xiàn)可以使用提供的請求和響應,但是應該避免以與處理程序的并發(fā)執(zhí)行沖突的方式修改它們。這種方法的典型用法是清除線程局部變量。

org.springframework.web.servlet.handler.HandlerInterceptorAdapter AsyncHandlerInterceptor接口的抽象適配器類,用于簡化僅前/僅后攔截器的實現(xiàn)。

@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 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 { }@Override public void afterConcurrentHandlingStarted( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { }

org.springframework.web.servlet.handler.ConversionServiceExposingInterceptor 攔截器,它將配置的ConversionService放在請求范圍中,以便在請求處理期間可用。請求屬性名為“org.springframe .core.convert”。, ConversionService.class. getname()的值。

private final ConversionService conversionService;

conversionService

@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException { request.setAttribute(ConversionService.class.getName(), this.conversionService); return true; }

org.springframework.web.servlet.resource.ResourceUrlProviderExposingInterceptor 將ResourceUrlProvider實例公開為請求屬性的攔截器。

@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { request.setAttribute(RESOURCE_URL_PROVIDER_ATTR, this.resourceUrlProvider); return true; }

org.springframework.web.servlet.handler.WebRequestHandlerInterceptorAdapter 實現(xiàn)Servlet HandlerInterceptor接口并包裝底層WebRequestInterceptor的適配器。

private final WebRequestInterceptor requestInterceptor;

requestInterceptor

@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { this.requestInterceptor.preHandle(new DispatcherServletWebRequest(request, response)); return true; }@Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { this.requestInterceptor.postHandle(new DispatcherServletWebRequest(request, response), (modelAndView != null && !modelAndView.wasCleared() ? modelAndView.getModelMap() : null)); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { this.requestInterceptor.afterCompletion(new DispatcherServletWebRequest(request, response), ex); }@Override public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) { if (this.requestInterceptor instanceof AsyncWebRequestInterceptor) { AsyncWebRequestInterceptor asyncInterceptor = (AsyncWebRequestInterceptor) this.requestInterceptor; DispatcherServletWebRequest webRequest = new DispatcherServletWebRequest(request, response); asyncInterceptor.afterConcurrentHandlingStarted(webRequest); } }

org.springframework.web.servlet.handler.MappedInterceptor 包含和委托對HandlerInterceptor的調用,以及攔截器應該應用的include(和可選排除)路徑模式。還提供匹配邏輯來測試攔截器是否應用于給定的請求路徑。MappedInterceptor可以直接注冊到任何AbstractHandlerMethodMapping中。此外,通過AbstractHandlerMethodMapping(包括祖先ApplicationContext的)自動檢測MappedInterceptor類型的bean,這實際上意味著攔截器在所有處理程序映射中都是“全局”注冊的。

private final String[] includePatterns;

includePatterns

private final String[] excludePatterns;

excludePatterns

private final HandlerInterceptor interceptor;

interceptor,這里是適配器模式實現(xiàn)

@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return this.interceptor.preHandle(request, response, handler); }@Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { this.interceptor.postHandle(request, response, handler, modelAndView); }@Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { this.interceptor.afterCompletion(request, response, handler, ex); }

org.springframework.web.servlet.mvc.WebContentInterceptor 檢查請求并準備響應的處理程序攔截器。檢查支持的方法和所需的會話,并應用指定的CacheControl構建器。攔截器支持的所有設置也可以在AbstractController上設置。這個攔截器主要用于對HandlerMapping映射的一組控制器應用檢查和準備。

@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException {// 校驗方法是否合法 checkRequest(request); String lookupPath = this.urlPathHelper.getLookupPathForRequest(request); if (logger.isDebugEnabled()) { logger.debug("Looking up cache seconds for [" + lookupPath + "]"); } CacheControl cacheControl = lookupCacheControl(lookupPath); Integer cacheSeconds = lookupCacheSeconds(lookupPath); if (cacheControl != null) { if (logger.isDebugEnabled()) { logger.debug("Applying CacheControl to [" + lookupPath + "]"); } applyCacheControl(response, cacheControl); } else if (cacheSeconds != null) { if (logger.isDebugEnabled()) { logger.debug("Applying CacheControl to [" + lookupPath + "]"); } applyCacheSeconds(response, cacheSeconds); } else { if (logger.isDebugEnabled()) { logger.debug("Applying default cache seconds to [" + lookupPath + "]"); } prepareResponse(response); } 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 { }

說在最后

本次解析僅代表個人觀點,僅供參考。

掃碼進入技術微信群

釘釘技術群

qq技術群

總結

以上是生活随笔為你收集整理的netty springmvc_springmvc源码架构解析之HandlerMapping的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。