[SPRING] 새로운 Spring UriComponentsBuilder를 사용한 URL 인코딩
SPRING새로운 Spring UriComponentsBuilder를 사용한 URL 인코딩
나는 스프링의 UriComponentsBuilder를 사용하여 oauth 상호 작용을위한 몇 가지 URL을 생성하려고 시도하고있다. 쿼리 매개 변수에는 콜백 URL 및 공백이있는 매개 변수 값과 같은 엔터티가 포함됩니다.
UriComponentBuilder 사용 시도 (UriUtils가 현재 사용되지 않으므로)
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();
불행히도 scope 매개 변수의 공백이 성공적으로 '+'로 대체되는 동안 redirect_uri 매개 변수는 모두 인코딩되지 않습니다.
Eq,
redirect_uri=https://oauth2-login-demo.appspot.com/code
끝내야했다.
redirect_uri=https%3A%2F%2Foauth2-login-demo.appspot.com%2Fcode
그러나 손대지 않았다. 코드 다이빙, 특히 org.springframework.web.util.HierarchicalUriComponents.Type.QUERY_PARAM.isAllowed (c) :
if ('=' == c || '+' == c || '&' == c) {
return false;
}
else {
return isPchar(c) || '/' == c || '?' == c;
}
분명히 ':'및 '/'문자를 허용합니다. 문자는 껌으로해서는 안됩니다. 그것은 다른 종류의 인코딩을해야 할 것입니다. 그러나 저의 삶에 대해, 나는 상상할 수 없습니다. 내가 여기 잘못된 나무를 짖고 있니?
감사
해결법
-
==============================
1.UriComponentsBuilder는 RFC 3986 (http://www.ietf.org/rfc/rfc3986.txt, 특히 URI의 '쿼리'구성 요소에 관한 3.4 절 참조)에 따라 URI를 인코딩합니다.
UriComponentsBuilder는 RFC 3986 (http://www.ietf.org/rfc/rfc3986.txt, 특히 URI의 '쿼리'구성 요소에 관한 3.4 절 참조)에 따라 URI를 인코딩합니다.
'쿼리'구성 요소 내에서 '/'및 ':'문자는 허용되며 이스케이프가 필요하지 않습니다.
예를 들어 '이스케이프'된 '?'및 (선택적으로 '#'문자로) 구분 된 '쿼리'구성 요소는 계층 적 구조가 아니며 '/'문자는 특별한 의미가 없습니다. 따라서 인코딩이 필요 없습니다.
-
==============================
2.내가 아는 바로는 UriComponentsBuilder는 쿼리 매개 변수를 자동으로 인코딩하지 않고 인스턴스화 된 원래 HttpUrl 만 인코딩합니다. 즉, 명시 적으로 다음과 같이 인코딩해야합니다.
내가 아는 바로는 UriComponentsBuilder는 쿼리 매개 변수를 자동으로 인코딩하지 않고 인스턴스화 된 원래 HttpUrl 만 인코딩합니다. 즉, 명시 적으로 다음과 같이 인코딩해야합니다.
String redirectURI= "https://oauth2-login-demo.appspot.com/code"; urlBuilder.queryParam("redirect_uri", URLEncoder.encode(redirectURI,"UTF-8" ));
-
==============================
3.UriComponentsBuilder 문서를 검사하려고하면 build (boolean encoded)라는 메서드가 있습니다.
UriComponentsBuilder 문서를 검사하려고하면 build (boolean encoded)라는 메서드가 있습니다.
샘플 코드 1 :
UriComponents uriComponents = UriComponentsBuilder.fromPath("/path1/path2").build(true);
다음은 샘플 코드 2입니다.
UriComponents uriComponents = UriComponentsBuilder.newInstance() .scheme("https") .host("my.host") .path("/path1/path2").query(parameters).build(true); URI uri= uriComponents.toUri(); ResponseEntity<MyEntityResponse> responseEntity = restTemplate.exchange(uri, HttpMethod.GET, entity, typeRef);
from https://stackoverflow.com/questions/18138011/url-encoding-using-the-new-spring-uricomponentsbuilder by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] java.lang.NoSuchFieldError : INSTANCE (0) | 2018.12.15 |
---|---|
[SPRING] 최대 절전 모드, Java 9 및 SystemException (0) | 2018.12.15 |
[SPRING] Weblogic 10.3.5 Spring 버전 무시 (0) | 2018.12.15 |
[SPRING] 클래스 경로에서 Spring WebApplicationInitializer 유형을 감지하지 못함 (0) | 2018.12.15 |
[SPRING] Java Spring @ 스케줄 된 작업 두 번 실행 (0) | 2018.12.15 |