带斜线的%HttpServletRequest变量vs%2f

时间:2013-08-08 09:04:35

标签: java spring web-services rest

这是我的控制器:

@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。当我的路径中有这些符号时,控制器根本不会处理请求。

有什么方法可以解决这个问题吗?

3 个答案:

答案 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}})。