web-dev-qa-db-ja.com

Webアプリケーションコンテキスト(ベースURL)へのURLの取得

HttpServletRequestに基づいて、サーブレット/ JSP /何でも内部のWebアプリケーションコンテキストへの完全なURLを構築する必要がある場合があります。 http://server.name:8080/context/のようなもの。サーブレットAPIには、これを実現する単一のメソッドがありません。

簡単な方法は、すべてのURLコンポーネントをStringBufferに追加することです。

ctxUrl = sb.append(req.getScheme()).append("://")
.append(req.getgetServerName()).append(":")
.append(req.getServerPort()) etc

この代替案(これは10倍速い)に何か問題があるのだろうか:

ctxUrl = req.getRequestURL();
ctxUrl = ctxUrl.substring(0, ctxUrl.lastIndexOf("/")));

上記の2つの方法alwaysは同じ結果を生成しますか?

19
Oleg Mikheev

これは「ベースURL」(HTMLの_<base>_タグで使用できるもの)と呼ばれます。次のようにして入手できます。

_StringBuffer url = req.getRequestURL();
String uri = req.getRequestURI();
String ctx = req.getContextPath();
String base = url.substring(0, url.length() - uri.length() + ctx.length()) + "/";
_

あなたのctxUrl.substring(0, ctxUrl.lastIndexOf("/")));アプローチは、_http://server.name:8080/context/folder1/folder2/folder3_のような複数のフォルダを持つURLでは失敗します。

以下も参照してください。

25
BalusC

以下は、コンテキストURLを取得し、適切に解決します。

URI contextUrl = URI.create(req.getRequestURL().toString()).resolve(req.getContextPath());

これにより、ポート、スラッシュ、その他の必要な処理がすべて行われます。 req.getContextPath()が""を返すため、ルートコンテキストでも機能します

プロキシサーバーを使用している場合は、元のHost:リクエストが確実に渡されるようにする必要があります(例: Apache ProxyPassの手順ProxyPreserveHost )。

17

仮に

http://server.name:8080/context/ Java web app事業。

String uri = request.getRequestURI();
//uri = "/context/someAction"
String url = request.getRequestURL().toString();
// url = "http://server.name:8080/context/someAction"
String ctxPath = request.getContextPath();
// ctxPath = "/context";
url = url.replaceFirst(uri, "");
// url = "http://server.name:8080"
url = url + ctxPath;
//url = "http://server.name:8080/context"

このコードブロックを使用して、URLを取得できます

1
mhmuftee