回答:
このデータに簡単にアクセスする方法は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()
UrlUtils
。魅力のように機能します。
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();
ConstraintValidator
とServletUriComponentsBuilder.fromCurrentRequestUri().toUriString();
。
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();
}
UriComponentsBuilder
コントローラメソッドのメソッドシグネチャにを追加することもできます。Springは、現在のリクエストから作成されたビルダーのインスタンスを注入します。
@GetMapping
public ResponseEntity<MyResponse> doSomething(UriComponentsBuilder uriComponentsBuilder) {
URI someNewUriBasedOnCurrentRequest = uriComponentsBuilder
.replacePath(null)
.replaceQuery(null)
.pathSegment("some", "new", "path")
.build().toUri();
//...
}
ビルダーを使用すると、現在のリクエストに基づいてURIの作成を直接開始できます(パスセグメントの変更など)。
UriComponentsBuilder
ものには、リクエストのパスとクエリパラメータが含まれていないことに注意してください。それらにアクセスする必要がServletUriComponentsBuilder.fromCurrentRequest()
ある場合はHttpServletRequest
、使用するか、インスタンスを挿入して使用しますServletUriComponentsBuilder.fromRequest(request)
パスではなくホスト名までの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));
}
例:場合fullurlをがありhttps://example.com/path/after/url/
、その後
出力がされます https://example.com
HttpServletRequest
オブジェクトを使用せずにこれを行う方法を探しています。これは、いくつかのヘルパークラス/メソッドを使用しており、リクエストオブジェクトを毎回渡したくないためです。