Obteniendo la URL de la página actual en Grails
-
05-07-2019 - |
Pregunta
En una aplicación de Grails, me gustaría enviar un usuario desde la página A, luego a un formulario en la página B y luego volver a la página A.
Para realizar un seguimiento de la URL a la que debo volver, envío una " returnPage " parámetro 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 obtengo de getRequestURL () no corresponde a la URL que el usuario final tiene en su 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 obtengo el " usuario final " URL?
Solución
La respuesta es request.forwardURI
( detalles aquí ).
Otros consejos
Construí 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();
}
Prefiero usar:
createLink(action: "index", controller:"user", absolute: true)
// http://localhost:8080/project/user
cuando necesito obtener una URL absoluta!
También es interesante obtener una ruta relativa:
createLink(action: "index", controller:"user")
// /project/user
Al crear el enlace a la página B, puede usar 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>
Mi solución (Grails 1.3.7) es esta, puedes copiarla y pegarla en tu 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 simplemente usar g.createLink (.. absolute: true)
porque tenemos diferentes URL de usuario final debido a varios clientes.