2009-09-29 17 views
56

Chciałbym utworzyć adresy URL na podstawie adresu URL używanego przez klienta dla aktywnego żądania. Czy jest coś mądrzejszego niż wykorzystanie aktualnego obiektu HttpServletRequest i jego metod odbudowania pełnego adresu URL zawierającego (i tylko) jego parametry GET.Jaki jest najlepszy sposób uzyskania aktualnego adresu URL w Spring MVC?

Wyjaśnienie: Jeśli to możliwe, chcę zrezygnować z używania obiektu HttpServletRequest.

Odpowiedz

80

Dostępne są dwie metody uzyskiwania dostępu do tych danych, ale interfejs nie oferuje możliwości uzyskania całego adresu URL za pomocą jednego połączenia. Musisz zbudować to ręcznie:

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

Nie wiem jak to zrobić z urządzeniami Spring MVC.

Jeśli chcesz uzyskać dostęp do bieżącego żądania bez przekazania go wszędzie trzeba będzie dodać detektor w web.xml:

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

a następnie użyj tego, aby wniosek związany z bieżącego wątku:

((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest() 
+0

Ok, jest to podobne podejście do tego, co robiłem do tej pory. Ale szukam sposobu, aby to zrobić bez faktycznego używania obiektu 'HttpServletRequest'. Dzieje się tak, ponieważ używam kilku klas/metod pomocnika i nie chcę za każdym razem przekazywać obiektu żądania. – Koraktor

+0

Ok, wiem, co masz na myśli i dodałeś informacje potrzebne do uzyskania dostępu do bieżącego wniosku bez przekazywania go. – Daff

+0

Dzięki za przypomnienie o słuchaczu. Wciąż jestem nowy w Spring (i ogólnie w rozwoju aplikacji Java). Teraz używam twojego kodu w połączeniu z 'UrlUtils' Spring Security. Działa jak marzenie. – Koraktor

8

w pliku jsp:

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

URI klasa Javy może pomóc z tego:

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

podaje tylko nazwę hosta – Vivek

25

zamiast korzystania RequestContextHolder bezpośrednio, można również użyć ServletUriComponentsBuilder i jego statyczne metody:

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

Używają one pod maską RequestContextHolder, ale zapewniają dodatkową elastyczność w tworzeniu nowych adresów URL przy użyciu możliwości UriComponentsBuilder.

Przykład:

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

Dziękuję, to była dla mnie najbardziej przydatna odpowiedź. – John

+0

Powinna być zaakceptowana odpowiedź od wiosny 3.1 – m4rtin

+0

@ m4rtin Odpowiedziałem na własne pytanie i nie chciałem wziąć kredytu dla tego, który początkowo pomógł mi rozwiązać mój problem. – Koraktor

Powiązane problemy