我正在使用 tomcat 7.0.52
根据API:HttpServletRequest.html#getServletPath()。 ServletPath应该是一个解码的路径。但是,当我做的时候
request.getRequestDispatcher(newUri).forward(request, response);
让newUri
成为原始Uri的小写版本。新getServletPath()
返回与getRequestURI()
相同的编码路径,与我传入的newUri
相同。
Tomcat的API并未指定getRequestDispatcher()
是否应该预期编码或解码的URI。我不确定我是否应该提前解码逻辑。现在我面临两个解决方案,两者都可能产生危险的后果:
getRequestDispatch()
:
这搞乱了我在系统中的逻辑,因为Spring的@PathVariable
获取了从ServletPath
中提取的字符串。现在它变成了编码。而且我担心这有其他未发现的危险问题。getRequestDispatch()
:在这种情况下,getRequestURI()
将接收解码后的URI版本。 我可以在这里征求一些专家意见吗?
答案 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
如您所见,第二种情况(编码路径)是预期的。