2009-09-09 22 views
20

In un'applicazione Grails Desidero inviare un utente dalla pagina A, quindi a un modulo nella pagina B e quindi nuovamente alla pagina A.Ottenere l'URL della pagina corrente in Grails

Per tenere traccia dell'URL da restituire, invio un parametro "returnPage" alla pagina B contenente l'URL della pagina per tornare a (pagina A).

Attualmente sto usando request.getRequestURL() sulla pagina A per recuperare l'URL della pagina. Tuttavia, l'URL che ricevo da getRequestURL() non corrisponde all'URL l'utente finale ha nel suo/la sua barra degli indirizzi:

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

Come posso ottenere l'URL "end-user"?

risposta

49

La risposta è request.forwardURI (details here).

+2

Link è ora rotto. Vedi http://grails.org/doc/latest/ref/Servlet%20API/request.html –

2

Quando si crea il link alla pagina B è possibile utilizzare il tag createLink per impostare il parametro returnPage:

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

Questo ignora completamente i parametri nell'URI. –

6

Ho costruito questo metodo per ottenere l'URL corrente.

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

funziona come un fascino. – davidforneron

+0

non è necessario scendere agli attributi 'javax', è possibile ottenere lo stesso risultato con' request.forwardURI' – mathifonseca

+1

daIndex deve essere modificato da 7 a 8 se il sito utilizza https. – rlovtang

2

La mia soluzione (Grails 1.3.7) è questo, è possibile copiare e incollare nel vostro regolatore:

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; 

Nella nostra applicazione, non possiamo semplicemente usare g.createLink(.. absolute:true) perché abbiamo finale diverso -user URL a causa di più clienti.

4

Io preferisco usare:

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

quando ho bisogno di ottenere un URL assoluto!

E 'interessante avere percorso relativo troppo:

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

la domanda dice pagina corrente ... –

+0

È un buon approccio, con soluzione standard – IgniteCoders

Problemi correlati