Java 是否应将解码的URI传递到ServletRequest.getRequestDispatcher()中
我正在使用tomcat 7.0.52 根据API:。ServletPath应为解码路径。然而,当我Java 是否应将解码的URI传递到ServletRequest.getRequestDispatcher()中,java,tomcat,Java,Tomcat,我正在使用tomcat 7.0.52 根据API:。ServletPath应为解码路径。然而,当我 request.getRequestDispatcher(newUri).forward(request, response); 具有原始Uri的小写版本的newUri。新的getServletPath()返回与getRequestURI()相同的编码路径,这与我传入的newUri相同 Tomcat的API没有指定getRequestDispatcher()是否应该使用编码或解码的URI。我不确
request.getRequestDispatcher(newUri).forward(request, response);
具有原始Uri的小写版本的newUri
。新的getServletPath()
返回与getRequestURI()
相同的编码路径,这与我传入的newUri
相同
Tomcat的API没有指定getRequestDispatcher()
是否应该使用编码或解码的URI。我不确定我是否应该提前解码逻辑。现在我面临两种解决方案,都可能产生危险的后果:
getRequestDispatch()
:
这打乱了我在系统中的逻辑,因为Spring的@PathVariable
从ServletPath
中提取字符串。现在它被编码了。我担心还有其他危险的未披露问题getRequestDispatch()
:在这种情况下,getRequestURI()
将接收URI的解码版本李>
我可以在这里征求一些专家的意见吗?遇到了同样的问题。试过了 简短回答:调用
getRequestDispatcher(path)
时,必须对path进行编码
详细信息:(嵌入式Tomcat 8.5.6上的Spring Boot应用程序)
首先,我注册了一个映射到/ačIūgal?/*
上的servlet(URL编码中不允许使用带有某些符号的路径)
在调用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"
org.apache.catalina.core.ApplicationDispatcher
> servletPath = "/ačiū gal?"
> pathInfo = "/test"
> requestURI = "/greeting-app/a%C4%8Di%C5%AB%20gal%3F/test"
> queryString = null
和req.getRequestDispatcher(“/a%C4%8Di%C5%AB%20gal%3F/test”)
生成:
org.apache.catalina.core.ApplicationDispatcher
> servletPath = "/ačiū gal"
> pathInfo = null
> requestURI = "/greeting-app/a%C4%8Di%C5%AB%20gal"
> queryString = "/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
如您所见,第二种情况(编码路径)是预期的情况。您引用的不是Tomcat的API,而是Official Servlet Javadoc。