Pergunta

Em um aplicativo Grails, gostaria de enviar um usuário da página A, depois para um formulário na página B e depois voltar à página A novamente.

Para acompanhar qual URL retornar, envio um parâmetro "Returnpage" para a página B contendo o URL da página para retornar (página A).

Atualmente, estou usando o request.getRequesturl () na página A para recuperar o URL da página. No entanto, o URL que recebo do getRequesturl () não corresponde ao URL que o usuário final possui em sua barra de endereços:

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

Como obtenho o URL do "usuário final"?

Foi útil?

Solução

A resposta é request.forwardURI (detalhes aqui).

Outras dicas

Eu construí este método para obter URL atual.

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

Eu prefiro usar:

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

Quando eu preciso obter um URL absoluto!

É interessante conseguir um caminho relativo também:

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

Ao criar o link para a página B, você pode usar a tag CreateLink para definir o parâmetro ReturnPage:

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

Minha solução (Grails 1.3.7) é essa, você pode copiar e colá -lo no seu 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;

Em nossa aplicação, não podemos simplesmente usar g.createLink(.. absolute:true) Porque temos URLs diferentes do usuário final por causa de vários clientes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top