Spring MVCで現在のURLを取得する最良の方法は何ですか?
-
18-09-2019 - |
質問
クライアントがアクティブなリクエストに使用した URL に基づいて URL を作成したいと考えています。現状を受け入れること以上に賢いことはあるだろうか HttpServletRequest
オブジェクト、そしてそれは getParameter...()
GET パラメーター (のみ) を含む完全な URL を再構築するメソッド。
説明:できれば利用をやめたい HttpServletRequest
物体。
解決
このデータに簡単にアクセスする方法が 2 つありますが、このインターフェイスでは 1 回の呼び出しで URL 全体を取得することができません。手動でビルドする必要があります。
public static String makeUrl(HttpServletRequest request)
{
return request.getRequestURL().toString() + "?" + request.getQueryString();
}
Spring MVC 機能でこれを行う方法がわかりません。
現在のリクエストをどこにも渡さずにアクセスしたい場合は、web.xml にリスナーを追加する必要があります。
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
次に、これを使用して、現在のスレッドにバインドされたリクエストを取得します。
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest()
他のヒント
使用する代わりに RequestContextHolder
直接使用することもできます ServletUriComponentsBuilder
とその静的メソッド:
ServletUriComponentsBuilder.fromCurrentContextPath()
ServletUriComponentsBuilder.fromCurrentServletMapping()
ServletUriComponentsBuilder.fromCurrentRequestUri()
ServletUriComponentsBuilder.fromCurrentRequest()
彼らは使用します RequestContextHolder
内部的には機能しますが、次の機能を使用して新しい URL を構築するための追加の柔軟性が提供されます。 UriComponentsBuilder
.
例:
ServletUriComponentsBuilder builder = ServletUriComponentsBuilder.fromCurrentRequestUri();
builder.scheme("https");
builder.replaceQueryParam("someBoolean", false);
URI newUri = builder.build().toUri();
Java の URI クラスは、次のような問題を解決するのに役立ちます。
public static String getCurrentUrl(HttpServletRequest request){
URL url = new URL(request.getRequestURL().toString());
String host = url.getHost();
String userInfo = url.getUserInfo();
String scheme = url.getProtocol();
String port = url.getPort();
String path = request.getAttribute("javax.servlet.forward.request_uri");
String query = request.getAttribute("javax.servlet.forward.query_string");
URI uri = new URI(scheme,userInfo,host,port,path,query,null)
return uri.toString();
}
jsp ファイル内:
request.getAttribute("javax.servlet.forward.request_uri")
を追加することもできます UriComponentsBuilder
コントローラーメソッドのメソッドシグネチャに。Spring は、現在のリクエストから作成されたビルダーのインスタンスを挿入します。
@GetMapping
public ResponseEntity<MyResponse> doSomething(UriComponentsBuilder uriComponentsBuilder) {
URI someNewUriBasedOnCurrentRequest = uriComponentsBuilder
.replacePath(null)
.replaceQuery(null)
.pathSegment("some", "new", "path")
.build().toUri();
//...
}
ビルダーを使用すると、現在のリクエストに基づいて URI の作成を直接開始できます。パスセグメントを変更します。
パスではなくホスト名までの URL が必要な場合は、Apache の Common Lib を使用してください。 StringUtil
, 、URLから3番目のindexOfまでの部分文字列を抽出します /
.
public static String getURL(HttpServletRequest request){
String fullURL = request.getRequestURL().toString();
return fullURL.substring(0,StringUtils.ordinalIndexOf(fullURL, "/", 3));
}
例: もし フルURL は https://example.com/path/after/url/
それから出力 になるだろう https://example.com