Java 是否应将解码的URI传递到ServletRequest.getRequestDispatcher()中

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。我不确

我正在使用tomcat 7.0.52

根据API:。ServletPath应为解码路径。然而,当我

request.getRequestDispatcher(newUri).forward(request, response);
具有原始Uri的小写版本的
newUri
。新的
getServletPath()
返回与
getRequestURI()
相同的编码路径,这与我传入的
newUri
相同

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

  • 将编码的URI传递给
    getRequestDispatch()
    : 这打乱了我在系统中的逻辑,因为Spring的
    @PathVariable
    ServletPath
    中提取字符串。现在它被编码了。我担心还有其他危险的未披露问题
  • 将解码的URI传递给
    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。