Domanda

In un'applicazione Grails vorrei inviare un utente dalla pagina A, quindi a un modulo nella pagina B e quindi di nuovo alla pagina A.

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

Attualmente sto usando request.getRequestURL () nella pagina A per recuperare l'URL della pagina. Tuttavia, l'URL che ottengo da getRequestURL () non corrisponde all'URL che l'utente finale ha nella 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'utente finale " URL?

È stato utile?

Soluzione

La risposta è request.forwardURI ( dettagli qui ).

Altri suggerimenti

Ho creato 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();
}

Preferisco usare:

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

quando ho bisogno di ottenere un url assoluto!

È interessante anche ottenere un percorso relativo:

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

Quando si crea il collegamento 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>

La mia soluzione (Grails 1.3.7) è questa, puoi copiarla e incollarla nel tuo controller:

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 URL dell'utente finale diversi a causa di più clienti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top