SpringMVC中的ResourceUrlProviderExposingInterceptor詳解
ResourceUrlProviderExposingInterceptor詳解
概述
ResourceUrlProviderExposingInterceptor是Spring MVC的一個HandlerInterceptor,用于向請求添加一個屬性,屬性名稱為ResourceUrlProvider.class.getName(),值是Spring MVC配置定義的一個資源URL提供者對象ResourceUrlProvider。
缺省情況下,Spring MVC配置機制會主動構建一個ResourceUrlProviderExposingInterceptor應用于所有的請求。
關于應用
引入
缺省被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之后,會調用其方法applyPreHandle以應用各個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;
}
}到此這篇關于SpringMVC中的ResourceUrlProviderExposingInterceptor詳解的文章就介紹到這了,更多相關ResourceUrlProviderExposingInterceptor詳解內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Mybatis-plus3.4.3下使用lambdaQuery報錯解決
最近在使用lambdaQuery().eq(CommonUser::getOpenId, openId).one()進行查詢報錯,本文主要介紹了Mybatis-plus3.4.3下使用lambdaQuery報錯解決,具有一定的參考價值,感興趣的可以了解一下2024-07-07
idea創(chuàng)建Spring項目的方法步驟(圖文)
這篇文章主要介紹了idea創(chuàng)建Spring項目的方法步驟(圖文),小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01
關于feign對x-www-form-urlencode類型的encode和decode問題
這篇文章主要介紹了關于feign對x-www-form-urlencode類型的encode和decode問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03

