2009-09-09 39 views
20

Trong ứng dụng Grails, tôi muốn gửi người dùng từ trang A, sau đó đến biểu mẫu trên trang B và sau đó quay lại trang A lần nữa.Lấy URL của trang hiện tại trong Grails

Để theo dõi URL nào cần quay lại tôi gửi thông số "returnPage" đến trang B chứa URL của trang để quay lại (trang A).

Hiện tại tôi đang sử dụng request.getRequestURL() trên trang A để truy xuất URL của trang. Tuy nhiên, URL tôi nhận được từ getRequestURL() không tương ứng với URL người dùng cuối có trong thanh địa chỉ của anh/cô ấy:

request.getRequestURL() == "http://localhost:8080/something/WEB-INF/grails-app/views/layouts/main.gsp" 
URL in address bar == "http://localhost:8080/something/some/thing" 

Làm thế nào để có được những "người dùng cuối" URL?

Trả lời

49

Câu trả lời là request.forwardURI (details here).

+2

liên kết hiện đang bị phá vỡ. Xem http://grails.org/doc/latest/ref/Servlet%20API/request.html –

2

Khi tạo liên kết tới trang B bạn có thể sử dụng thẻ CreateLink để thiết lập các thông số returnPage:

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

Điều này hoàn toàn bỏ qua các thông số trong URI. –

6

tôi đã xây dựng phương pháp này để có được url hiện tại.

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

hoạt động như một sự quyến rũ. – davidforneron

+0

không cần phải chuyển xuống thuộc tính 'javax', bạn có thể nhận được kết quả tương tự với' request.forwardURI' – mathifonseca

+1

fromIndex cần phải được thay đổi từ 7 đến 8 nếu trang web sử dụng https. – rlovtang

2

Giải pháp của tôi (Grails 1.3.7) là một trong những điều này, bạn có thể sao chép và dán nó vào điều khiển của bạn:

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; 

Trong ứng dụng của chúng tôi, chúng ta không thể chỉ cần sử dụng g.createLink(.. absolute:true) vì chúng tôi có kết thúc khác nhau URL người dùng do nhiều khách hàng.

4

Tôi thích sử dụng:

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

khi tôi cần để có được một địa chỉ tuyệt đối!

Thật thú vị để có được đường dẫn tương đối quá:

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

câu hỏi cho biết trang hiện tại ... –

+0

Đó là một cách tiếp cận tốt, với giải pháp chuẩn – IgniteCoders

Các vấn đề liên quan