質問

クライアントがアクティブなリクエストに使用した 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 の作成を直接開始できます。パスセグメントを変更します。

こちらも参照 UriComponentsBuilderMethodArgumentResolver

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

例: もし フルURLhttps://example.com/path/after/url/ それから出力 になるだろう https://example.com

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top