アクティブリクエストにクライアントが使用するURLに基づいてURLを作成したいと思います。現在のHttpServletRequest
オブジェクトを取得し、GETパラメーターを含む(そして唯一の)完全なURLを再構築するgetParameter...()
メソッドよりも賢いものはありますか。
明確化:可能であれば、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
を使用しますが、UriComponentsBuilder
の機能を使用して新しいURLを構築するための柔軟性を追加します。
例:
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));
}
例: IffullURLがhttps://example.com/path/after/url/
thenOutputはhttps://example.com
になります