gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:02:11 34 4
gpt4 key购买 nike

我正在使用 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 的解码版本。

我可以在这里征求一些专家的意见吗?

最佳答案

遇到了同样的问题。试过了。

简答:调用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

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

关于java - 应该将解码后的 URI 传递给 ServletRequest.getRequestDispatcher(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32161910/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com