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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top