2009-09-09 78 views
20

在Grails應用程序中,我希望將用戶從頁面A發送到頁面B上的表單,然後再返回到頁面A.在Grails中獲取當前頁面的URL

要跟蹤哪個URL返回,我向頁面B發送一個「returnPage」參數,其中包含要返回的頁面的URL(頁面A)。

目前我使用頁面A上的request.getRequestURL()來檢索頁面的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.forwardURIdetails here)。

+2

鏈接現在是打破。請參閱http://grails.org/doc/latest/ref/Servlet%20API/request.html – 2012-06-29 23:37:55

2

當創建鏈接到網頁B則可以使用建立連結標籤設置returnPage參數:

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

這完全忽略了URI中的參數。 – 2017-02-21 09:27:05

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 2014-05-16 19:11:51

+0

沒有必要去'javax'屬性,你可以通過request.forwardURI' – mathifonseca 2014-09-10 19:57:25

+1

得到相同的結果fromIndex需要從7更改爲8,如果該網站使用https。 – rlovtang 2014-09-26 08:25:06

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),因爲我們有不同的結束用戶網址,因爲有多個客戶。

4

我更喜歡使用:

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

,當我需要得到一個絕對的URL!

有趣的是獲得相對路徑也:

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

問題說當前頁... – 2014-04-14 08:31:21

+0

這是一個很好的方法,使用標準解決方案 – IgniteCoders 2018-01-17 11:56:03