web-dev-qa-db-ja.com

Grailsの現在のページのURLを取得する

Grailsアプリケーションで、ユーザーをページAから送信し、次にページBのフォームに送信してから、再びページAに戻したいと思います。

どのURLに戻るかを追跡するために、(ページA)に戻るページのURLを含む「returnPage」パラメーターをページBに送信します。

現在、ページAでrequest.getRequestURL()を使用してページのURLを取得しています。ただし、getRequestURL()から取得したURLは、エンドユーザーのアドレスバーにある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を取得するにはどうすればよいですか?

23
knorv

答えはrequest.forwardURI詳細はこちら )。

53
knorv

現在の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();
}
8
Pablo Moretti

私は使いたい:

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

絶対URLを取得する必要がある場合!

相対パスを取得することも興味深いです。

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

ページBへのリンクを作成するときに、createLinkタグを使用してreturnPageパラメーターを設定できます。

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

私のソリューション(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があるためです。

2
Martin L.