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