2009-09-29 42 views
56

Tôi muốn tạo URL dựa trên URL được khách hàng sử dụng cho yêu cầu hoạt động. Có điều gì thông minh hơn là lấy đối tượng HttpServletRequest hiện tại và đó là phương thức getParameter...() để xây dựng lại URL hoàn chỉnh bao gồm (và chỉ) đó là tham số GET.Cách tốt nhất để lấy URL hiện tại trong Spring MVC là gì?

Làm rõ: Nếu có thể, tôi muốn từ chức sử dụng đối tượng HttpServletRequest.

Trả lời

80

Cũng có hai phương pháp để truy cập dữ liệu này dễ dàng hơn, nhưng giao diện không cung cấp khả năng nhận toàn bộ URL bằng một cuộc gọi. Bạn phải xây dựng theo cách thủ công:

public static String makeUrl(HttpServletRequest request) 
{ 
    return request.getRequestURL().toString() + "?" + request.getQueryString(); 
} 

Tôi không biết cách làm điều này với bất kỳ cơ sở nào của Spring MVC.

Nếu bạn muốn truy cập các yêu cầu hiện tại mà không đi qua nó ở khắp mọi nơi bạn sẽ có thêm một người biết lắng nghe trong web.xml:

<listener> 
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
</listener> 

Và sau đó sử dụng này để có được những yêu cầu ràng buộc với chủ đề hiện tại:

((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest() 
+0

Ok, đây là một cách tiếp cận tương tự như những gì tôi đã làm cho đến nay. Nhưng tôi đang tìm kiếm một cách để làm điều này mà không thực sự sử dụng đối tượng 'HttpServletRequest'. Điều này là do tôi đang sử dụng một số lớp/phương thức trợ giúp và tôi không muốn truyền đối tượng yêu cầu mỗi lần. – Koraktor

+0

Ok, tôi biết ý của bạn là gì và thêm thông tin bạn cần để truy cập yêu cầu hiện tại mà không cần chuyển nó đi. – Daff

+0

Cảm ơn bạn đã nhắc nhở về người nghe. Tôi vẫn còn mới đối với Spring (và phát triển web Java nói chung). Tôi hiện đang sử dụng mã của bạn kết hợp với 'UrlUtils' của Spring Security. Làm việc như một say mê. – Koraktor

8

trong file jsp:

request.getAttribute("javax.servlet.forward.request_uri") 
12

URI lớp Java có thể giúp bạn trong số này:

public static String getCurrentUrl(HttpServletRequest request){ 
    URL url = new URL(request.getRequestURL().toString()); 
    String host = url.getHost(); 
    String userInfo = url.getUserInfo(); 
    String scheme = url.getProtocol(); 
    String port = url.getPort(); 
    String path = request.getAttribute("javax.servlet.forward.request_uri"); 
    String query = request.getAttribute("javax.servlet.forward.query_string"); 

    URI uri = new URI(scheme,userInfo,host,port,path,query,null) 
    return uri.toString(); 
} 
+0

tên máy chủ của nó chỉ – Vivek

25

Thay vì sử dụng RequestContextHolder trực tiếp, bạn cũng có thể sử dụng ServletUriComponentsBuilder và phương pháp tĩnh của nó:

  • ServletUriComponentsBuilder.fromCurrentContextPath()
  • ServletUriComponentsBuilder.fromCurrentServletMapping()
  • ServletUriComponentsBuilder.fromCurrentRequestUri()
  • ServletUriComponentsBuilder.fromCurrentRequest()

Chúng sử dụng RequestContextHolder dưới mui xe, nhưng cung cấp thêm sự linh hoạt để tạo URL mới bằng cách sử dụng các khả năng của UriComponentsBuilder.

Ví dụ:

ServletUriComponentsBuilder builder = ServletUriComponentsBuilder.fromCurrentRequestUri(); 
builder.scheme("https"); 
builder.replaceQueryParam("someBoolean", false); 
URI newUri = builder.build().toUri(); 
+0

Cảm ơn bạn, đây là câu trả lời hữu ích nhất cho tôi. – John

+0

Phải là câu trả lời được chấp nhận kể từ Mùa xuân 3.1 – m4rtin

+0

@ m4rtin Tôi đã trả lời câu hỏi của riêng mình và không muốn nhận tín dụng cho người đầu tiên đã giúp tôi giải quyết vấn đề của mình. – Koraktor

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