Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有百分比编码字符的Spring MVC uri映射_Java_Spring_Spring Mvc_Encoding - Fatal编程技术网

Java 带有百分比编码字符的Spring MVC uri映射

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

我有一个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 + "/{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个请求):

我的问题是为什么我的例子是错误的为什么它们不是http 404?

在应用程序中的web.xml文件中,我使用UTF-8编码的CharacterEncodingFilter过滤器。在我的应用程序中,我从未遇到过任何编码错误的问题

编辑: 从扩展日志中,请求提供:


这是我的客人,但似乎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)]