Servlets 如何重现sendRedirect问题-HTTPS更改为HTTP

Servlets 如何重现sendRedirect问题-HTTPS更改为HTTP,servlets,response.redirect,Servlets,Response.redirect,一旦用户成功通过身份验证,我将使用response.sendRedirect()将用户重定向到主页。这是为了避免“登录重定向漏洞” 然而,由于上述更改,我的一个客户面临的问题是,他的HTTPS请求被转换为HTTP(URL中有ip地址)。这里解释了同样的原因 现在,我如何重现问题(或设置环境),以便验证我的修复。我以为我可以通过在tomcat前面设置Apache服务器来复制,但我无法复制上述问题 在apachehttpd.conf中,我有以下条目 ProxyPass /myconsole ajp

一旦用户成功通过身份验证,我将使用response.sendRedirect()将用户重定向到主页。这是为了避免“登录重定向漏洞”

然而,由于上述更改,我的一个客户面临的问题是,他的HTTPS请求被转换为HTTP(URL中有ip地址)。这里解释了同样的原因

现在,我如何重现问题(或设置环境),以便验证我的修复。我以为我可以通过在tomcat前面设置Apache服务器来复制,但我无法复制上述问题

在apachehttpd.conf中,我有以下条目

ProxyPass /myconsole ajp://localhost:8009/myconsole
ProxyPassReverse /myconsole ajp://localhost:8009/myconsole
像这样访问应用程序

http://myapacheserver/myconsole/Login.jsp
成功登录后,我将被重定向到

http://myapacheserver/myconsole/Home.jsp
我希望重定向到IP地址。类似于
http://10.32.24.14:8080/myconsole/Home.jsp

在客户环境中,他被重定向到appserver(tomcat)的ip地址

任何指针都会有帮助

谢谢

注: 对于那些感兴趣的人,我通过从配置文件获取URI的第一部分来构建完整的URL

//Get the LB URI part. Eg: https://dev.loadbalancer.com/
String loadBalancerURI = getConfig().getLoadBalancerRequestURI();
String redirectURL = request.getContextPath() + "/Home.jsp";

//Prepend the LoadBalancer URI with redirect URI
if(loadBalancerURI != null)
{
    redirectURL = loadBalancerURI + "/" + redirectURL;  
}

//redirect to home page
response.sendRedirect(redirectURL);

return;
编辑:有关设置的详细信息。客户有F5负载平衡器,SSL通信停止,然后有一个Apache反向代理服务器,代理tomcat服务器池。问题是当我们重定向时,重定向URL是针对Tomcat服务器的。我们希望在重定向URL中包含负载平衡器URL


是否可以在Apache服务器中进行一些更改,以重写Tomcat发送的响应中HTTP头中的URL?

我不确定您是否真的在使用负载平衡器,或者您是否只调用了一个方法getLoadBalancerRequestURI,但如果您只有一个服务器,请使用:

response.sendRedirect("./Home.jsp");
没有必要指定完整的url

但是,如果您确实需要构建完整的url,您可以使用类似的方法来检查其https://

String protocol = "https";
if( request.getRequestURL().toString().toLowerCase().startsWith("http://" ) )
{
    protocol = "http";
}
然后确保使用正确的协议构建url。

请参阅此链接

因此,当https请求重定向发生时,目标服务器不知道原始请求的协议是什么。它只接收http请求。因此,对此的响应将是http响应


我能够重现客户面临的问题(当HTTP-HTTPS重定向时)

从Apache(HTTPD服务器)到Tomcat(Web容器)的通信通常使用以下连接器之一(也可以是其他方式)进行

  • mod_jk
  • mod_proxy_ajp
  • mod_proxy_http
  • 修改

我只能在使用mod_重写时重现问题。如果我使用mod_jk或mod_proxy_ajp或mod_proxy_http方法,那么重定向工作正常。但是当我使用mod_rewrite时,当重定向发生时,我能够观察到HTTPS-HTTP转换。

getLoadBalancerRequestURI()是我的自定义方法,它从配置文件返回值。是的,我可以基于请求URL在流上构建URL,但是请求URL不是http吗?因为Tomcat收到的请求是HTTP协议?我正在寻找如何重现客户在使用SSLOffloader将HTTPS转换为HTTP协议时所面临的问题。我不知道您的反向代理,但对于jkconnector,Tomcat服务器接收的请求是用户的原始请求,就请求而言。getRequestURL()。我得到的是DMZ服务器的域名,而不是tomcat服务器的IP。我用它来确定用户是否通过https进入。因此,getRequestURL()将给我负载平衡器机器名(它实际上是收到原始请求的)。但是,为什么sendRedirect()会将ip地址放在重定向URL中??此外,我正在努力建立一个可以看到这个问题的环境。客户正在使用BIG-IP(F5)产品。当然,我不能在我的测试环境中使用它。有没有更好的方法来模拟客户的部署设置?