Java6.0에서만 가능한 쿠키 처리

2008. 5. 10. 19:47Java

이러한 팁은 Java SE 6을 사용하여 개발되었습니다. Java SE 6은 Java SE Downloads 페이지에서 다운로드할 수 있습니다.

이번 호 테크팁의 저자는 JZ Ventures사의 사장이자 주요 컨설턴트인 John Zukowski입니다.
이전에 다루었던 CookieHandler를 이용한 쿠키 관리 팁 에서는 J2SE 5.0이 네트워크 연결을 통해 쿠키 관리를 지원한다고 설명했습니다. 5.0 릴리스에서는 이러한 간략한 설명을 다루기 위한 프레임워크를 제공했지만 모든 작업을 수행하는 일은 개발자의 몫으로 남았습니다. 정의된 API를 따르기만 하면 되지만 실제로 프로그램에서 쿠키를 제대로 관리하려면 더 많은 작업이 수반됩니다.

J2SE 5.0 API를 다시 간략하게 살펴 보면 모호한 CookieHandler 클래스를 사용할 수 있게 되지만 실제 구현도, 스토리지 메커니즘도, 스토리지 정책도, 저장할 대상도 아무 것도 존재하지 않습니다. Java SE 6으로 이동하면서 CookieManager 클래스는 이러한 CookieHandler의 구현을 제공합니다. CookieStore는 스토리지 메커니즘이고, CookiePolicy는 쿠키를 수락하거나 거부하는 정책을 제공합니다. 그리고 HttpCookie는 저장할 개체입니다.

J2SE 5.0에서 수행하기 어려웠던 작업들이 Java SE 6에서는 기존 클래스를 활용한 간단한 작업이 되었습니다.

다음은 쿠키 작업을 위해 작동하는 J2SE 5.0 프로그램입니다.

   import java.io.*;
   import java.net.*;
   import java.util.*;

   public class Fetch {
     public static void main(String args[]) throws Exception {
       if (args.length == 0) {
         System.err.println("URL missing");
         System.exit(-1);
       }
       String urlString = args[0];
       CookieHandler.setDefault(new ListCookieHandler());
       URL url = new URL(urlString);
       URLConnection connection = url.openConnection();
       Object obj = connection.getContent();
       url = new URL(urlString);
       connection = url.openConnection();
       obj = connection.getContent();
     }
   }

setDefault 메소드는 중간에 CookieHandler를 호출합니다. ListCookieHandler 클래스는 기본 CookieHandler의 팁 구현이었습니다.

동일한 프로그램의 Java SE 6 버전은 거의 동일하며 다음 행만 다릅니다.

   CookieHandler.setDefault(new CookieManager());

추가 코드는 제공하지 않아도 됩니다. 간단하게 다른 API 사이를 이동할 수 있습니다. 다른 차이점은 있지만 페치(Fetch) 프로그램의 한 행을 변경하면 두 번째 네트워크 연결이 첫 번재 연결에서 반환된 쿠키를 사용합니다.

차이점은 다음과 같습니다. Java SE 6에는 CookiePolicy가 있습니다. 이것은 모든 쿠키를 수락하거나, 쿠키를 수락하지 않거나, 원래 호스트의 쿠키만 수락하는 기능인 CookieManager를 제공합니다. 다른 정책으로 CookieManager를 설정하려면 CookiePolicy 인터페이스의 상수 ACCEPT_ALL, ACCEPT_NONE 또는 ACCEPT_ORIGINAL_SERVER 중 하나를 사용합니다. 아무 것도 설정하지 않을 경우 마지막 옵션은 기본값이 됩니다. 쿠키 관리자를 구성하려면 아래에 표시된 대로 적절한 상수로 setCookiePolicy 메소드를 호출하십시오.

   CookieManager manager = new CookieManager();
   manager.setCookiePolicy(CookiePolicy.ACCEPT_NONE);
   CookieHandler.setDefault(manager);


 

그리고 CookieStoreCookiePolicy 인수 모두를 수락하는 CookieManager에 대한 두 번째 구성자를 호출할 수 있습니다.

   CookieManager(CookieStore store, CookiePolicy cookiePolicy)

널 저장소에 전달되면 시스템이 사전 정의된 메모리 내장 버전을 사용합니다. 쿠키의 장기 스토리지를 제공하려면 고유한 인터페이스 구현을 정의할 수도 있습니다.

수정된 페치 프로그램 버전을 소개하기 전에 API 차이점을 하나 더 설명하겠습니다. 바로 쿠키 jar, err..., 관리자 등에서 쿠키 목록을 가져오는 방법입니다. CookieManager 클래스에는 CookieStore를 가져오는 getCookieStore 메소드가 있습니다. getCookies 메소드로 저장소에 쿠키 목록을 요청하면 목록 전체를 반복할 수 있습니다.

다음은 Java SE 6 버전의 쿠키 처리 API를 활용하는 이전 프로그램의 수정된 버전입니다. 기본 프로그램은 크게 변경되지 않았지만 지원되는 모든 사용자 정의 클래스는 이제 더 이상 필요하지 않습니다.

import java.io.*;
import java.net.*;
import java.util.*;

public class Fetch {
  public static void main(String args[]) throws Exception {
    Console console = System.console();
    if (args.length == 0) {
      System.err.println("URL missing");
      System.exit(-1);
    }
    String urlString = args[0];
    CookieManager manager = new CookieManager();
    manager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
    CookieHandler.setDefault(manager);
    URL url = new URL(urlString);
    URLConnection connection = url.openConnection();
    Object obj = connection.getContent();
    url = new URL(urlString);
    connection = url.openConnection();
    obj = connection.getContent();
    CookieStore cookieJar = manager.getCookieStore();
    List<HttpCookie> cookies = cookieJar.getCookies();
    for (HttpCookie cookie: cookies) {
      console.printf("Cookie: %s%n", cookie);
    }
  }
}


 

특정 URL을 방문할 때 시스템에 쿠키가 남는지 확인하려면 프로그램을 컴파일하고 실행하십시오. ACCEPT_ALL을 사용할 수 없으면 http://www.sun.com/을 방문해도 쿠키가 표시되지 않지만 모두 사용 가능하게 설정하면 세 개가 표시됩니다. 여러분이 실행하면 다른 결과가 생성될 것입니다.

> java Fetch http://www.sun.com
Cookie: JROUTE=9999
Cookie: JSESSIONID=999999995d3f13ffffffffc68433979b7f5b0
Cookie: Starload=star-fep7

그렇습니다. J2SE 5.0 쿠키 처리 메커니즘에서 Java SE 6으로의 이동은 매우 쉽습니다. 기본 기능에 만족하면 추가로 인터페이스를 구현하지 않아도 됩니다.




출처 : http://www.sdnkorea.com/blog/412