升级tomcat时,HttpServletResponse.sendRedirect无法正常工作

时间:2016-02-05 10:24:49

标签: servlets tomcat7 httprequest httpserver

我正在研究一个java Web应用程序,它部署在Tomcat上。我正在使用servlet来处理一些功能,在Servlet中我通过使用从一个servlet重定向到另一个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规范,他们正在谈论重定向,这些重定向无法理解。

Apache Tomcat 7.0.67 发布日期:2015-12-10 完整发行说明可在此处找到。 56917:根据RFC7231(HTTP / 1.1),允许HTTP / 1.1及更高版本重定向以使用相对URI。这由Context上的新属性useRelativeRedirects控制,默认为true。 (Markt的) 58660:更正由于将上下文根的重定向从Mapper移动到Default Servlet而导致的7.0.66中的回归。 (Markt的) 修复了部署应用程序时HostConfig中的潜在NPE。覆盖率扫描报告的问题。 (violetagg) 58655:使用RemoteIpFilter调用HttpServletResponse.sendRedirect()时修复了IllegalStateException。这是因为尝试正确生成重定向的绝对URI而导致56917的修复,重定向现在可能是相对的,使得RemoteIpFilter的sendRedirect()实现更加简单。这还解决了在从http重定向到https到从https重定向到http时,重定向可能没有按预期运行的问题。 (Markt的)

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

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:0)

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

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

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

因为我最近也遇到了这个话题,所以我只有2美分。