解码后的URI应该传递给ServletRequest.getRequestDispatcher()

时间:2015-08-22 23:57:06

标签: java tomcat

我正在使用 tomcat 7.0.52

根据API:HttpServletRequest.html#getServletPath()。 ServletPath应该是一个解码的路径。但是,当我做的时候

request.getRequestDispatcher(newUri).forward(request, response);

newUri成为原始Uri的小写版本。新getServletPath()返回与getRequestURI()相同的编码路径,与我传入的newUri相同。

Tomcat的API并未指定getRequestDispatcher()是否应该预期编码或解码的URI。我不确定我是否应该提前解码逻辑。现在我面临两个解决方案,两者都可能产生危险的后果:

  1. 将已编码的URI传递给getRequestDispatch() : 这搞乱了我在系统中的逻辑,因为Spring的@PathVariable获取了从ServletPath中提取的字符串。现在它变成了编码。而且我担心这有其他未发现的危险问题。
  2. 将已解码的URI传递给getRequestDispatch() :在这种情况下,getRequestURI()将接收解码后的URI版本。
  3. 我可以在这里征求一些专家意见吗?

1 个答案:

答案 0 :(得分:0)

遇到同样的问题。试了一下。

简短回答:在致电getRequestDispatcher(path)时,必须对路径进行编码

详细信息 :(嵌入式Tomcat 8.5.6上的Spring Boot应用程序)

首先,我注册了一个映射在/ačiū gal?/*上的servlet(URL编码中不允许使用某些符号的路径)。

@Bean
public ServletRegistrationBean servletRegistrationBean(){
    return new ServletRegistrationBean(new TestServlet(),"/ačiū gal?/*");
}

之后调用req.getRequestDispatcher("/ačiū gal?/test")生成:

org.apache.catalina.core.ApplicationDispatcher
 > servletPath = "/ačiū gal"
 > pathInfo = null
 > requestURI = "/greeting-app/a%C4%8Di%C5%AB%20gal"
 > queryString = "/test"

而且req.getRequestDispatcher("/a%C4%8Di%C5%AB%20gal%3F/test")产生了:

org.apache.catalina.core.ApplicationDispatcher
 > servletPath = "/ačiū gal?"
 > pathInfo = "/test"
 > requestURI = "/greeting-app/a%C4%8Di%C5%AB%20gal%3F/test"
 > queryString = null

如您所见,第二种情况(编码路径)是预期的。