Istnieją dwie metody łatwiejszego dostępu do tych danych, ale interfejs nie oferuje możliwości uzyskania całego adresu URL za pomocą jednego wywołania. Musisz go zbudować ręcznie:
public static String makeUrl(HttpServletRequest request)
{
return request.getRequestURL().toString() + "?" + request.getQueryString();
}
Nie wiem, jak to zrobić z jakimikolwiek urządzeniami Spring MVC.
Jeśli chcesz uzyskać dostęp do bieżącego żądania bez przekazywania go wszędzie, będziesz musiał dodać odbiornik w web.xml:
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
Następnie użyj tego, aby uzyskać żądanie powiązane z bieżącym wątkiem:
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest()
HttpServletRequest
obiektu. Dzieje się tak, ponieważ używam kilku klas / metod pomocniczych i nie chcę za każdym razem przekazywać obiektu żądania.UrlUtils
. Działa jak marzenie.Zamiast używać
RequestContextHolder
bezpośrednio, możesz również użyćServletUriComponentsBuilder
i jego metod statycznych:ServletUriComponentsBuilder.fromCurrentContextPath()
ServletUriComponentsBuilder.fromCurrentServletMapping()
ServletUriComponentsBuilder.fromCurrentRequestUri()
ServletUriComponentsBuilder.fromCurrentRequest()
Używają
RequestContextHolder
pod maską, ale zapewniają dodatkową elastyczność przy tworzeniu nowych adresów URL przy użyciu możliwościUriComponentsBuilder
.Przykład:
ServletUriComponentsBuilder builder = ServletUriComponentsBuilder.fromCurrentRequestUri(); builder.scheme("https"); builder.replaceQueryParam("someBoolean", false); URI newUri = builder.build().toUri();
źródło
ConstraintValidator
zServletUriComponentsBuilder.fromCurrentRequestUri().toUriString();
.Klasa URI języka Java może Ci w tym pomóc:
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(); }
źródło
w pliku jsp:
request.getAttribute("javax.servlet.forward.request_uri")
źródło
Możesz także dodać
UriComponentsBuilder
do podpisu metody metody kontrolera. Spring wstrzyknie instancję konstruktora utworzoną na podstawie bieżącego żądania.@GetMapping public ResponseEntity<MyResponse> doSomething(UriComponentsBuilder uriComponentsBuilder) { URI someNewUriBasedOnCurrentRequest = uriComponentsBuilder .replacePath(null) .replaceQuery(null) .pathSegment("some", "new", "path") .build().toUri(); //... }
Korzystając z konstruktora, możesz bezpośrednio rozpocząć tworzenie identyfikatorów URI na podstawie bieżącego żądania, np. Modyfikować segmenty ścieżki.
Zobacz także UriComponentsBuilderMethodArgumentResolver
źródło
UriComponentsBuilder
nie zawiera ścieżki ani parametrów zapytania żądania. Jeśli potrzebujesz dostępu do nich, użyjServletUriComponentsBuilder.fromCurrentRequest()
lub wstrzyknij wystąpienieHttpServletRequest
i użyjServletUriComponentsBuilder.fromRequest(request)
Jeśli potrzebujesz adresu URL do nazwy hosta, a nie ścieżki, użyj Common Lib Apache
StringUtil
iz adresu URL wyodrębnij podciąg do trzeciego indexOf/
.public static String getURL(HttpServletRequest request){ String fullURL = request.getRequestURL().toString(); return fullURL.substring(0,StringUtils.ordinalIndexOf(fullURL, "/", 3)); }
Przykład: Jeśli fullURL to
https://example.com/path/after/url/
to Output will behttps://example.com
źródło