web-dev-qa-db-ja.com

httpまたはhttpsリクエストからポートを持つホスト名を取得する方法

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のものである場合があります。

他にもっと良い方法があれば教えてください。ありがとう!

25
kumar

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用です( この記事 )。

44
David Levesque

HttpServletRequest.getRequestURL および HttpServletRequest.getRequestURI を使用できます。

StringBuffer url = request.getRequestURL();
String uri = request.getRequestURI();
String Host = url.substring(0, url.indexOf(uri)); //result
18
jtahlborn

ロードバランサーと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");
3
W.Hao

元の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 も参照してください。

3

http://docs.Oracle.com/javase/tutorial/networking/urls/urlInfo.html を参照してください。これは、URL解析の最も簡潔な範囲です。

1
Satyajit Paul

サーバーがプロキシサーバーの背後で実行されている場合は、プロキシヘッダーが設定されていることを確認してください。

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();
}
1
Mamun Sardar

私はパーティーに遅れましたが、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です。

0