SpringMVC中的ResourceUrlProviderExposingInterceptor詳解
ResourceUrlProviderExposingInterceptor詳解
概述
ResourceUrlProviderExposingInterceptor是Spring MVC的一個HandlerInterceptor,用于向請求添加一個屬性,屬性名稱為ResourceUrlProvider.class.getName(),值是Spring MVC配置定義的一個資源URL提供者對象ResourceUrlProvider。
缺省情況下,Spring MVC配置機制會主動構(gòu)建一個ResourceUrlProviderExposingInterceptor應(yīng)用于所有的請求。
關(guān)于應(yīng)用
引入
缺省被WebMvcConfigurationSupport啟用:
// WebMvcConfigurationSupport 代碼片段 // /** * Provide access to the shared handler interceptors used to configure * {@link HandlerMapping} instances with. * <p>This method cannot be overridden; use {@link #addInterceptors} instead. */ protected final Object[] getInterceptors() { if (this.interceptors == null) { InterceptorRegistry registry = new InterceptorRegistry(); addInterceptors(registry); registry.addInterceptor(new ConversionServiceExposingInterceptor(mvcConversionService())); // 這里創(chuàng)建 ResourceUrlProviderExposingInterceptor,使用的 ResourceUrlProvider // 由另外一個 bean 定義方法 #mvcResourceUrlProvider 提供 registry.addInterceptor(new ResourceUrlProviderExposingInterceptor(mvcResourceUrlProvider())); this.interceptors = registry.getInterceptors(); } return this.interceptors.toArray(); } // requestMappingHandlerMapping() bean 定義中使用所有 getInterceptors() 定義的通用攔截器 // mapping.setInterceptors(getInterceptors()); // viewControllerHandlerMapping() bean 定義中使用所有 getInterceptors() 定義的通用攔截器 // handlerMapping.setInterceptors(getInterceptors()); // beanNameHandlerMapping() bean 定義中使用所有 getInterceptors() 定義的通用攔截器 // mapping.setInterceptors(getInterceptors()); // resourceHandlerMapping() bean 定義中使用所有 getInterceptors() 定義的通用攔截器 // handlerMapping.setInterceptors(getInterceptors());
使用
DispatcherServlet#doDispatch請求處理主流程會先找到能處理該請求的Handler,以HandlerExecutionChain形式包裝存在。
這些HandlerExecutionChain來自某個HandlerMapping,而這些HandlerMapping就是Spring MVC配置中定義的那些HandlerMapping,它們在DispatcherServlet初始化階段#initHandlerMappings執(zhí)行時被從容器中獲取。
DispatcherServlet#doDispatch得到HandlerExecutionChain之后,會調(diào)用其方法applyPreHandle以應(yīng)用各個HandlerInterceptor對請求的前置處理邏輯。
這其中就有ConversionServiceExposingInterceptor。
// HandlerExecutionChain 代碼片段 /** * Apply preHandle methods of registered interceptors. * @return {@code true} if the execution chain should proceed with the * next interceptor or the handler itself. Else, DispatcherServlet assumes * that this interceptor has already dealt with the response itself. */ boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception { HandlerInterceptor[] interceptors = getInterceptors(); if (!ObjectUtils.isEmpty(interceptors)) { for (int i = 0; i < interceptors.length; i++) { HandlerInterceptor interceptor = interceptors[i]; if (!interceptor.preHandle(request, response, this.handler)) { triggerAfterCompletion(request, response, null); return false; } this.interceptorIndex = i; } } return true; }
源代碼解析
源代碼版本 : spring-webmvc-5.1.5.RELEASE
package org.springframework.web.servlet.resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.util.Assert; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; /** * An interceptor that exposes the {@link ResourceUrlProvider} instance it * is configured with as a request attribute. * * @author Rossen Stoyanchev * @since 4.1 */ public class ResourceUrlProviderExposingInterceptor extends HandlerInterceptorAdapter { /** * Name of the request attribute that holds the {@link ResourceUrlProvider}. */ public static final String RESOURCE_URL_PROVIDER_ATTR = ResourceUrlProvider.class.getName(); private final ResourceUrlProvider resourceUrlProvider; public ResourceUrlProviderExposingInterceptor(ResourceUrlProvider resourceUrlProvider) { Assert.notNull(resourceUrlProvider, "ResourceUrlProvider is required"); this.resourceUrlProvider = resourceUrlProvider; } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { request.setAttribute(RESOURCE_URL_PROVIDER_ATTR, this.resourceUrlProvider); return true; } }
到此這篇關(guān)于SpringMVC中的ResourceUrlProviderExposingInterceptor詳解的文章就介紹到這了,更多相關(guān)ResourceUrlProviderExposingInterceptor詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java爬蟲范例之使用Htmlunit爬取學校教務(wù)網(wǎng)課程表信息
htmlunit 是一款開源的java 頁面分析工具,讀取頁面后,可以有效的使用htmlunit分析頁面上的內(nèi)容。項目可以模擬瀏覽器運行,被譽為java瀏覽器的開源實現(xiàn)。今天我們用這款分析工具來爬取學校教務(wù)網(wǎng)課程表信息2021-11-11JAVA實現(xiàn)基于Tcp協(xié)議的簡單Socket通信實例
本篇文章主要介紹了JAVA實現(xiàn)基于Tcp協(xié)議的簡單Socket通信實例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01maven的settings.xml、pom.xml配置文件使用詳解
本文詳解了Maven中的配置文件settings.xml和pom.xml,闡述了它們的作用、配置項以及優(yōu)先級順序,settings.xml存在于Maven安裝目錄和用戶目錄下,分別作用于全局和當前用戶,pom.xml位于項目根路徑下2024-09-09如何利用Map與函數(shù)式接口來實現(xiàn)去除if else
這篇文章主要介紹了如何利用Map與函數(shù)式接口來實現(xiàn)去除if else問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07springboot整合mybatis將sql打印到日志的實例詳解
這篇文章主要介紹了springboot整合mybatis將sql打印到日志的實例詳解,需要的朋友可以參考下2017-12-12Java Mail郵件發(fā)送如何實現(xiàn)簡單封裝
這篇文章主要介紹了Java Mail郵件發(fā)送如何實現(xiàn)簡單封裝,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-11-11