Spring MVC的百分之与编码字符URI映射(Spring MVC uri mapping wi

2019-10-21 01:54发布

我有与的URIEncoding =“UTF-8”配置的HTTP和AJP连接器在Tomcat 7运行的弹簧MVC应用程序。 我的休息控制器片段:

@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我得到ABC客户端页面- 正确
  • 当我去: http://www.example.pl/%07api/1.0/client/abc我得到ABC客户端页面-
  • 当我去: http://www.example.pl/%0bapi/1.0/client/abc我得到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)]

Answer 1:

AntPathMatcher的标记化路径和默认装饰各阶层(见String.trim的Javadoc)。 可以控制此行为。 因为你可以用setTrimTokens(假)的AntPathMatcher配置RequestMappingHandlerMapping。



Answer 2:

这是我的客人,但它似乎是URL模式解析器正在搜索的存在"/api/1.0/client" 。 您的所有例子都存在,因此执行的搜索字符串字符串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真没有春天。 如果定义/api/1.0/client/*在web.xml文件中,有该字符串的任何URL西港岛线触发专用控制器你分配给它。 即使字符串preceeded但垃圾如/SDSFDFSFSFSF/api/1.0/client



文章来源: Spring MVC uri mapping with percent encoded characters