kum*_*mar 29 java servlets http httprequest http-headers
我在jboss容器中部署了两个应用程序(相同的unix框).如果我从app1收到请求,我需要为app2设置相应的请求.
例如:
如果app1请求是:http://example.com/context? param1 = 123
然后我需要提取" http://example.com/ ",以便我可以构建第二个应用程序的请求.
我试过用:
HttpServletRequest.getServerName() &
HttpServletRequest.getServerPort() & \
HttpServletRequest.getHeader("host")
Run Code Online (Sandbox Code Playgroud)
方法,但请求可能是http或https.
如果还有其他更好的方法,请告诉我.谢谢!
Dav*_*que 47
您可以使用HttpServletRequest.getScheme()"http"或"https"来检索.
使用它HttpServletRequest.getServerName()应该足以重建您需要的URL部分.
如果您使用的是标准端口(80为http,443为https),则无需在URL中明确放置端口.
编辑:如果您的servlet容器位于终止SSL的反向代理或负载平衡器后面,则它有点棘手,因为请求将作为普通http转发到servlet容器.你有几个选择:
1)HttpServletRequest.getHeader("x-forwarded-proto")改为使用; 这只适用于您的负载均衡器正确设置标头(Apache应该是afaik).
2)在JBoss/Tomcat中配置RemoteIpValve,使其getScheme()按预期工作.同样,这仅在负载均衡器设置正确的标头时才有效.
3)如果上述方法不起作用,您可以在Tomcat/JBoss中配置两个不同的连接器,一个用于http,另一个用于https,如本文所述.
jta*_*orn 19
您可以使用HttpServletRequest.getRequestURL和HttpServletRequest.getRequestURI.
StringBuffer url = request.getRequestURL();
String uri = request.getRequestURI();
String host = url.substring(0, url.indexOf(uri)); //result
Run Code Online (Sandbox Code Playgroud)
如果您的服务器在代理服务器后面运行,请确保设置了代理标头:
proxy_set_header X-Forwarded-Proto $scheme;
Run Code Online (Sandbox Code Playgroud)
然后为了获得正确的结果,scheme & url你可以使用 springframework 的类:
public String getUrl(HttpServletRequest request) {
HttpRequest httpRequest = new ServletServerHttpRequest(request);
UriComponents uriComponents = UriComponentsBuilder.fromHttpRequest(httpRequest).build();
String scheme = uriComponents.getScheme(); // http / https
String serverName = request.getServerName(); // hostname.com
int serverPort = request.getServerPort(); // 80
String contextPath = request.getContextPath(); // /app
// Reconstruct original requesting URL
StringBuilder url = new StringBuilder();
url.append(scheme).append("://");
url.append(serverName);
if (serverPort != 80 && serverPort != 443) {
url.append(":").append(serverPort);
}
url.append(contextPath);
return url.toString();
}
Run Code Online (Sandbox Code Playgroud)
似乎您需要从 URL 中删除 URL,因此您可以通过以下方式执行此操作:
request.getRequestURL().toString().replace(request.getRequestURI(), "")
Run Code Online (Sandbox Code Playgroud)
小智 5
如果您使用负载均衡器和 Nginx,则无需修改代码即可配置它们。
nginx:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
Run Code Online (Sandbox Code Playgroud)
Tomcat的server.xml引擎:
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="X-Forwarded-For"
protocolHeader="X-Forwarded-Proto"
protocolHeaderHttpsValue="https"/>
Run Code Online (Sandbox Code Playgroud)
如果只修改Nginx配置文件,java代码应该是:
String XForwardedProto = request.getHeader("X-Forwarded-Proto");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
95097 次 |
| 最近记录: |