2009-09-09 40 views
20

En una aplicación Grails, me gustaría enviar un usuario de la página A, luego a un formulario en la página B y luego volver a la página A nuevamente.Obtener la URL de la página actual en Grails

Para realizar un seguimiento de la URL a la que volver, envío un parámetro "returnPage" a la página B que contiene la URL de la página para volver a (página A).

Actualmente estoy usando request.getRequestURL() en la página A para recuperar la URL de la página. Sin embargo, la URL que recibo de getRequestURL() no se corresponde con la URL que el usuario final tiene en su/ella barra de direcciones:

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

¿Cómo se obtiene la URL "usuario final"?

Respuesta

49

La respuesta es request.forwardURI (details here).

+2

enlace se ha roto. Consulte http://grails.org/doc/latest/ref/Servlet%20API/request.html –

2

Al crear el enlace a la página B se puede utilizar la etiqueta CreateLink para establecer el parámetro returnPage:

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

Esto omite por completo los parámetros en el URI. –

6

que construyeron este método para obtener la URL actual.

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

funciona como un encanto. – davidforneron

+0

no es necesario ir a los atributos 'javax', puede obtener el mismo resultado con' request.forwardURI' – mathifonseca

+1

fromIndex debe cambiarse de 7 a 8 si el sitio usa https. – rlovtang

2

Mi solución (Grails 1.3.7) es éste, puede copiar y pegar en su controlador:

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; 

En nuestra aplicación, no podemos utilizar g.createLink(.. absolute:true) porque tenemos diferentes fines - URL de usuario debido a múltiples clientes.

4

Yo prefiero usar:

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

cuando necesito para obtener una URL absoluta!

Es interesante para obtener la ruta relativa demasiado:

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

la pregunta dice página actual ... –

+0

Es un buen enfoque, con solución estándar – IgniteCoders

Cuestiones relacionadas