2009-09-09 20 views
20

Grailsアプリケーションでは、ページAのユーザーを送信してから、ページBのフォームに送信してからページAに戻ります。Grailsで現在のページのURLを取得する

返すURLを追跡するために、私は戻ってくるページのURLを含むページBに "returnPage"パラメータを送ります(ページA)。

現在、ページのURLを取得するために、ページAのrequest.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" 

:しかし、私はgetRequestURL()から取得するURLは、エンドユーザが彼/彼女のアドレスバーに持っているURLに対応していませんか?

答えて

49

答えはrequest.forwardURIdetails here)です。

+2

リンクは現在壊れています。 http://grails.org/doc/latest/ref/Servlet%20API/request.html –

2

ページBへのリンクを作成する場合は、あなたがreturnPageパラメータを設定するCREATELINKタグを使用することができます。

<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

httpsを使用する場合、fromIndexを7から8に変更する必要があります。 – 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)を使用することはできません複数の顧客のために、ユーザーのURL。

4

私が使用することを好む:

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

は、ときに私は絶対URLを取得する必要があります!

それはあまりにも相対パスを取得することは興味深いです:

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

質問には現在のページが表示されます... –

+0

標準的な解決策では良いアプローチです – IgniteCoders

関連する問題