事情的起源:有人問我,說編寫了一個/hello訪問路徑,但是吧,不管是輸入/hello還是/hello.html,還是/hello.xxx都能進行訪問。當時我還以為他對代碼進行處理了,后來發現不是,后來發現這是Spring Boot路由規則。好了,有廢話了下,那么看看我們解決上面這個導致的問題。
構建web應用程序時,並不是所有的URL請求都遵循默認的規則。有時,我們希望RESTful URL匹配的時候包含定界符“.”,這種情況在Spring中可以稱之為“定界符定義的格式”;有時,我們希望識別斜杠的存在。Spring提供了接口供開發人員按照需求定制。
核心的開發步驟就是兩步:
(1)啟動類 extends WebMvcConfigurationSupport
(2)重寫configurePathMatch方法;
具體實現代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
package
com.kfit;
import
org.springframework.boot.SpringApplication;
import
org.springframework.boot.autoconfigure.SpringBootApplication;
import
org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import
org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
/**
*
* @author Angel --守護天使
* @version v.0.1
* @date 2016年7月29日下午7:06:11
*/
@SpringBootApplication
public
class
ApiCoreApp
extends
WebMvcConfigurationSupport{
/**
* 1、 extends WebMvcConfigurationSupport
* 2、重寫下面方法;
* setUseSuffixPatternMatch : 設置是否是后綴模式匹配,如“/user”是否匹配/user.*,默認真即匹配;
* setUseTrailingSlashMatch : 設置是否自動后綴路徑模式匹配,如“/user”是否匹配“/user/”,默認真即匹配;
*/
@Override
publicvoid configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseSuffixPatternMatch(
false
)
.setUseTrailingSlashMatch(
true
);
}
publicstaticvoid main(String[] args) {
SpringApplication.run(ApiCoreApp.
class
, args);
}
}
|
其中訪問代碼:
1
2
3
4
|
@RequestMapping
(
"/user"
)
public
String hello(){
return
"/user"
;
}
|
以上代碼有兩句核心的代碼:
setUseSuffixPatternMatch(boolean useSuffixPatternMatch):
設置是否是后綴模式匹配,如“/user”是否匹配/user.*,默認真即匹配;
當此參數設置為true的時候,那么/user.html,/user.aa,/user.*都能是正常訪問的。
當此參數設置為false的時候,那么只能訪問/user或者/user/( 這個前提是setUseTrailingSlashMatch 設置為true了)。
setUseTrailingSlashMatch (boolean useSuffixPatternMatch):
設置是否自動后綴路徑模式匹配,如“/user”是否匹配“/user/”,默認真即匹配;
當此參數設置為true的會后,那么地址/user,/user/都能正常訪問。
當此參數設置為false的時候,那么就只能訪問/user了。
當以上兩個參數都設置為true的時候,那么路徑/user或者/user.aa,/user.*,/user/都是能正常訪問的,但是類似/user.html/ 是無法訪問的。
當都設置為false的時候,那么就只能訪問/user路徑了。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
原文鏈接:http://412887952-qq-com.iteye.com/blog/2315107
http://www.jb51.net/article/106715.htm
其中DefaultMockMvcBuilder還提供了如下API:
addFilters(Filter... filters)/addFilter(Filter filter, String... urlPatterns):添加javax.servlet.Filter過濾器
defaultRequest(RequestBuilder requestBuilder):默認的RequestBuilder,每次執行時會合並到自定義的RequestBuilder中,即提供公共請求數據的;
alwaysExpect(ResultMatcher resultMatcher):定義全局的結果驗證器,即每次執行請求時都進行驗證的規則;
alwaysDo(ResultHandler resultHandler):定義全局結果處理器,即每次請求時都進行結果處理;
dispatchOptions:DispatcherServlet是否分發OPTIONS請求方法到控制器;
StandaloneMockMvcBuilder繼承了DefaultMockMvcBuilder,又提供了如下API:
setMessageConverters(HttpMessageConverter<?>...messageConverters):設置HTTP消息轉換器;
setValidator(Validator validator):設置驗證器;
setConversionService(FormattingConversionService conversionService):設置轉換服務;
addInterceptors(HandlerInterceptor... interceptors)/addMappedInterceptors(String[] pathPatterns, HandlerInterceptor... interceptors):添加spring mvc攔截器;
setContentNegotiationManager(ContentNegotiationManager contentNegotiationManager):設置內容協商管理器;
setAsyncRequestTimeout(long timeout):設置異步超時時間;
setCustomArgumentResolvers(HandlerMethodArgumentResolver... argumentResolvers):設置自定義控制器方法參數解析器;
setCustomReturnValueHandlers(HandlerMethodReturnValueHandler... handlers):設置自定義控制器方法返回值處理器;
setHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers)/setHandlerExceptionResolvers(HandlerExceptionResolver... exceptionResolvers):設置異常解析器;
setViewResolvers(ViewResolver...resolvers):設置視圖解析器;
setSingleView(View view):設置單個視圖,即視圖解析時總是解析到這一個(僅適用於只有一個視圖的情況);
setLocaleResolver(LocaleResolver localeResolver):設置Local解析器;
setFlashMapManager(FlashMapManager flashMapManager):設置FlashMapManager,如存儲重定向數據;
setUseSuffixPatternMatch(boolean useSuffixPatternMatch):設置是否是后綴模式匹配,如“/user”是否匹配"/user.*",默認真即匹配;
setUseTrailingSlashPatternMatch(boolean useTrailingSlashPatternMatch):設置是否自動后綴路徑模式匹配,如“/user”是否匹配“/user/”,默認真即匹配;
addPlaceHolderValue(String name, String value) :添加request mapping中的占位符替代;
因為StandaloneMockMvcBuilder不會加載Spring MVC配置文件,因此就不會注冊我們需要的一些組件,因此就提供了如上API用於注冊我們需要的相應組件。
http://jinnianshilongnian.iteye.com/blog/2004660