[英]Spring MVC uri mapping with percent encoded characters
我有一個運行在Tomcat 7上的spring mvc應用程序,該應用程序帶有通過URIEncoding =“ UTF-8”配置的http和ajp連接器。 我的REST控制器片段:
@Controller
@RequestMapping("")
public class ClientRestApi {
private final String API_PREFIX = "/api/1.0/client";
...
@RequestMapping(value = API_PREFIX + "/{clientId}", method = RequestMethod.GET)
@ResponseBody
public ClientDetails get(@PathVariable String clientId, HttpServletRequest request) {
log.info("Client API GET [" + clientId + "] | " + request.getRequestURI());
...
}
}
http://www.example.pl/api/1.0/client/abc
: http://www.example.pl/api/1.0/client/abc
我得到abc客戶端頁面- 正確 http://www.example.pl/%07api/1.0/client/abc
: http://www.example.pl/%07api/1.0/client/abc
我得到abc客戶端頁面- 錯誤 http://www.example.pl/%0bapi/1.0/client/abc
: http://www.example.pl/%0bapi/1.0/client/abc
我得到abc客戶端頁面- 錯誤 http://www.example.pl/ap%0bi/1.0/client/abc
: http://www.example.pl/ap%0bi/1.0/client/abc
我得到http 404- 正確 在應用程序日志中,我可以看到(對於前3個請求):
ClientRestApi - Client API GET [abc] | /api/1.0/client/abc
ClientRestApi - Client API GET [abc] | /%07api/1.0/client/abc
ClientRestApi - Client API GET [abc] | /%0bapi/1.0/client/abc
我的問題是為什么我的錯誤例子是錯誤的? 為什么不是http 404?
在應用程序的web.xml文件中,我具有UTF-8編碼的CharacterEncodingFilter過濾器。 我從未在應用程序中遇到過任何錯誤編碼的問題。
編輯:從擴展日志中,請求http://www.example.pl/%0bapi/1.0/client/abc給出:
DEBUG RequestMappingHandlerMapping - Looking up handler method for path /^Kapi/1.0/client/abc
TRACE RequestMappingHandlerMapping - Found 1 matching mapping(s) for [/^Kapi/1.0/client/abc] : [{[/api/1.0/client/{
clientId}],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}]
DEBUG RequestMappingHandlerMapping - Returning handler method [public ClientDetails ...ClientRestApi.get(java.lang.String,javax.servlet.http.HttpServletRequest)]
AntPathMatcher標記路徑,默認情況下修剪所有段(有關String.trim,請參閱Javadoc)。 此行為可以控制。 因為您可以使用帶有setTrimTokens(false)的AntPathMatcher配置RequestMappingHandlerMapping。
這是我的客人,但似乎URL模式分析器正在搜索"/api/1.0/client"
的存在。 您所有的示例都包含該字符串,因此對API_PREFIX
執行搜索字符串將為API_PREFIX
返回true。
http://www.example.pl/%07 api/1.0/client
/ abc
http://www.example.pl/%0b api/1.0/client
/ abc
您的最后一個示例沒有確切的/api/1.0/client
字符串,而是使用0bi/1.0/client
。
簡短的答案:您不必為解析器定義確切的URL即可進行選擇。 我相信沒有彈簧的常規Java EE也是如此。 如果在web.xml文件中定義/api/1.0/client/*
,則任何具有該字符串的URL都會觸發您分配給它的專用控制器。 即使/SDSFDFSFSFSF/api/1.0/client
有字符串,但也存在諸如/SDSFDFSFSFSF/api/1.0/client
垃圾/SDSFDFSFSFSF/api/1.0/client
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.