簡體   English   中英

帶有百分比編碼字符的Spring MVC uri映射

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM