티스토리 툴바


서버와 통신 후에 반환되는 Cookie를 안드로이드가 알아서 추출해서 관리해주는 줄 알았는데.. 해당 방법을 찾지 못했다. (혹시 방법 아시는분은 알려주세요!) 서버에서 받은 Cookie를 추출해서 CookieManager에 넣어주고.. 다시 꺼내서 사용하는 작업은 우리가 수동으로 해야하는 것이다. 해당 글에서는 Spring RestTemplate을 사용해 서버와 통신한 후에 Cookie를 추출하고, 보관하고, 사용하는 방법을 설명한다.

한번 사용했던 RestTemplate 객체를 멤버변수에 모셔두고 계속 사용하는 방법도 있을것이다. 그러나, Android는 멤버변수의 값을 항상 보존하지 않는다. 앱을 벗어나 카톡도하고.. 네이버도하고.. 좀 놀다오면, 전역변수 값이 날아가있는 경우가 태반이다. 그래서 CookieManager에 보관하고 필요할 때 꺼내써야한다.


1. RestTemplate의 exchange method를 사용해 서버와 통신
RestTemplate의 exchange method를 사용해 서버와 통신한다. 여기서 반환되는 HttpEntity<?> 가 필요하다.
postForObject나.. getForObject나.. execute를 실행했을 때 얻는 결과를 얻으려면 HttpEntity의 getBody()를 호출하면 된다.
서버와 통신하는 부분은 Case by Case여서 예제는 생략한다.

2. Cookie 추출
exchange method를 사용해 서버와 통신하면 httpEntity 객체를 반환받을 수 있다. httpEntity에서 Cookie를 획득하는 방법은 아래와 같다.

// 서버와의 통신
HttpEntity<?> httpEntity = restTemplate.exchange(......);

// header 추출
HttpHeaders headers = httpEntity.getHeaders();

// cookie 추출
List<String> cookies = headers.get("Set-Cookie"); // key=value 의 List를 반환한다.



3. Cookie 보관하기
추출한 Cookie를 CookieManager에 보관하는 방법은 "[Android] Cookie는 CookieManager를 사용해 관리하는것이 좋다."를 참고한다.



4. RestTemplate을 사용해 서버와 통신할 때 CookieManager에 있는 Cookie를 꺼내와 포함시키기

RestTemplate의 RequestFactory 설정을 통해 Cookie를 포함시킬 수 있다.

// CookieManager를 가져오고..
final CookieManager cookieManager = CookieManager.getInstance();

// restTemplate에 requestFactory를 설정한다.
restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory() {
@Override
protected void postProcessHttpRequest(HttpUriRequest httpRequest) {
super.postProcessHttpRequest(httpRequest);

                // cookieManager에 해당 domain의 cookie를 꺼내온다.
String cookies = cookieManager.getCookie("http://www.domain.com");

// request header에 cookie를 추가한다.
httpRequest.setHeader("Cookie", cookies);

        }
});


저작자 표시
Posted by cherrykyun