Получение URL текущей страницы в Grails - PullRequest
23 голосов
/ 09 сентября 2009

В приложении Grails я хотел бы отправить пользователя со страницы A, затем в форму на странице B и затем снова вернуться на страницу A.

Чтобы отслеживать, к какому URL-адресу возвращаться, я отправляю параметр «returnPage» на страницу B, содержащую URL-адрес страницы, на которую нужно вернуться (стр. A).

В настоящее время я использую request.getRequestURL () на странице A для получения URL-адреса страницы. Однако URL-адрес, который я получаю от getRequestURL (), не соответствует URL-адресу, который конечный пользователь имеет в своей адресной строке:

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

Как получить URL-адрес "конечного пользователя"?

Ответы [ 5 ]

53 голосов
/ 09 сентября 2009

Ответ request.forwardURI ( подробности здесь ).

8 голосов
/ 25 сентября 2012

Я построил этот метод для получения текущего URL.

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();
}
4 голосов
/ 30 августа 2013

Я предпочитаю использовать:

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

когда мне нужно получить абсолютный URL!

Интересно также получить относительный путь:

createLink(action: "index", controller:"user")
// /project/user
3 голосов
/ 09 сентября 2009

При создании ссылки на страницу B вы можете использовать тег createLink для установки параметра returnPage:

<g:link controller="pageB" 
        action="someaction" 
        params='[returnPage:createLink(action:actionName, params:params)]'>
  Go to Page B
</g:link>
2 голосов
/ 26 ноября 2012

Мое решение (Grails 1.3.7) это то, которое вы можете скопировать и вставить в свой контроллер:

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;

В нашем приложении мы не можем просто использовать g.createLink(.. absolute:true), потому что у нас разные URL-адреса для конечных пользователей из-за нескольких клиентов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...