Jbossコンテナ(同じUnixボックス)に2つのアプリケーションをデプロイしています。 app1からリクエストを受け取った場合、app2の対応するリクエストをフレーム化する必要があります。
eg:
app1リクエストが次の場合: http://example.com/context?param1=12
次に、「 http://example.com/ 」を抽出する必要があります。これにより、2番目のアプリのリクエストをフレーム化できます。
私は使用してみました:
HttpServletRequest.getServerName() &
HttpServletRequest.getServerPort() & \
HttpServletRequest.getHeader("Host")
メソッドですが、リクエストはhttpまたはhttpsのものである場合があります。
他にもっと良い方法があれば教えてください。ありがとう!
HttpServletRequest.getScheme()
を使用して、「http」または「https」を取得できます。
HttpServletRequest.getServerName()
とともに使用すると、必要なURLの部分を再構築するのに十分なはずです。
標準のポート(httpの場合は80、httpsの場合は443)を使用している場合、URLにポートを明示的に配置する必要はありません。
Edit:サーブレットコンテナがSSLを終了するリバースプロキシまたはロードバランサの背後にある場合、リクエストがサーブレットコンテナに転送されるため、少し注意が必要です。プレーンhttpとして。いくつかのオプションがあります:
1)代わりにHttpServletRequest.getHeader("x-forwarded-proto")
を使用します。これは、ロードバランサーがヘッダーを正しく設定している場合にのみ機能します(Apacheは問題ありません)。
2)JBoss/Tomcatで RemoteIpValve を設定し、getScheme()
が期待どおりに動作するようにします。繰り返しますが、これはロードバランサーが正しいヘッダーを設定した場合にのみ機能します。
3)上記が機能しない場合、Tomcat/JBossで2つの異なるコネクターを構成できます。1つはhttp用、もう1つはhttps用です( この記事 )。
HttpServletRequest.getRequestURL および HttpServletRequest.getRequestURI を使用できます。
StringBuffer url = request.getRequestURL();
String uri = request.getRequestURI();
String Host = url.substring(0, url.indexOf(uri)); //result
ロードバランサーと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;
Tomcatのserver.xmlエンジン:
<Valve className="org.Apache.catalina.valves.RemoteIpValve"
remoteIpHeader="X-Forwarded-For"
protocolHeader="X-Forwarded-Proto"
protocolHeaderHttpsValue="https"/>
Nginx構成ファイルのみを変更する場合、Javaコードは次のようになります。
String XForwardedProto = request.getHeader("X-Forwarded-Proto");
元のURLが必要な場合は、jthalbornで説明されている方法を使用してください。あなたがデイビッド・レベスクが説明したようにURLを再構築したい場合、ここにコードスニペットがあります:
final javax.servlet.http.HttpServletRequest req = (javax.servlet.http.HttpServletRequest) ...;
final int serverPort = req.getServerPort();
if ((serverPort == 80) || (serverPort == 443)) {
// No need to add the server port for standard HTTP and HTTPS ports, the scheme will help determine it.
url = String.format("%s://%s/...", req.getScheme(), req.getServerName(), ...);
} else {
url = String.format("%s://%s:%s...", req.getScheme(), req.getServerName(), serverPort, ...);
}
リバースプロキシの場合を検討する必要があります。
ポートに定数を使用できますが、それらの信頼できるソース、デフォルトポートがあるかどうかはわかりません:
ほとんどの開発者はポート80と443について知っているので、定数はそれほど役に立ちません。
同様の post も参照してください。
http://docs.Oracle.com/javase/tutorial/networking/urls/urlInfo.html を参照してください。これは、URL解析の最も簡潔な範囲です。
サーバーがプロキシサーバーの背後で実行されている場合は、プロキシヘッダーが設定されていることを確認してください。
proxy_set_header X-Forwarded-Proto $scheme;
次に、正しい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();
}
私はパーティーに遅れましたが、Java 8でも同じ問題が発生しました。
_HttpServletRequest request
_オブジェクトで、これが私のために働いたものです。
_request.getHeader("Origin");
_
そして
_request.getHeader("referer");
_
その結論に至った経緯:
でJavaアプリを実行しています http:// localhost:30別のJavaアプリにHttpポストを作成しますhttp:// localhost:808で実行しています。
で実行されるJavaコードから http:// localhost:808を取得できませんでした http:// localhost:30上記の回答を使用して、 HttpServletRequest から。正しい文字列入力でgetHeader
メソッドを使用している私にとってはうまくいきました。
request.getHeader("Origin")
は "をくれました" http:// localhost:30 "これは私が欲しかったものです。
request.getHeader("referer")
は "をくれました" http:// localhost:3000/xxxx " xxxxはリクエスト元アプリの完全なURLです。