Question

Dans une application Grails, j'aimerais envoyer un utilisateur depuis la page A, puis vers un formulaire de la page B puis de revenir à la page A.

Pour garder une trace de l'URL à laquelle renvoyer, j'envoie un "quot_retour". paramètre de la page B contenant l'URL de la page vers laquelle retourner (page A).

J'utilise actuellement request.getRequestURL () à la page A pour récupérer l'URL de la page. Cependant, l'URL que je récupère de getRequestURL () ne correspond pas à l'URL de l'utilisateur final dans sa barre d'adresse:

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

Comment puis-je obtenir le " utilisateur final " URL?

Était-ce utile?

La solution

La réponse est request.forwardURI ( détails ici ).

Autres conseils

J'ai construit cette méthode pour obtenir l'URL actuelle.

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

Je préfère utiliser:

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

quand j'ai besoin d'une URL absolue!

Il est également intéressant d’obtenir un chemin relatif:

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

Lors de la création du lien vers la page B, vous pouvez utiliser la balise createLink pour définir le paramètre returnPage:

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

Ma solution (Grails 1.3.7) est la suivante, vous pouvez la copier et la coller dans votre contrôleur:

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;

Dans notre application, nous ne pouvons pas simplement utiliser g.createLink (.. absolute: true) car nous avons des URL d'utilisateur final différentes en raison de la présence de plusieurs clients.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top