HttpServletResponse.sendRedirect 在升级 tomcat 时不工作

HttpServletResponse.sendRedirect is not working when the tomcat is upgraded

我正在开发一个 java Web 应用程序,它部署在 Tomcat 上。我正在使用 servlet 来处理某些功能,在 Servlet 中,我通过使用从一个 servlt 重定向到另一个 servlet SendRedirect 方法,它已成功重定向到其他 servlet。

问题:之前我们使用的是 Tomcat 版本 - 7.0.65 但最近它已升级到 7.0.67 . 将 tomcat 升级到较新版本 (7.0.67) 后,发送重定向调用不起作用。

示例:

Public class MainServlet  extends HttpServlet {

  protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

  // do some operations..
  String emptyStr = " "; 
  String urlPath = "http:localhost:8085/DemoProject/demoServlet? username=dummy&eid=emptyStr";
  response.sendRedirect(urlPath);
  return;  
    }

 }

我也看过 Tomcat 规范,他们在谈论重定向,我无法理解下面的内容。

阿帕奇 Tomcat 7.0.67 发布日期:2015-12-10 可以在此处找到完整的发行说明。 56917:根据 RFC7231 (HTTP/1.1),允许 HTTP/1.1 和更高版本的重定向使用相对 URI。这由 Context 上的新属性 useRelativeRedirects 控制,默认为 true。 (市场) 58660:更正 7.0.66 中的回归,该回归是由将上下文根的重定向从映射器移动到默认 Servlet 的更改引起的。 (市场) 修复了部署应用程序时 HostConfig 中潜在的 NPE。覆盖扫描报告的问题。 (紫罗兰色) 58655:使用 RemoteIpFilter 调用 HttpServletResponse.sendRedirect() 时修复 IllegalStateException。这是由于尝试为重定向正确生成绝对 URI 引起的。使用 56917 的修复程序,重定向现在可能是相对的,从而使 RemoteIpFilter 的 sendRedirect() 实现更加简单。这也解决了在从 http 重定向到 https 到从 https 重定向到 http 时重定向可能未按预期运行的问题。 (市场)

请调查问题,如果您有任何建议,请告诉我。

如有任何建议,我们将不胜感激。

我实际上 运行 与我继承的应用程序相同,该应用程序 运行 在 Tomcat 7.0.62 中膨胀。我必须执行的升级路径是使用 Tomcat 8.x 和 Java 8. 在测试应用程序时,它也坏了。

缩小到 URL 中为重定向生成的空格(未编码且未使用 +)这一事实。这在 7.0.65 之前的所有版本中都没有问题。命中 7.0.67 后,Tomcat 不再处理重定向 URL 中的空格(顺便说一句,是绝对 https://.... 路径,而不是相对路径)

sendRedirect 的行为似乎直接受到 7.0.67+ 中更改的影响。解决方案是正确地 URL 编码您的重定向 URL 以便在调用 sendRedirect 函数之前对空格、特殊字符等进行编码,并将位置转到

自从我最近也遇到了这个话题以来,我就这个话题只讲了 2 美分。