web-dev-qa-db-ja.com

Spring MVCで現在のURLを取得する最良の方法は何ですか?

アクティブリクエストにクライアントが使用するURLに基​​づいてURLを作成したいと思います。現在のHttpServletRequestオブジェクトを取得し、GETパラメーターを含む(そして唯一の)完全なURLを再構築するgetParameter...()メソッドよりも賢いものはありますか。

明確化:可能であれば、HttpServletRequestオブジェクトの使用を辞任します。

82
Koraktor

このデータに簡単にアクセスするには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()
101
Daff

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();
62
Koraktor

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();
}
16
Reed Grey

jspファイル内:

request.getAttribute("javax.servlet.forward.request_uri")
8
andy

コントローラーメソッドのメソッドシグネチャにUriComponentsBuilderを追加することもできます。 Springは、現在のリクエストから作成されたビルダーのインスタンスを注入します。

@GetMapping
public ResponseEntity<MyResponse> doSomething(UriComponentsBuilder uriComponentsBuilder) {
    URI someNewUriBasedOnCurrentRequest = uriComponentsBuilder
            .replacePath(null)
            .replaceQuery(null)
            .pathSegment("some", "new", "path")
            .build().toUri();
  //...
}

ビルダーを使用すると、現在のリクエストに基づいてURIの作成を直接開始できます。パスセグメントを変更します。

riComponentsBuilderMethodArgumentResolver も参照してください

2
Mathias Dpunkt

パスではなくホスト名までの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)); 
}

例: IffullURLhttps://example.com/path/after/url/ thenOutputhttps://example.comになります

0
Sahil Chhabra