Java 带有百分比编码字符的Spring MVC uri映射
我有一个SpringMVC应用程序,它在Tomcat7上运行,http和ajp连接器配置为URIEncoding=“UTF-8”。 我的REST控制器片段:Java 带有百分比编码字符的Spring MVC uri映射,java,spring,spring-mvc,encoding,Java,Spring,Spring Mvc,Encoding,我有一个SpringMVC应用程序,它在Tomcat7上运行,http和ajp连接器配置为URIEncoding=“UTF-8”。 我的REST控制器片段: @Controller @RequestMapping("") public class ClientRestApi { private final String API_PREFIX = "/api/1.0/client"; ... @RequestMapping(value = API_PREFIX + "/{c
@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());
...
}
}
- 当我转到:
我获得abc客户端页面-正确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
- 当我转到:
我得到了http 404-正确的http://www.example.pl/ap%0bi/1.0/client/abc
这是我的客人,但似乎URL模式解析器正在搜索是否存在
“/api/1.0/client”
。您的所有示例都存在该字符串,因此对API\u PREFIX
执行搜索字符串将返回true
api/1.0/client
/abc
api/1.0/client
/abc
您的上一个示例没有精确的
/api/1.0/client
字符串,但使用0bi/1.0/client
简短回答:您不必为解析器定义准确的URL来进行选择。我相信没有spring的常规JavaEE也是如此。如果您在web.xml文件中定义了
/api/1.0/client/*
,则任何包含该字符串的URL都将触发您分配给它的专用控制器。即使字符串在前面,但垃圾(如/sdsfdfsfsfsfsfsfsf/api/1.0/client
AntPathMatcher标记路径,并在默认情况下修剪所有段(请参阅Javadoc中的string.trim)。这种行为是可以控制的。因为您可以使用带有setTrimTokens的AntPathMatcher配置RequestMappingHandlerMapping(false)。我检查了您的解决方案,但它不是真的。当我转到:www.example.pl/xapi/1.0/client/abc
或www.example.pl/x/api/1.0/client/abc
时,我总是得到http 404-正确的行为。我注意到这种奇怪的行为只有在uri路径的开头放了%的编码字符时才会发生。如果有人想知道如何做到这一点,我通过使用一个扩展了WebMvcConfigurationSupport
的配置类,然后使用如下方法来实现它:@Bean public RequestMappingHandlerMapping RequestMappingHandlerMapping(){RequestMappingHandlerMapping handlerMapping=super.RequestMappingHandlerMapping();AntPathMatcher AntPathMatcher=new AntPathMatcher();AntPathMatcher.setTrimTokens(false);handlerMapping.setPathMatcher(AntPathMatcher);返回handlerMapping;}
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
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)]