在Grails应用程序中,我想从页面A发送用户,然后再发送到页面B上的表单,然后再返回页面A.
要跟踪要返回的URL,我向页面B发送一个“returnPage”参数,其中包含要返回的页面的URL(第A页)。
目前,我正在使用第A页上的request.getRequestURL()来检索网页的网址。但是,我从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"
如何获取“最终用户”网址?
答案 0 :(得分:53)
答案是request.forwardURI
(details here)。
答案 1 :(得分:8)
我构建了这个方法来获取当前网址。
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();
}
答案 2 :(得分:4)
我更喜欢使用:
createLink(action: "index", controller:"user", absolute: true)
// http://localhost:8080/project/user
当我需要获得绝对网址时!
获得相对路径也很有趣:
createLink(action: "index", controller:"user")
// /project/user
答案 3 :(得分:3)
创建指向页面B的链接时,可以使用createLink标记设置returnPage参数:
<g:link controller="pageB"
action="someaction"
params='[returnPage:createLink(action:actionName, params:params)]'>
Go to Page B
</g:link>
答案 4 :(得分: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)
,因为我们因多个客户而拥有不同的最终用户网址。