2013-08-08 45 views
15

Tôi đang cố gắng sử dụng UriComponentsBuilder của mùa xuân để tạo một số url cho tương tác oauth. Các tham số truy vấn bao gồm các thực thể như url gọi lại và giá trị tham số có dấu cách trong chúng.Mã hóa URL bằng cách sử dụng Spring UriComponentsBuilder

Cố gắng sử dụng UriComponentBuilder (vì UriUtils hiện đang bị phản đối)

UriComponentsBuilder urlBuilder = UriComponentsBuilder.fromHttpUrl(oauthURL); 
urlBuilder.queryParam("client_id", clientId); 
urlBuilder.queryParam("redirect_uri", redirectURI); 
urlBuilder.queryParam("scope", "test1 test2"); 

String url = urlBuilder.build(false).encode().toUriString(); 

Thật không may, trong khi không gian trong tham số phạm vi được thay thế thành công với '+', tham số redirect_uri không phải là ở tất cả các url được mã hóa.

ví dụ,

redirect_uri=https://oauth2-login-demo.appspot.com/code 

nên đã kết thúc

redirect_uri=https%3A%2F%2Foauth2-login-demo.appspot.com%2Fcode 

nhưng đã bị ảnh hưởng. Lặn vào mã, org.springframework.web.util.HierarchicalUriComponents.Type.QUERY_PARAM.isAllowed đặc biệt (c):

if ('=' == c || '+' == c || '&' == c) { 
    return false; 
} 
else { 
    return isPchar(c) || '/' == c || '?' == c; 
} 

cho phép rõ ràng ':' và '/' nhân vật, mà theo kẹo cao su, nó shouldn' t. Nó phải được làm một số loại mã hóa khác, mặc dù cho cuộc sống của tôi, tôi không thể tưởng tượng những gì. Tôi có sủa cây sai ở đây không?

Cảm ơn

Trả lời

15

UriComponentsBuilder được mã hóa URI của bạn phù hợp với RFC 3986 (xem http://www.ietf.org/rfc/rfc3986.txt, đặc biệt là phần 3.4 đó là về 'truy vấn' thành phần của một URI).

Trong phần 'truy vấn', các ký tự '/' và ':' được phép và không cần thoát.

Để lấy ký tự '/' chẳng hạn: thành phần 'truy vấn' (được phân tách rõ ràng bằng ký tự '?' Và (tùy chọn) '#'), không phân cấp và ký tự '/' không có Ý nghĩa đặc biệt. Vì vậy, nó không cần mã hóa.

+0

Điều này không đúng, vì '&' và các ký tự khác có ý nghĩa cũng không được thoát. UriComponentsBuilder không phải là mã hóa url tham số truy vấn. –

+0

@Adam Millerchip, tôi không hiểu - chắc chắn & _is_ bị trốn thoát.OP đã dán đoạn trích đoạn mã cho biết rằng & không được phép, cũng không phải là = hoặc +. Tất cả những thứ này sẽ bị thoát. – simonh

+0

Bạn sẽ nghĩ như vậy, nhưng không. Hãy thử nó và xem. –

6

từ những gì tôi hiểu, UriComponentsBuilder không mã hóa các thông số truy vấn tự động, chỉ cần bản gốc HttpUrl nó khởi tạo với. Nói cách khác, bạn vẫn phải rõ ràng mã hóa:

String redirectURI= "https://oauth2-login-demo.appspot.com/code"; 
urlBuilder.queryParam("redirect_uri", URLEncoder.encode(redirectURI,"UTF-8")); 
+1

Vâng ... phương thức 'mã hóa' cho biết: Mã hóa tất cả các thành phần URI sử dụng các quy tắc mã hóa cụ thể của chúng và trả về kết quả dưới dạng một phiên bản {@code UriComponents} mới. Điều này dường như ngụ ý nó mã hóa URL. Dường như để nó thành 'Loại' (trong trường hợp này là Type.QUERY_PARAM) để quyết định ký tự nào cần mã hóa. Vì vậy, nó sẽ mã hóa một số ký tự .. nhưng không phải một số ký tự rất quan trọng. Phương thức mã hóa sẽ làm gì nếu không mã hóa các tham số truy vấn cho mã hóa URL? – ticktock

+0

nó mã hóa * URL * bạn chuyển đến nó, nhưng không phải mỗi tham số truy vấn – Black

+7

Vâng .. đó không phải là vô cùng hữu ích. Thật lạ vì nó là một trình tạo URL và bạn thêm các tham số truy vấn, THEN build và THEN encode. Tôi đã cho rằng nó đã xây dựng cho tôi một URL an toàn. Điểm thêm thông số truy vấn nếu chúng không được mã hóa bằng URL là gì? – ticktock

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