복붙노트

[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. ==============================

    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. ==============================

    2.내가 아는 바로는 UriComponentsBuilder는 쿼리 매개 변수를 자동으로 인코딩하지 않고 인스턴스화 된 원래 HttpUrl 만 인코딩합니다. 즉, 명시 적으로 다음과 같이 인코딩해야합니다.

    내가 아는 바로는 UriComponentsBuilder는 쿼리 매개 변수를 자동으로 인코딩하지 않고 인스턴스화 된 원래 HttpUrl 만 인코딩합니다. 즉, 명시 적으로 다음과 같이 인코딩해야합니다.

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

    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);
    
  4. from https://stackoverflow.com/questions/18138011/url-encoding-using-the-new-spring-uricomponentsbuilder by cc-by-sa and MIT license