الحصول على عنوان URL للصفحة الحالية في Grails

StackOverflow https://stackoverflow.com/questions/1400773

  •  05-07-2019
  •  | 
  •  

سؤال

في تطبيق Grails ، أود إرسال مستخدم من الصفحة A ، ثم إلى نموذج في الصفحة B ثم العودة إلى الصفحة A مرة أخرى.

لتتبع أي عنوان URL للعودة إلى إرسال معلمة "Returnpage" إلى الصفحة B التي تحتوي على عنوان URL الخاص بالصفحة للعودة إلى (الصفحة أ).

حاليًا أستخدم 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 "المستخدم النهائي"؟

هل كانت مفيدة؟

المحلول

الجواب هو request.forwardURI (التفاصيل هنا).

نصائح أخرى

لقد بنيت هذه الطريقة للحصول على عنوان 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();
}

أفضل استخدام:

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>

الحل الخاص بي (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 المختلفة للمستخدم النهائي بسبب العديد من العملاء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top