我正在研究一个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的)
如果您有任何建议,请查看问题并告诉我。
任何建议都将不胜感激。
答案 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美分。