Spring MVC'de mevcut URL'yi almanın en iyi yolu nedir?


98

İstemci tarafından aktif istek için kullanılan URL'ye dayalı olarak URL'ler oluşturmak istiyorum. Geçerli HttpServletRequestnesneyi almaktan daha akıllıca bir şey var mı getParameter...()ve GET parametreleri dahil (ve yalnızca) tam URL'yi yeniden oluşturma yöntemleri.

Açıklama: Mümkünse bir HttpServletRequestnesneyi kullanmaktan vazgeçmek istiyorum .

Yanıtlar:


112

Bu verilere daha kolay erişmek için iki yöntem vardır, ancak arayüz tek bir aramayla tüm URL'yi alma imkanı sunmamaktadır. Manuel olarak inşa etmelisiniz:

public static String makeUrl(HttpServletRequest request)
{
    return request.getRequestURL().toString() + "?" + request.getQueryString();
}

Bunu herhangi bir Spring MVC tesisiyle yapmanın bir yolunu bilmiyorum.

Mevcut İsteği her yere iletmeden erişmek istiyorsanız, web.xml'de bir dinleyici eklemeniz gerekir:

<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

Ve sonra bunu, mevcut İş Parçacığına bağlı isteği almak için kullanın:

((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest()

Tamam, bu şimdiye kadar yaptıklarıma benzer bir yaklaşım. Ama bunu HttpServletRequestnesneyi gerçekten kullanmadan yapmanın bir yolunu arıyorum . Bunun nedeni, birkaç yardımcı sınıf / yöntem kullanıyorum ve her seferinde istek nesnesini geçirmek istemiyorum.
Koraktor

Tamam, ne demek istediğini anladım ve mevcut isteğe iletmeden erişmen için gereken bilgileri ekledim.
Daff

Dinleyiciyle ilgili hatırlatma için teşekkürler. Hala Spring'de yeniyim (ve genel olarak Java web geliştirme). Şimdi kodunuzu Spring Security ile birlikte kullanıyorum UrlUtils. Tıkır tıkır çalışıyor.
Koraktor

Benim durumumda, göz atma url'si yerine ilgili görünüm yolunu veriyor. Bununla ilgili bir fikrin var mı?
Md. Shougat Hossain

HttpServletRequest kullanmadan ... Spring Boot denetleyici yöntemlerinde bunu bir parametre olarak alamayız ... o zaman statik çağrının diğer yanıtı iyi görünüyor ServletUriComponentsBuilder.fromCurrentRequest (). ToUriString ()
msanjay

78

RequestContextHolderDoğrudan kullanmak yerine ServletUriComponentsBuilder, statik yöntemlerini de kullanabilirsiniz :

  • ServletUriComponentsBuilder.fromCurrentContextPath()
  • ServletUriComponentsBuilder.fromCurrentServletMapping()
  • ServletUriComponentsBuilder.fromCurrentRequestUri()
  • ServletUriComponentsBuilder.fromCurrentRequest()

RequestContextHolderBaşlık altında kullanırlar , ancak yeteneklerini kullanarak yeni URL'ler oluşturmak için ek esneklik sağlarlar UriComponentsBuilder.

Misal:

ServletUriComponentsBuilder builder = ServletUriComponentsBuilder.fromCurrentRequestUri();
builder.scheme("https");
builder.replaceQueryParam("someBoolean", false);
URI newUri = builder.build().toUri();

@ m4rtin Kendi sorumu cevapladım ve başlangıçta sorunumu çözmeme yardımcı olan kişinin itibarını almak istemedim.
Koraktor

2
Bahar 5 için de iyi. URL'yi a ConstraintValidatorile almayı başardım ServletUriComponentsBuilder.fromCurrentRequestUri().toUriString();.
GuiRitter

17

Java'nın URI Sınıfı size bu konuda yardımcı olabilir:

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

sadece ana bilgisayar adını veriyor
vivex

8

jsp dosyasında:

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

3

UriComponentsBuilderDenetleyici yönteminizin yöntem imzasına da bir ekleyebilirsiniz . Spring, mevcut talepten oluşturulan oluşturucunun bir örneğini enjekte edecek.

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

Oluşturucuyu kullanarak, mevcut talebe dayalı olarak URI'ler oluşturmaya doğrudan başlayabilirsiniz, örneğin yol segmentlerini değiştirin.

Ayrıca bkz. UriComponentsBuilderMethodArgumentResolver


Enjekte edilenin UriComponentsBuilder, isteğin yolunu ve sorgu parametrelerini içermediğini unutmayın. ServletUriComponentsBuilder.fromCurrentRequest()Bunlara erişmeniz veya bir örneğini enjekte etmeniz HttpServletRequestve kullanmanız gerekiyorsaServletUriComponentsBuilder.fromRequest(request)
Martin Devillers

-1

Yol değil, ana bilgisayar adına kadar URL'ye ihtiyacınız varsa, Apache'nin Ortak Kitaplığını kullanın StringUtilve URL'den üçüncü indexOf'a kadar alt dizeyi çıkarın /.

public static String getURL(HttpServletRequest request){
   String fullURL = request.getRequestURL().toString();
   return fullURL.substring(0,StringUtils.ordinalIndexOf(fullURL, "/", 3)); 
}

Örnek: Eğer fullurl olduğunu https://example.com/path/after/url/o zaman Çıktı olacak https://example.com

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.