2009-09-09 2 views
20

В приложении Grails я бы хотел отправить пользователя со страницы A, затем в форму на странице B, а затем снова на страницу A.Получение URL-адреса текущей страницы в Grails

Чтобы отслеживать, какой 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?

ответ

49

Ответ request.forwardURI (details here).

+2

Ссылка теперь сломана. См. Http://grails.org/doc/latest/ref/Servlet%20API/request.html –

2

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

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

Это полностью игнорирует параметры в URI. –

6

Я построил этот метод, чтобы получить текущий 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(); 
} 
+0

работает как шарм. – davidforneron

+0

нет необходимости переходить к атрибутам 'javax', вы можете получить тот же результат с' request.forwardURI' – mathifonseca

+1

fromIndex нужно изменить с 7 на 8, если на сайте используется https. – rlovtang

2

Мое решение (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), потому что мы имеем различный конец -user URL из-за нескольких клиентов.

4

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

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

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

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

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

вопрос говорит о текущей странице ... –

+0

Это хороший подход, со стандартным решением – IgniteCoders

Смежные вопросы