2009-09-09 20 views
20

W aplikacji Grails chciałbym wysłać użytkownika ze strony A, następnie do formularza na stronie B, a następnie z powrotem do strony A ponownie.Uzyskiwanie adresu URL bieżącej strony w Grails

Aby śledzić, do którego adresu URL powrócić, wysyłam parametr "returnPage" do strony B zawierający adres URL strony, do której ma wrócić (strona A).

Obecnie używam request.getRequestURL() na stronie A, aby pobrać adres URL strony. Jednak URL dostaję od getRequestURL() nie odpowiada adresowi URL użytkownik końcowy ma w jego/jej pasku adresu:

request.getRequestURL() == "http://localhost:8080/something/WEB-INF/grails-app/views/layouts/main.gsp" 
URL in address bar == "http://localhost:8080/something/some/thing" 

Jak mogę uzyskać „użytkownik końcowy” URL?

Odpowiedz

49

Odpowiedź brzmi: request.forwardURI (details here).

+2

link jest teraz złamane. Zobacz http://grails.org/doc/latest/ref/Servlet%20API/request.html –

2

Tworząc link do strony B można użyć tagu createLink ustawić parametr returnPage:

<g:link controller="pageB" 
     action="someaction" 
     params='[returnPage:createLink(action:actionName, params:params)]'> 
    Go to Page B 
</g:link> 
+0

To całkowicie lekceważy parametry w URI. –

6

zbudowałem tę metodę, aby uzyskać aktualne url.

static String getCurrentUrl(HttpServletRequest request){ 

    StringBuilder sb = new StringBuilder() 

    sb << request.getRequestURL().substring(0,request.getRequestURL().indexOf("/", 8)) 

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

    if(request.getAttribute("javax.servlet.forward.query_string")){ 

     sb << "?" 

     sb << request.getAttribute("javax.servlet.forward.query_string") 
    } 

    return sb.toString(); 
} 
+0

działa jak urok. – davidforneron

+0

nie ma potrzeby przechodzenia do atrybutów 'javax', możesz uzyskać ten sam rezultat za pomocą' request.forwardURI' – mathifonseca

+1

fromIndex musi zostać zmieniony z 7 na 8, jeśli strona korzysta z https. – rlovtang

2

Moje rozwiązanie (Grails 1.3.7) jest to jeden, można skopiować i wkleić go do kontrolera:

boolean includePort = true; 
String scheme = request.getScheme(); 
String serverName = request.getServerName(); 
int serverPort = (new org.springframework.security.web.PortResolverImpl()).getServerPort(request) 
String contextPath = request.getContextPath(); 
boolean inHttp = "http".equals(scheme.toLowerCase()); 
boolean inHttps = "https".equals(scheme.toLowerCase()); 

if (inHttp && (serverPort == 80)) { 
    includePort = false; 
} else if (inHttps && (serverPort == 443)) { 
    includePort = false; 
} 
String redirectUrl = scheme + "://" + serverName + ((includePort) ? (":" + serverPort) : "") + contextPath; 

W naszej aplikacji, nie można po prostu wykorzystać g.createLink(.. absolute:true) bo mamy inny koniec -użytkowników z powodu wielu klientów.

4

wolę używać:

createLink(action: "index", controller:"user", absolute: true) 
// http://localhost:8080/project/user 

kiedy trzeba uzyskać bezwzględną url!

To ciekawe, aby uzyskać ścieżkę względną też:

createLink(action: "index", controller:"user") 
// /project/user 
+1

pytanie dotyczy bieżącej strony ... –

+0

To dobre podejście, ze standardowym rozwiązaniem – IgniteCoders

Powiązane problemy