这是我的控制器:
@RequestMapping(method = RequestMethod.GET, value="/test/**", headers="Accept=*/*")
public @ResponseBody ResponseEntity<byte[]> getRequest(HttpServletRequest request)
{
System.out.println((String) request.getAttribute( HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE ));
}
每当我想创建GET
请求时,如下所示:localhost:8080/test/some/request/given/in
我的系统输出在控制台中写:
some/request/given/in
我想要它。当我没有斜线时出现问题 - /
符号%2F
或%2f
。当我的路径中有这些符号时,控制器根本不会处理请求。
有什么方法可以解决这个问题吗?
答案 0 :(得分:4)
如果在网址中找到%2F
,通常大部分应用服务器都不会将/
视为%2F
。但是,由于规范声明%2F
是可以指定路径分隔符的方法之一,因此为了处理这种情况,tomcat提供了系统级属性
对于tomcat,如果
org.apache.tomcat.util.buf. UDecoder.ALLOW_ENCODED_SLASH = true
然后{J}允许%2F
和%5C
作为路径分隔符。 Refer to the documentation。这可以在tomcat批处理文件中设置为JAVA_OPTS
,如下所示
set JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG% -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
这是专门针对Tomcat 。我相信其他应用服务器也会有类似的安排。
答案 1 :(得分:1)
您需要使用URL编码器和解码器发送带有特殊字符的路径参数,例如/
和-
。在您的服务器端代码中,您只需要输入:
String result = URLDecoder.decode(url, "UTF-8");
然后获取参数。
答案 2 :(得分:0)
您遇到的问题是编码的斜杠字符%2f
被放置在HTTP网址的abs_path
部分,如RFC 2616的第3.2.1节中所定义。 abs_path
中定义的'/'
语法是根据US-ASCII字符query
特别定义的,而不是语义字符“斜杠”。如果您希望出于某种原因能够使用转义的斜杠字符,则需要使用包含/test/?some%2frequest
部分的网址(例如{{1}})。