2013-08-08 7 views
15

Ich versuche, Spring UriComponentsBuilder zu verwenden, um einige URLs für oauth Interaktion zu generieren. Die Abfrageparameter enthalten solche Entitäten wie Callback-URLs und Parameterwerte mit Leerzeichen in ihnen.URL-Codierung mit dem neuen Spring UriComponentsBuilder

Versuch UriComponentBuilder zu verwenden (da UriUtils jetzt veraltet)

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(); 

Leider, während der Raum in dem Umfang Parameter erfolgreich mit '+' ersetzt wird, ist die redirect_uri Parameter bei allen URL nicht codiert.

Z. B,

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

sollte

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

gelandet war aber unberührt. Tauchen in den Code, insbesondere org.springframework.web.util.HierarchicalUriComponents.Type.QUERY_PARAM.isAllowed (c):

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

eindeutig erlaubt ':' und '/' Zeichen, die durch Gummi, es shouldn‘ t. Es muss eine andere Art von Kodierung sein, aber für das Leben von mir kann ich mir nicht vorstellen was. Spreche ich hier die falschen Bäume?

Dank

Antwort

15

UriComponentsBuilder Encodieren Ihre URI gemäß RFC 3986 (siehe http://www.ietf.org/rfc/rfc3986.txt, insbesondere Abschnitt 3.4, die über die ‚query‘ Komponente einer URI).

Innerhalb der 'query' Komponente sind die Zeichen '/' und ':' erlaubt und müssen nicht entfernt werden. Das Zeichen '/' zum Beispiel: Die Komponente 'query' (die eindeutig durch '' 'und' '' Zeichen getrennt ist) ist nicht hierarchisch und das Zeichen '/' hat keine spezielle Bedeutung. Es braucht also keine Kodierung.

+0

Dies ist nicht korrekt, weil '&' und andere Zeichen mit Bedeutung ebenfalls nicht maskiert sind. UriComponentsBuilder codiert den Abfrageparameter nicht per URL. –

+0

@Adam Millerchip, verstehe ich nicht - sicherlich & _ist_ immer entkommen.Das OP hat den Code-Snippet-Snippet eingefügt, der zeigt, dass & nicht erlaubt ist, und auch nicht = oder +. All dies würde entkommen. – simonh

+0

Sie würden das denken, aber es tut es nicht. Probieren Sie es aus und sehen Sie. –

6

von dem, was ich verstehe, ist UriComponentsBuilder nicht die Abfrageparameter automatisch kodieren, nur die ursprüngliche HttpUrl es mit instanziiert wird. Mit anderen Worten, Sie haben noch kodieren explizit:

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

Nun ... die "encode" -Methode besagt: Codiert alle URI-Komponenten mit ihren spezifischen Codierungsregeln und gibt das Ergebnis als neue {@code UriComponents} -Instanz zurück. Dies scheint zu implizieren, dass es eine URL-Codierung durchführt. Es scheint zu "Type" (in diesem Fall Type.QUERY_PARAM) zu entscheiden, welche Zeichen zu kodieren sind. Es wird also einige Zeichen kodieren, aber nicht einige sehr wichtige. Was macht die Methode encode, wenn sie keine Abfrageparameter für die URL-Codierung codiert? – ticktock

+0

Es kodiert die * URL *, die Sie übergeben, aber nicht jede Abfrage param – Black

+7

Nun .. das ist nicht sehr nützlich. Es ist seltsam, weil es ein URL-Builder ist und Sie Abfrageparameter hinzufügen, dann bauen und dann verschlüsseln. Ich hätte angenommen, dass es mir eine sichere URL aufbaute. Warum sollten Abfrageparameter hinzugefügt werden, wenn sie nicht mit der URL codiert werden? – ticktock

Verwandte Themen