[SPRING] 쿠키로 RestTemplate 클라이언트
SPRING쿠키로 RestTemplate 클라이언트
Java에서 간단한 클라이언트를 작성하여 RESTful API를 통해 액세스 할 수있는 독점적 인 바이러스 검색 소프트웨어를 재사용 할 수있게했습니다. API를 스캔하기 위해 파일을 업로드하려면 Connect에 대한 POST와 파일을 서버에 게시하기위한 POST가 필요합니다. Connect POST에 대한 응답에는 파일을 게시하기 위해 후속 POST에 있어야하는 서버에 의해 설정된 쿠키가 있습니다. 저는 현재 클라이언트에서 Spring RestTemplate을 사용하고 있습니다.
내 질문은 후속 POST로 서버로 전달하기 위해 응답에서 쿠키에 어떻게 액세스합니까? 반환 된 헤더에 해당 메시지가 있음을 알 수 있지만 ResponseEntity에 액세스하는 메소드가 없습니다.
해결법
-
==============================
1.RestTemplate에는 인터페이스 ResponseExtractor
를 정의 할 수있는 메소드가 있습니다.이 인터페이스는 응답의 헤더를 가져 오는 데 사용됩니다. 응답 헤더는 HttpEntity를 사용하여 다시 보내고 다시 추가 할 수 있습니다. RestTemplate에는 인터페이스 ResponseExtractor
를 정의 할 수있는 메소드가 있습니다.이 인터페이스는 응답의 헤더를 가져 오는 데 사용됩니다. 응답 헤더는 HttpEntity를 사용하여 다시 보내고 다시 추가 할 수 있습니다. .add("Cookie", "SERVERID=c52");
이런 식으로 해보십시오.
String cookieHeader = null; new ResponseExtractor<T>(){ T extractData(ClientHttpResponse response) { response.getHeaders(); } }
그때
HttpHeaders headers = new HttpHeaders(); headers.add("Cookie", cookieHeader ); ResponseEntity<byte[]> response = restTemplate.exchange("http://example.com/file/123", GET, new HttpEntity<String>(headers), byte[].class);
이 게시물을 읽으십시오.
-
==============================
2.Java Spring framework RestTemplate의 교환 방법을 사용할 필요가 있습니다.
Java Spring framework RestTemplate의 교환 방법을 사용할 필요가 있습니다.
이 자습서 읽기 : http://codeflex.co/java-rest-client-get-cookie/
-
==============================
3.'java.net.HttpCookie'객체를 사용하여 전체 테스트에서 세션을 처리하는 작은 업데이트.
'java.net.HttpCookie'객체를 사용하여 전체 테스트에서 세션을 처리하는 작은 업데이트.
@Hands shades
import java.io.IOException; import java.net.HttpCookie; import java.net.URI; import java.util.ArrayList; import java.util.List; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.client.ClientHttpRequest; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.ClientHttpResponse; import org.springframework.stereotype.Component; import org.springframework.web.client.RequestCallback; import org.springframework.web.client.ResponseExtractor; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; /** * @link https://stackoverflow.com/questions/22853321/resttemplate-client-with-cookies */ @Component public class RestTemplateWithCookies extends RestTemplate { private final List<HttpCookie> cookies = new ArrayList<>(); public RestTemplateWithCookies() { } public RestTemplateWithCookies(ClientHttpRequestFactory requestFactory) { super(requestFactory); } public synchronized List<HttpCookie> getCoookies() { return cookies; } public synchronized void resetCoookies() { cookies.clear(); } private void processHeaders(HttpHeaders headers) { final List<String> cooks = headers.get("Set-Cookie"); if (cooks != null && !cooks.isEmpty()) { cooks.stream().map((c) -> HttpCookie.parse(c)).forEachOrdered((cook) -> { cook.forEach((a) -> { HttpCookie cookieExists = cookies.stream().filter(x -> a.getName().equals(x.getName())).findAny().orElse(null); if (cookieExists != null) { cookies.remove(cookieExists); } cookies.add(a); }); }); } } @Override protected <T extends Object> T doExecute(URI url, HttpMethod method, final RequestCallback requestCallback, final ResponseExtractor<T> responseExtractor) throws RestClientException { final List<HttpCookie> cookies = getCoookies(); return super.doExecute(url, method, new RequestCallback() { @Override public void doWithRequest(ClientHttpRequest chr) throws IOException { if (cookies != null) { StringBuilder sb = new StringBuilder(); for (HttpCookie cookie : cookies) { sb.append(cookie.getName()).append(cookie.getValue()).append(";"); } chr.getHeaders().add("Cookie", sb.toString()); } requestCallback.doWithRequest(chr); } }, new ResponseExtractor<T>() { @Override public T extractData(ClientHttpResponse chr) throws IOException { processHeaders(chr.getHeaders()); return responseExtractor.extractData(chr); } }); } }
-
==============================
4.RestTemplate을 확장하고 쿠키를 처리하는 간단한 클래스를 작성했습니다.
RestTemplate을 확장하고 쿠키를 처리하는 간단한 클래스를 작성했습니다.
import java.io.IOException; import java.net.URI; import java.util.List; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.client.ClientHttpRequest; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.ClientHttpResponse; import org.springframework.web.client.RequestCallback; import org.springframework.web.client.ResponseExtractor; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; public class RestTemplateWithCookies extends RestTemplate { private List<String> cookies = null; public RestTemplateWithCookies() { } public RestTemplateWithCookies(ClientHttpRequestFactory requestFactory) { super(requestFactory); } private synchronized List<String> getCoookies() { return cookies; } private synchronized void setCoookies(List<String> cookies) { this.cookies = cookies; } public synchronized void resetCoookies() { this.cookies = null; } private void processHeaders(HttpHeaders headers) { final List<String> cookies = headers.get("Set-Cookie"); if (cookies != null && !cookies.isEmpty()) { setCoookies(cookies); } } @Override protected <T extends Object> T doExecute(URI url, HttpMethod method, final RequestCallback requestCallback, final ResponseExtractor<T> responseExtractor) throws RestClientException { final List<String> cookies = getCoookies(); return super.doExecute(url, method, new RequestCallback() { @Override public void doWithRequest(ClientHttpRequest chr) throws IOException { if(cookies != null) { for(String cookie : cookies) { chr.getHeaders().add("Cookie", cookie); } } requestCallback.doWithRequest(chr); } }, new ResponseExtractor<T>() { @Override public T extractData(ClientHttpResponse chr) throws IOException { processHeaders(chr.getHeaders()); return responseExtractor.extractData(chr); } }); } }
-
==============================
5.쿠키를 저장하고 다음 요청에 넣는 인터셉터를 생성하여이 문제를 해결했습니다.
쿠키를 저장하고 다음 요청에 넣는 인터셉터를 생성하여이 문제를 해결했습니다.
public class StatefulRestTemplateInterceptor implements ClientHttpRequestInterceptor { private String cookie; @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { if (cookie != null) { request.getHeaders().add(HttpHeaders.COOKIE, cookie); } ClientHttpResponse response = execution.execute(request, body); if (cookie == null) { cookie = response.getHeaders().getFirst(HttpHeaders.SET_COOKIE); } return response; } }
그런 다음 RestTemplate의 인터셉터 목록에 넣으십시오.
@Bean public RestTemplate restTemplate(RestTemplateBuilder templateBuilder) { return templateBuilder .requestFactory(new BufferingClientHttpRequestFactory(new HttpComponentsClientHttpRequestFactory())) .interceptors(new StatefulRestTemplateInterceptor()) .build(); }
from https://stackoverflow.com/questions/22853321/resttemplate-client-with-cookies by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] @Bean 메소드에`@ConfigurationProperties` 주석 사용하기 (0) | 2019.03.15 |
---|---|
[SPRING] Spring MVC의 HttpServletRequest 객체에서 사용자의 시간대를 얻는 다른 방법이 있습니까? [복제] (0) | 2019.03.15 |
[SPRING] 스프링 설정으로 기본 지역 및 시간대 초기화 (0) | 2019.03.15 |
[SPRING] 확장 성 및 테스트 가능성을 고려하면서 도메인 엔터티를 DTO로 올바르게 변환하는 방법 (0) | 2019.03.15 |
[SPRING] 스프링 부트에서 swagger-ui를 완전히 비활성화하는 방법 (/ swagger-ui.html은 404를 반환해야 함) (0) | 2019.03.15 |