Core Java Technologies Tech Tip¿¡ ¿À½Å ¿©·¯ºÐÀ» ȯ¿µÇÕ´Ï´Ù
Core Java Technologies
TECHNICAL TIPS
2005³â 10¿ù 18ÀÏÀÚ
  À̹ø È£¿¡¼­´Â,

» CookieHandler¸¦ ÀÌ¿ëÇÑ ÄíŰ °ü¸®
» Å×Å©ÆÁ ÄûÁî Á¤´ä

À» ´Ù·ç°Ô µË´Ï´Ù.



CookieHandler¸¦ ÀÌ¿ëÇÑ ÄíŰ °ü¸®
 

ÀÚ¹Ù Ç÷§ÆûÀÇ °æ¿ì, URLÀ» ÅëÇÑ ¿ÀºêÁ§Æ® ¾×¼¼½º´Â ÀÏ·ÃÀÇ ÇÁ·ÎÅäÄÝ Çڵ鷯¿¡ ÀÇÇØ °ü¸®µÈ´Ù. URLÀÇ Ã¹ ºÎºÐÀº »ç¿ëµÇ´Â ÇÁ·ÎÅäÄÝÀ» ¾Ë·ÁÁִµ¥, ¿¹¸¦ µé¾î URLÀÌ file:·Î ½ÃÀÛµÇ¸é ·ÎÄà ÆÄÀÏ ½Ã½ºÅÛ »ó¿¡¼­ ¸®¼Ò½º¸¦ ¾×¼¼½ºÇÒ ¼ö ÀÖ´Ù. ¶Ç, URLÀÌ http:·Î ½ÃÀ۵Ǹé ÀÎÅͳÝÀ» ÅëÇØ ¸®¼Ò½º ¾×¼¼½º°¡ ÀÌ·ç¾îÁø´Ù. ÇÑÆí, J2SE 5.0Àº ½Ã½ºÅÛ ³»¿¡ ¹Ýµå½Ã Á¸ÀçÇØ¾ß ÇÏ´Â ÇÁ·ÎÅäÄÝ Çڵ鷯(http, https, file, ftp, jar µî)¸¦ Á¤ÀÇÇÑ´Ù.

J2SE 5.0Àº http ÇÁ·ÎÅäÄÝ Çڵ鷯 ±¸ÇöÀÇ ÀϺηΠCookieHandler¸¦ Ãß°¡Çϴµ¥, ÀÌ Å¬·¡½º´Â Äí۸¦ ÅëÇØ ½Ã½ºÅÛ ³»¿¡¼­ »óÅÂ(state)°¡ ¾î¶»°Ô °ü¸®µÉ ¼ö ÀÖ´ÂÁö¸¦ º¸¿©ÁØ´Ù. ÄíŰ´Â ºê¶ó¿ìÀúÀÇ Ä³½Ã¿¡ ÀúÀåµÈ µ¥ÀÌÅÍÀÇ ´ÜÆíÀ̸ç, Çѹø ¹æ¹®ÇÑ À¥ »çÀÌÆ®¸¦ ´Ù½Ã ¹æ¹®ÇÒ °æ¿ì ÄíŰ µ¥ÀÌÅ͸¦ ÀÌ¿ëÇÏ¿© Àç¹æ¹®ÀÚÀÓÀ» ½Äº°ÇÑ´Ù. ÄíŰ´Â °¡·É ¿Â¶óÀÎ ¼îÇΠīƮ °°Àº »óÅ Á¤º¸¸¦ ±â¾ïÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù. ÄíŰ¿¡´Â ºê¶ó¿ìÀú¸¦ Á¾·áÇÒ ¶§±îÁö ´ÜÀÏ À¥ ¼¼¼Ç µ¿¾È µ¥ÀÌÅ͸¦ º¸À¯ÇÏ´Â ´Ü±â ÄíŰ¿Í 1ÁÖ ¶Ç´Â 1³â µ¿¾È µ¥ÀÌÅ͸¦ º¸À¯ÇÏ´Â Àå±â Äí۰¡ ÀÖ´Ù.

J2SE 5.0¿¡¼­ ±âº»°ªÀ¸·Î ¼³Ä¡µÇ´Â Çڵ鷯´Â ¾øÀ¸³ª, Çڵ鷯¸¦ µî·ÏÇÏ¿© ¾ÖÇø®ÄÉÀ̼ÇÀÌ Äí۸¦ ±â¾ïÇß´Ù°¡ http Á¢¼Ó ½Ã¿¡ À̸¦ ¹Ý¼ÛÇϵµ·Ï ÇÒ ¼ö´Â ÀÖ´Ù.

CookieHandler Ŭ·¡½º´Â µÎ ½ÖÀÇ °ü·Ã ¸Þ¼Òµå¸¦ °¡Áö´Â Ãß»ó Ŭ·¡½ºÀÌ´Ù. ù ¹øÂ° ½ÖÀÇ ¸Þ¼Òµå´Â ÇöÀç ¼³Ä¡µÈ Çڵ鷯¸¦ ã¾Æ³»°í °¢ÀÚÀÇ Çڵ鷯¸¦ ¼³Ä¡ÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù.

  • getDefault()
  • setDefault(CookieHandler)

º¸¾È ¸Å´ÏÀú°¡ ¼³Ä¡µÈ ¾ÖÇø®ÄÉÀ̼ÇÀÇ °æ¿ì, Çڵ鷯¸¦ ¾ò°í À̸¦ ¼³Á¤ÇÏ·Á¸é Ưº° Çã°¡¸¦ ¹Þ¾Æ¾ß ÇÑ´Ù. ÇöÀçÀÇ Çڵ鷯¸¦ Á¦°ÅÇÏ·Á¸é Çڵ鷯·Î nullÀ» ÀÔ·ÂÇÑ´Ù. ¶ÇÇÑ ¾Õ¼­ ¾ê±âÇßµíÀÌ ±âº»°ªÀ¸·Î ¼³Á¤µÇ¾î ÀÖ´Â Çڵ鷯´Â ¾ø´Ù.

µÎ ¹øÂ° ½ÖÀÇ ¸Þ¼Òµå´Â °¢ÀÚ°¡ °ü¸®ÇÏ´Â ÄíŰ ij½Ã·ÎºÎÅÍ Äí۸¦ ¾ò°í À̸¦ ¼³Á¤ÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù.

  • get(URI uri, Map<String, List<String>> requestHeaders)
  • put(URI uri, Map<String, List<String>> responseHeaders)

get() ¸Þ¼Òµå´Â ij½Ã¿¡¼­ ÀúÀåµÈ Äí±â¸¦ °Ë»öÇÏ¿© requestHeaders¸¦ Ãß°¡Çϰí, put() ¸Þ¼Òµå´Â ÀÀ´ä Çì´õ¿¡¼­ Äí۸¦ ã¾Æ³»¾î ij½Ã¿¡ ÀúÀåÇÑ´Ù.

¿©±â¼­ º¸µíÀÌ Çڵ鷯¸¦ ÀÛ¼ºÇÏ´Â ÀÏÀº ½ÇÁ¦·Î´Â °£´ÜÇÏ´Ù. ±×·¯³ª ij½Ã¸¦ Á¤ÀÇÇÏ´Â µ¥´Â ¾à°£ÀÇ Ãß°¡ ÀÛ¾÷ÀÌ ´õ ÇÊ¿äÇÏ´Ù. ÀÏ·Ê·Î, Ä¿½ºÅÒ CookieHandler, ÄíŰ ij½Ã, Å×½ºÆ® ÇÁ·Î±×·¥À» »ç¿ëÇØ º¸±â·Î ÇÏÀÚ. Å×½ºÆ® ÇÁ·Î±×·¥Àº ¾Æ·¡¿Í °°Àº ÇüŸ¦ ¶ì°í ÀÖ´Ù.

   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();
     }
   }

¸ÕÀú ÀÌ ÇÁ·Î±×·¥Àº °£·«ÇÏ°Ô Á¤ÀÇµÉ ListCookieHandler¸¦ ÀÛ¼ºÇÏ°í ¼³Ä¡ÇÑ´Ù. ±×·± ´ÙÀ½ URL(¸í·É¾î ¶óÀο¡¼­ ÀÔ·Â)ÀÇ Á¢¼ÓÀ» ¿­¾î ³»¿ëÀ» Àд´Ù. À̾ ÇÁ·Î±×·¥Àº ¶Ç ´Ù¸¥ URLÀÇ Á¢¼ÓÀ» ¿­°í µ¿ÀÏÇÑ ³»¿ëÀ» Àд´Ù. ù ¹øÂ° ³»¿ëÀ» ÀÐÀ» ¶§ ÀÀ´ä¿¡´Â ÀúÀåµÉ Äí۰¡, µÎ ¹øÂ° ¿äû¿¡´Â ¾Õ¼­ ÀúÀåµÈ Äí۰¡ Æ÷ÇԵȴÙ.

ÀÌÁ¦ À̰ÍÀ» °ü¸®ÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ¾Ë¾Æº¸±â·Î ÇÏÀÚ. óÀ½¿¡´Â URLConnection Ŭ·¡½º¸¦ ÀÌ¿ëÇÑ´Ù. À¥ »óÀÇ ¸®¼Ò½º´Â URLÀ» ÅëÇØ ¾×¼¼½ºÇÒ ¼ö ÀÖÀ¸¸ç, URL ÀÛ¼º ÈÄ¿¡´Â URLConnection Ŭ·¡½ºÀÇ µµ¿òÀ» ¹Þ¾Æ »çÀÌÆ®¿ÍÀÇ Åë½ÅÀ» À§ÇÑ ÀÎDz ¶Ç´Â ¾Æ¿ôDz ½ºÆ®¸²À» ¾òÀ» ¼ö ÀÖ´Ù.

   String urlString = ...;
   URL url = new URL(urlString);
   URLConnection connection = url.openConnection();
   InputStream is = connection.getInputStream();
   // .. read content from stream

Á¢¼ÓÀ¸·ÎºÎÅÍ ÀÌ¿ë °¡´ÉÇÑ Á¤º¸¿¡´Â ÀÏ·ÃÀÇ Çì´õµéÀÌ Æ÷Ç﵃ ¼ö Àִµ¥, ÀÌ´Â »ç¿ëÁßÀÎ ÇÁ·ÎÅäÄÝ¿¡ ÀÇÇØ °áÁ¤µÈ´Ù. Çì´õ¸¦ ãÀ¸·Á¸é URLConnection Ŭ·¡½º¸¦ »ç¿ëÇÏ¸é µÈ´Ù. ÇÑÆí, Ŭ·¡½º´Â Çì´õ Á¤º¸ °Ë»öÀ» À§ÇÑ ´Ù¾çÇÑ ¸Þ¼Òµå¸¦ °¡Áö´Âµ¥, ¿©±â¿¡´Â ´ÙÀ½ »çÇ×µéÀÌ Æ÷ÇԵȴÙ.

  • getHeaderFields() - °¡¿ëÇÑ ÇʵåÀÇ MapÀ» ¾ò´Â´Ù.
  • getHeaderField(String name) - À̸§ º°·Î Çì´õ Çʵ带 ¾ò´Â´Ù.
  • getHeaderFieldDate(String name, long default) - ³¯Â¥·Î µÈ Çì´õ Çʵ带 ¾ò´Â´Ù.
  • getHeaderFieldInt(String name, int default) - ¼ýÀÚ·Î µÈ Çì´õ Çʵ带 ¾ò´Â´Ù.
  • getHeaderFieldKey(int n) or getHeaderField(int n) - À§Ä¡ º°·Î Çì´õ Çʵ带 ¾ò´Â´Ù.

ÀÏ·Ê·Î, ´ÙÀ½ ÇÁ·Î±×·¥Àº ÁÖ¾îÁø URLÀÇ ¸ðµç Çì´õ¸¦ ¿­°ÅÇÑ´Ù

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

   public class ListHeaders {
     public static void main(String args[]) throws Exception {
       if (args.length == 0) {
         System.err.println("URL missing");
       }
       String urlString = args[0];
       URL url = new URL(urlString);
       URLConnection connection = url.openConnection();
       Map<String,List<String>> headerFields = 
         connection.getHeaderFields();
       Set<String> set = headerFields.keySet();
       Iterator<String> itor = set.iterator();
       while (itor.hasNext()) {
         String key = itor.next();
         System.out.println("Key: " + key + " / " + 
           headerFields.get(key));
       }
     }
   }

ListHeaders ÇÁ·Î±×·¥Àº °¡·É http://java.sun.com °°Àº URLÀ» ¾Æ±Ô¸ÕÆ®·Î ÃëÇÏ°í »çÀÌÆ®·ÎºÎÅÍ ¼ö½ÅÇÑ ¸ðµç Çì´õ¸¦ Ç¥½ÃÇÑ´Ù. °¢ Çì´õ´Â ¾Æ·¡ÀÇ ÇüÅ·Πǥ½ÃµÈ´Ù.

   Key: <key> / [<value>]

µû¶ó¼­ ´ÙÀ½À» ÀÔ·ÂÇϸé,

  >> java ListHeaders http://java.sun.com

´ÙÀ½°ú À¯»çÇÑ ³»¿ëÀÌ Ç¥½ÃµÇ¾î¾ß ÇÑ´Ù.

   Key: Set-Cookie / [SUN_ID=192.168.0.1:269421125489956; 
   EXPIRES=Wednesday, 31- Dec-2025 23:59:59 GMT; 
   DOMAIN=.sun.com; PATH=/]
   Key: Set-cookie / 
   [JSESSIONID=688047FA45065E07D8792CF650B8F0EA;Path=/]
   Key: null / [HTTP/1.1 200 OK]
   Key: Transfer-encoding / [chunked]
   Key: Date / [Wed, 31 Aug 2005 12:05:56 GMT]
   Key: Server / [Sun-ONE-Web-Server/6.1]
   Key: Content-type / [text/html;charset=ISO-8859-1]   

(À§¿¡ Ç¥½ÃµÈ °á°ú¿¡¼­ ±ä ÇàÀº ¼öµ¿À¸·Î ÁٹٲÞÇÑ °ÍÀÓ)

ÀÌ´Â ÇØ´ç URL¿¡ ´ëÇÑ Çì´õµé¸¸À» Ç¥½ÃÇϸç, ±×°÷¿¡ À§Ä¡ÇÑ HTML ÆäÀÌÁö´Â Ç¥½ÃÇÏÁö ¾Ê´Â´Ù. Ç¥½ÃµÇ´Â Á¤º¸¿¡´Â »çÀÌÆ®¿¡¼­ »ç¿ëÇÏ´Â À¥ ¼­¹ö¿Í ·ÎÄà ½Ã½ºÅÛÀÇ ³¯Â¥ ¹× ½Ã°£ÀÌ Æ÷ÇԵǴ »ç½Ç¿¡ À¯ÀÇÇÒ °Í. ¾Æ¿ï·¯ 2°³ÀÇ ¡®Set-Cookie¡¯ Çà¿¡µµ À¯ÀÇÇØ¾ß ÇÑ´Ù. À̵éÀº ÄíŰ¿Í °ü·ÃµÈ Çì´õµéÀ̸ç, ÄíŰ´Â Çì´õ·ÎºÎÅÍ ÀúÀåµÈ µÚ ´ÙÀ½ÀÇ ¿äû°ú ÇÔ²² Àü¼ÛµÉ ¼ö ÀÖ´Ù.

ÀÌÁ¦ CookieHandler¸¦ ÀÛ¼ºÇØ º¸ÀÚ. À̸¦ À§Çؼ­´Â µÎ Ãß»ó ¸Þ¼Òµå CookieHandler: get() °ú¤Ã put()À» ±¸ÇöÇØ¾ß ÇÑ´Ù.

  •   public void put(
        URI uri,
        Map<String, List<String>> responseHeaders)
          throws IOException
    
  •   public Map<String, List<String>> get(
        URI uri,
        Map<String, List<String>> requestHeaders)
          throws IOException
    

¿ì¼± put() ¸Þ¼Òµå·Î ½ÃÀÛÇÑ´Ù. ÀÌ °æ¿ì ÀÀ´ä Çì´õ¿¡ Æ÷ÇÔµÈ ¸ðµç Äí۰¡ ij½Ã¿¡ ÀúÀåµÈ´Ù.put()À» ±¸ÇöÇϱâ À§Çؼ­´Â ¸ÕÀú ¡®Set-Cookie¡¯ Çì´õÀÇ List¸¦ ¾ò¾î¾ßÇÑ´Ù. ÀÌ´Â Set-cookie³ª Set-Cookie2 °°Àº ´Ù¸¥ ÇØ´ç Çì´õ·Î È®ÀåµÉ ¼ö ÀÖ´Ù.

   List<String> setCookieList =
     responseHeaders.get("Set-Cookie");

ÄíŰÀÇ ¸®½ºÆ®¸¦ È®º¸ÇÑ ÈÄ °¢ Äí۸¦ ¹Ýº¹(loop)Çϰí ÀúÀåÇÑ´Ù. Äí۰¡ ÀÌ¹Ì Á¸ÀçÇÒ °æ¿ì¿¡´Â ±âÁ¸ÀÇ °ÍÀ» ±³Ã¼Çϵµ·Ï ÇÑ´Ù.

    if (setCookieList != null) {
      for (String item : setCookieList) {
        Cookie cookie = new Cookie(uri, item);
        // Remove cookie if it already exists in cache
        // New one will replace it
        for (Cookie existingCookie : cache) {
          ...
        }
        System.out.println("Adding to cache: " + cookie);
        cache.add(cookie);
      }
    }

¿©±â¼­ ¡®Ä³½Ã¡¯´Â µ¥ÀÌÅͺ£À̽º¿¡¼­ Collections Framework¿¡¼­ List¿¡ À̸£±â±îÁö ¾î¶² °ÍÀÌµç µÉ ¼ö ÀÖ´Ù. Cookie Ŭ·¡½º´Â ³ªÁß¿¡ Á¤ÀǵǴµ¥, ÀÌ´Â »çÀü Á¤ÀǵǴ Ŭ·¡½º¿¡ ¼ÓÇÏÁö ¾Ê´Â´Ù.

º»ÁúÀûÀ¸·Î, ±×°ÍÀÌ put() ¸Þ¼Òµå¿¡ ´ëÇØ ÁÖ¾îÁø ÀüºÎÀ̸ç, ÀÀ´ä Çì´õ ³»ÀÇ °¢ ÄíŰ¿¡ ´ëÇØ ¸Þ¼Òµå´Â Äí۸¦ ij½Ã¿¡ ÀúÀåÇÑ´Ù.

get() ¸Þ¼Òµå´Â Á¤¹Ý´ë·Î ÀÛµ¿ÇÑ´Ù. URI¿¡ ÇØ´çµÇ´Â ij½Ã ³»ÀÇ °¢ ÄíŰ¿¡ ´ëÇØ, get() ¸Þ¼Òµå´Â À̸¦ ¿äû Çì´õ¿¡ Ãß°¡ÇÑ´Ù. º¹¼öÀÇ ÄíŰ¿¡ ´ëÇØ¼­´Â ÄÞ¸¶·Î ±¸ºÐµÈ(comma-delimited) ¸®½ºÆ®¸¦ ÀÛ¼ºÇÑ´Ù. get() ¸Þ¼Òµå´Â ¸ÊÀ» ¹ÝȯÇϸç, µû¶ó¼­ ¸Þ¼Òµå´Â ±âÁ¸ÀÇ Çì´õ ¼¼Æ®·Î Map ¾Æ±Ô¸ÕÆ®¸¦ ÃëÇÏ°Ô µÈ´Ù. ±× ¾Æ±Ô¸ÕÆ®¿¡ ij½Ã ³»ÀÇ ÇØ´ç Äí۸¦ Ãß°¡ÇØ¾ß ÇÏÁö¸¸ ¾Æ±Ô¸ÕÆ®´Â ºÒº¯ÀÇ ¸ÊÀ̸ç, ¶Ç ´Ù¸¥ ºÒº¯ÀÇ ¸ÊÀ» ¹ÝÈ¯ÇØ¾ß¸¸ ÇÑ´Ù. µû¶ó¼­ ±âÁ¸ÀÇ ¸ÊÀ» À¯È¿ÇÑ Ä«ÇÇ¿¡ º¹»çÇÑ ´ÙÀ½ Ãß°¡¸¦ ¸¶Ä£ ÈÄ ºÒº¯ÀÇ ¸ÊÀ» ¹ÝÈ¯ÇØ¾ß ÇÑ´Ù.

get() ¸Þ¼Òµå¸¦ ±¸ÇöÇϱâ À§Çؼ­´Â ¸ÕÀú ij½Ã¸¦ »ìÆìº¸°í ÀÏÄ¡ÇÏ´Â Äí۸¦ ¾òÀº ´ÙÀ½ ¸¸·áµÈ Äí۸¦ ¸ðµÎ Á¦°ÅÇϵµ·Ï ÇÑ´Ù.

    // Retrieve all the cookies for matching URI
    // Put in comma-separated list
    StringBuilder cookies = new StringBuilder();
    for (Cookie cookie : cache) {
      // Remove cookies that have expired
      if (cookie.hasExpired()) {
        cache.remove(cookie);
      } else if (cookie.matches(uri)) {
        if (cookies.length() > 0) {
          cookies.append(", ");
        }
        cookies.append(cookie.toString());
      }
    }

ÀÌ °æ¿ì¿¡µµ Cookie Ŭ·¡½º´Â °£·«ÇÏ°Ô Á¤ÀǵǴµ¥, ¿©±â¿¡´Â hasExpired()¿Í matches() µî 2°³ÀÇ ¿äûµÈ ¸Þ¼Òµå°¡ Ç¥½ÃµÇ¾î ÀÖ´Ù. hasExpired() ¸Þ¼Òµå´Â ƯÁ¤ ÄíŰÀÇ ¸¸·á ¿©ºÎ¸¦ º¸°íÇϰí, matches() ¸Þ¼Òµå´Â Äí۰¡ ¸Þ¼Òµå¿¡ ÆÐ½ºµÈ URI¿¡ ÀûÇÕÇÑÁö ¿©ºÎ¸¦ º¸°íÇÑ´Ù.

get() ¸Þ¼ÒµåÀÇ ´ÙÀ½ ºÎºÐÀº ÀÛ¼ºµÈ StringBuilder ¿ÀºêÁ§Æ®¸¦ ÃëÇÏ°í ±× ½ºÆ®¸µÇÊµå ¹öÀüÀ» ¼öÁ¤ ºÒ°¡´ÉÇÑ Map¿¡ putÇÑ´Ù(ÀÌ °æ¿ì¿¡´Â ÇØ´ç Ű ¡®Cookie¡¯¸¦ ÀÌ¿ë).

    // Map to return
    Map<String, List<String>> cookieMap =
      new HashMap<String, List<String>>(requestHeaders);

    // Convert StringBuilder to List, store in map
    if (cookies.length() > 0) {
      List<String> list =
        Collections.singletonList(cookies.toString());
      cookieMap.put("Cookie", list);
    }
    return Collections.unmodifiableMap(cookieMap);

´ÙÀ½Àº ·±Å¸ÀÓÀÇ Á¤º¸ Ç¥½Ã¸¦ À§ÇØ printlnÀÌ ÀϺΠÃß°¡µÇ¾î ¿Ï¼ºµÈ CookieHandler Á¤ÀÇÀÌ´Ù.

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

   public class ListCookieHandler extends CookieHandler {

     // "Long" term storage for cookies, not serialized so only
     // for current JVM instance
     private List<Cookie> cache = new LinkedList<Cookie>();

     /**
      * Saves all applicable cookies present in the response 
      * headers into cache.
      * @param uri URI source of cookies
      * @param responseHeaders Immutable map from field names to 
      * lists of field
      *   values representing the response header fields returned
      */

     public void put(
         URI uri,
         Map<String, List<String>> responseHeaders)
           throws IOException {

       System.out.println("Cache: " + cache);
       List<String> setCookieList = 
         responseHeaders.get("Set-Cookie");
       if (setCookieList != null) {
         for (String item : setCookieList) {
           Cookie cookie = new Cookie(uri, item);
           // Remove cookie if it already exists
           // New one will replace
           for (Cookie existingCookie : cache) {
             if((cookie.getURI().equals(
               existingCookie.getURI())) &&
                (cookie.getName().equals(
                  existingCookie.getName()))) {
              cache.remove(existingCookie);
              break;
            }
          }
          System.out.println("Adding to cache: " + cookie);
          cache.add(cookie);
        }
      }
    }

    /**
     * Gets all the applicable cookies from a cookie cache for 
     * the specified uri in the request header.
     *
     * @param uri URI to send cookies to in a request
     * @param requestHeaders Map from request header field names 
     * to lists of field values representing the current request 
     * headers
     * @return Immutable map, with field name "Cookie" to a list 
     * of cookies
     */

    public Map<String, List<String>> get(
        URI uri,
        Map<String, List<String>> requestHeaders)
          throws IOException {

      // Retrieve all the cookies for matching URI
      // Put in comma-separated list
      StringBuilder cookies = new StringBuilder();
      for (Cookie cookie : cache) {
        // Remove cookies that have expired
        if (cookie.hasExpired()) {
          cache.remove(cookie);
        } else if (cookie.matches(uri)) {
          if (cookies.length() > 0) {
            cookies.append(", ");
          }
          cookies.append(cookie.toString());
        }
      }

      // Map to return
      Map<String, List<String>> cookieMap =
        new HashMap<String, List<String>>(requestHeaders);

      // Convert StringBuilder to List, store in map
      if (cookies.length() > 0) {
        List<String> list =
          Collections.singletonList(cookies.toString());
        cookieMap.put("Cookie", list);
      }
        System.out.println("Cookies: " + cookieMap);
    return Collections.unmodifiableMap(cookieMap);
    }
  }

ÆÛÁñÀÇ ¸¶Áö¸· Á¶°¢Àº Cookie Ŭ·¡½º ±× ÀÚüÀ̸ç, ´ëºÎºÐÀÇ Á¤º¸´Â »ý¼ºÀÚ(constructor) ³»¿¡ Á¸ÀçÇÑ´Ù. »ý¼ºÀÚ ³»ÀÇ Á¤º¸ Á¶°¢(ºñÆ®)µéÀ» uri ¹× Çì´õ Çʵå·ÎºÎÅÍ ÆÄ½ÌÇØ¾ß ÇÑ´Ù. ¸¸·áÀÏ¿¡´Â ÇϳªÀÇ Æ÷¸ËÀÌ »ç¿ëµÇ¾î¾ß ÇÏÁö¸¸ Àαâ ÀÖ´Â À¥ »çÀÌÆ®¿¡¼­´Â º¹¼öÀÇ Æ÷¸ËÀÌ »ç¿ëµÇ´Â °æ¿ì¸¦ º¼ ¼ö ÀÖ´Ù. ¿©±â¼­´Â ±×´ÙÁö ±î´Ù·Î¿î Á¡Àº ¾ø°í, ÄíŰ °æ·Î, ¸¸·áÀÏ, µµ¸ÞÀÎ µî°ú °°Àº ´Ù¾çÇÑ Á¤º¸ Á¶°¢À» ÀúÀåÇϱ⸸ ÇÏ¸é µÈ´Ù.

   public Cookie(URI uri, String header) {
     String attributes[] = header.split(";");
     String nameValue = attributes[0].trim();
     this.uri = uri;
     this.name = nameValue.substring(0, nameValue.indexOf('='));
     this.value = nameValue.substring(nameValue.indexOf('=')+1);
     this.path = "/";
     this.domain = uri.getHost();

     for (int i=1; i < attributes.length; i++) {
       nameValue = attributes[i].trim();
       int equals = nameValue.indexOf('=');
       if (equals == -1) {
         continue;
       }
       String name = nameValue.substring(0, equals);
       String value = nameValue.substring(equals+1);
       if (name.equalsIgnoreCase("domain")) {
         String uriDomain = uri.getHost();
         if (uriDomain.equals(value)) {
           this.domain = value;
         } else {
           if (!value.startsWith(".")) {
             value = "." + value;
           }
           uriDomain = 
             uriDomain.substring(uriDomain.indexOf('.'));
           if (!uriDomain.equals(value)) {
             throw new IllegalArgumentException(
               "Trying to set foreign cookie");
           }
           this.domain = value;
         }
       } else if (name.equalsIgnoreCase("path")) {
         this.path = value;
       } else if (name.equalsIgnoreCase("expires")) {
         try {
           this.expires = expiresFormat1.parse(value);
         } catch (ParseException e) {
           try {
             this.expires = expiresFormat2.parse(value);
           } catch (ParseException e2) {
             throw new IllegalArgumentException(
               "Bad date format in header: " + value);
           }
         }
       }
     }
  }

Ŭ·¡½º ³»ÀÇ ´Ù¸¥ ¸Þ¼ÒµåµéÀº ´ÜÁö ÀúÀåµÈ µ¥ÀÌÅ͸¦ ¹ÝȯÇϰųª ¸¸·á ¿©ºÎ¸¦ È®ÀÎÇÑ´Ù.

   public boolean hasExpired() {
     if (expires == null) {
       return false;
     }
     Date now = new Date();
     return now.after(expires);
   }

   public String toString() {
     StringBuilder result = new StringBuilder(name);
     result.append("=");
     result.append(value);
     return result.toString();
   }

Äí۰¡ ¸¸·áµÈ °æ¿ì¿¡´Â ¡®match¡¯°¡ Ç¥½ÃµÇ¸é ¾È µÈ´Ù.

   public boolean matches(URI uri) {

     if (hasExpired()) {
       return false;
     }

     String path = uri.getPath();
     if (path == null) {
       path = "/";
     } 

     return path.startsWith(this.path);
   }

Cookie ½ºÆåÀÌ µµ¸ÞÀΰú °æ·Î ¾çÂÊ¿¡ ´ëÇØ ¸ÅÄ¡¸¦ ¼öÇàÇÒ °ÍÀ» ¿ä±¸ÇÑ´Ù´Â Á¡¿¡ À¯ÀÇÇØ¾ß ÇÑ´Ù. ´Ü¼ø¼ºÀ» À§ÇØ ¿©±â¼­´Â °æ·Î ¸ÅÄ¡¸¸À» È®ÀÎÇÑ´Ù.

¾Æ·¡´Â Àüü Cookie Ŭ·¡½ºÀÇ Á¤ÀÇÀÌ´Ù.

   import java.net.*;
   import java.text.*;
   import java.util.*;

   public class Cookie {

     String name;
     String value;
     URI uri;
     String domain;
     Date expires;
     String path;

     private static DateFormat expiresFormat1
         = new SimpleDateFormat("E, dd MMM yyyy k:m:s 'GMT'", Locale.US);

     private static DateFormat expiresFormat2
        = new SimpleDateFormat("E, dd-MMM-yyyy k:m:s 'GMT'", Local.US);
		

     /**
      * Construct a cookie from the URI and header fields
      *
      * @param uri URI for cookie
      * @param header Set of attributes in header
      */
     public Cookie(URI uri, String header) {
       String attributes[] = header.split(";");
       String nameValue = attributes[0].trim();
       this.uri = uri;
       this.name = 
         nameValue.substring(0, nameValue.indexOf('='));
       this.value = 
         nameValue.substring(nameValue.indexOf('=')+1);
       this.path = "/";
       this.domain = uri.getHost();

       for (int i=1; i < attributes.length; i++) {
         nameValue = attributes[i].trim();
         int equals = nameValue.indexOf('=');
         if (equals == -1) {
           continue;
         }
         String name = nameValue.substring(0, equals);
         String value = nameValue.substring(equals+1);
         if (name.equalsIgnoreCase("domain")) {
           String uriDomain = uri.getHost();
           if (uriDomain.equals(value)) {
             this.domain = value;
           } else {
             if (!value.startsWith(".")) {
               value = "." + value;
             }
             uriDomain = uriDomain.substring(
               uriDomain.indexOf('.'));
             if (!uriDomain.equals(value)) {
               throw new IllegalArgumentException(
                 "Trying to set foreign cookie");
             }
             this.domain = value;
           }
         } else if (name.equalsIgnoreCase("path")) {
           this.path = value;
         } else if (name.equalsIgnoreCase("expires")) {
           try {
             this.expires = expiresFormat1.parse(value);
           } catch (ParseException e) {
             try {
               this.expires = expiresFormat2.parse(value);
             } catch (ParseException e2) {
               throw new IllegalArgumentException(
                 "Bad date format in header: " + value);
             }
           }
         }
       }
     }

     public boolean hasExpired() {
       if (expires == null) {
         return false;
       }
       Date now = new Date();
       return now.after(expires);
     }

     public String getName() {
       return name;
     }

     public URI getURI() {
       return uri;
     }

     /**
      * Check if cookie isn't expired and if URI matches,
      * should cookie be included in response.
      *
      * @param uri URI to check against
      * @return true if match, false otherwise
      */
     public boolean matches(URI uri) {

       if (hasExpired()) {
         return false;
       }

      String path = uri.getPath();
       if (path == null) {
         path = "/";
       }

       return path.startsWith(this.path);
     }

     public String toString() {
       StringBuilder result = new StringBuilder(name);
       result.append("=");
       result.append(value);
       return result.toString();
     }
   }

ÀÌÁ¦ Á¶°¢µéÀÌ ¸ðµÎ È®º¸µÇ¾úÀ¸¹Ç·Î ¾ÕÀÇ Fetch ¿¹Á¦¸¦ ½ÇÇàÇÒ ¼ö ÀÖ´Ù.

   >> java Fetch http://java.sun.com

   Cookies: {Connection=[keep-alive], Host=[java.sun.com], 
    User-Agent=[Java/1.5.0_04], GET / HTTP/1.1=[null], 
    Content-type=[application/x-www-form-urlencoded], 
    Accept=[text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2]}
   Cache: []
   Adding to cache: SUN_ID=192.168.0.1:235411125667328
   Cookies: {Connection=[keep-alive], Host=[java.sun.com], 
    User-Agent=[Java/1.5.0_04], GET / HTTP/1.1=[null], 
    Cookie=[SUN_ID=192.168.0.1:235411125667328], 
    Content-type=[application/x-www-form-urlencoded], 
    Accept=[text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2]}
   Cache: [SUN_ID=192.168.0.1:235411125667328]

(À§¿¡ Ç¥½ÃµÈ °á°ú¿¡¼­ ±ä ÇàÀº ¼öµ¿À¸·Î ÁٹٲÞÇÑ °ÍÀÓ)

¡®Cache¡¯·Î ½ÃÀ۵Ǵ ÇàÀº ÀúÀåµÈ ij½Ã¸¦ ³ªÅ¸³½´Ù. ÀúÀåµÈ Äí۰¡ Áï½Ã ¹ÝȯµÇÁö ¾Êµµ·Ï put() ¸Þ¼Òµå Àü¿¡ get() ¸Þ¼Òµå°¡ ¾î¶»°Ô È£ÃâµÇ´ÂÁö¿¡ ´ëÇØ À¯ÀÇÇϵµ·Ï ÇÒ °Í.

ÄíŰ¿Í URL Á¢¼ÓÀ» ÀÌ¿ëÇÑ ÀÛ¾÷¿¡ °üÇØ ÀÚ¼¼È÷ ¾Ë°í ½ÍÀ¸¸é ÀÚ¹Ù Æ©Å丮¾óÀÇ Custom Networking trail(¿µ¹®)À» ÂüÁ¶ÇÒ °Í. ÀÌ´Â J2SE 1.4¿¡ ±â¹ÝÀ» µÎ°í ÀÖÀ¸¹Ç·Î Æ©Å丮¾ó¿¡´Â ¾ÆÁ÷ ¿©±â¼­ ¼³¸íÇÑ CookieHandler¿¡ °üÇÑ Á¤º¸°¡ ½Ç·Á ÀÖÁö ¾Ê´Ù. Java SE 6 ("Mustang")(¿µ¹®) ¸±¸®Áî¿¡¼­µµ ±âº» CookieHandler ±¸Çö¿¡ °üÇÑ ³»¿ëÀ» ã¾Æº¼ ¼ö ÀÖ´Ù.

Back to Top

Å×Å©ÆÁ ÄûÁî Á¤´ä
 
Áö³­ ÁÖ ´º½º·¹ÅÍ·Î ¹ß¼ÛµÇ¾ú´ø Å×Å©ÆÁ ÄûÁîÀÇ Á¤´äÀ» ¾Ë·Áµå¸³´Ï´Ù.
Âü¿©ÇØÁֽЏðµç ºÐ²² °¨»çµå¸®¸ç, ´ç÷ÀÚ´Â 10¿ù 26ÀÏ SKDN ȨÆäÀÌÁö¿¡¼­ ¹ßÇ¥ÇÕ´Ï´Ù.
  1. ´ÙÀ½ Áß "pull"ÆÄ¼­´Â?
    1. Xerces
    2. SSAX
    3. Sun Java Streaming XML Parser (SJSXP)
    4. ¸ðµÎ ¾Æ´Ô

    Á¤´ä c. SJSXP(Sun Java Streaming XML Parser)
    SJSXP´Â StAX(Streaming API for XML) ÆÄ¼­ÀÇ °í¼Ó ±¸ÇöÀ¸·Î¼­ ÀÏÁ¾ÀÇ pull ÆÄ¼­ÀÌ´Ù(ÀÌ¿Í ´ëÁ¶ÀûÀ¸·Î, Xerces¿Í SSAX´Â SAX ÆÄ¼­ÀÓ). SJSXP´Â ÆÄ¼­°¡ ¹®¼­ ³»¿¡¼­ ÇöÀç ½ºÄµµÇ´Â Àå¼Ò¿¡ sorts Æ÷ÀÎÅÍ?À̸¦ ÈçÈ÷ Ä¿¼­¶ó°í ÇÑ´Ù?¸¦ À¯ÁöÇÏ´Â pull ¸Þ¼Òµå¸¦ ±¸ÇöÇÑ´Ù. ¿ì¸®´Â SJSXP°¡ Á¦°øÇÏ´Â 2°³ÀÇ API, Ä¿¼­¿Í ¹Ýº¹ÀÚ(iterator) Áß Çϳª¸¦ ÀÌ¿ëÇÏ¿© Ä¿¼­°¡ ÇöÀç °¡¸®Å°°í ÀÖ´Â ³ëµå¸¦ ÆÄ¼­¿¡ ´ëÇØ ¿ä±¸ÇÏ¸é µÈ´Ù. Ä¿¼­ API´Â XML Á¤º¸¸¦ ¹®ÀÚ¿­·Î ¹ÝȯÇÏ´Â ¹Ý¸é ¹Ýº¹ÀÚ API´Â º°°³ÀÇ À̺¥Æ® ¿ÀºêÁ§Æ®¸¦ ÆÄ¼­¿¡¼­ ÀÐÈ÷´Â ¼ø¼­´ë·Î ¹ÝȯÇÑ´Ù. SJSXP¿¡ °üÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº 2005³â 4¿ù 29ÀÏÀÚ J2EE Å×Å©ÆÁ Sun Java Streaming XML Parser ¼Ò°³ ÂüÁ¶

  2. ´ÙÀ½ÀÇ WSDL ¹ÙÀεù style/use Á¶ÇÕ Áß¿¡¼­ WS-I ȣȯÀÌ µÇ´Â °ÍÀº?
    1. RPC/encoded
    2. RPC/literal
    3. Document/encoded
    4. Document/literal

    Á¤´ä b¿Í d
    RPC/literal°ú Document/literalÀº WS-I ȣȯÀÌ µÈ´Ù. style/use Á¶ÇÕ¿¡ °üÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº 2005³â 8¿ù 23ÀÏÀÚ J2EE Å×Å©ÆÁ JAX-RPC ¹ÙÀεù ½ºÅ¸Àϰú »ç¿ë ¼Ó¼º ÂüÁ¶

  3. ´ÙÀ½ Áß JSF(JavaServer Faces) ±â¼ú¿¡¼­ À¯È¿ÇÑ ¹ÙÀεù ½ÄÀº?
    1. #{invoice.customerName}
    2. ${invoice.date}
    3. #[customer.status == 'VIP']
    4. ¸ðµÎ ¾Æ´Ô

    Á¤´ä a. #{invoice.customerName}
    ¹ÙÀεù ½ÄÀÇ ½ÅÅýº´Â ±× ÀÚü°¡ JavaScriptÀÇ ¿ÀºêÁ§Æ® ¾×¼¼½º ½ÅÅýº¿¡ ±âÃÊÇÑ JSP(JavaServer Pages) 2.0 Expression Language¿¡ ±â¹ÝÀ» µÎ°í ÀÖ´Ù. JSP¿¡¼­´Â ½ÄµéÀÌ "${}"·Î µÑ·¯½ÎÀÌÁö¸¸ JSF¿¡¼­´Â "#{}"ÀÌ »ç¿ëµÈ´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº 2004³â 10¿ù 15ÀÏÀÚ J2EE Å×Å©ÆÁ JSFÀÇ °ª ¹ÙÀεù Ç¥Çö°ú ¸Þ¼­µå ¹ÙÀεù Ç¥ÇöÀÇ ³»¿ëÀ» ÂüÁ¶ÇÒ °Í. Expression Language¸¦ JSP 2.1·Î ÅëÀÏÇϱâ À§ÇØ JSF 1.2¿¡ ´ëÇØ¼­ ¾÷µ¥ÀÌÆ®°¡ ÀÌ·ç¾îÁ³´Ù´Â Á¡¿¡ À¯ÀÇÇÑ´Ù. »õ·ÎÀÌ ÅëÀÏµÈ Expression Language¿¡ °üÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀ» º¸·Á¸é Å×Å©´ÏÄà ¾ÆÆ¼Å¬ Unified Expression Language(¿µ¹®)ÂüÁ¶.

  4. message-driven ºó¿¡ °üÇÑ ¼³¸í Áß ¸Â´Â °ÍÀº?
    1. message-driven ºóÀÇ ÀνºÅϽº´Â ƯÁ¤ Ŭ¶óÀ̾ðÆ®ÀÇ µ¥ÀÌÅÍ ¶Ç´Â ´ëÈ­ »óŸ¦ À¯ÁöÇÏÁö ¾Ê´Â´Ù.
    2. message-driven ºóÀÇ ¸ðµç ÀνºÅϽº´Â ¼­·Î µ¿µîÇϹǷΠÄÁÅ×À̳ʴ ¾î¶°ÇÑ message-driven ºó ÀνºÅϽº¿¡µµ ¸Þ½ÃÁö¸¦ ÇÒ´çÇÒ ¼ö ÀÖ´Ù.
    3. ÇϳªÀÇ message-driven ºóÀÌ º¹¼ö Ŭ¶óÀ̾ðÆ®ÀÇ ¸Þ½ÃÁö¸¦ ó¸®ÇÒ ¼ö ÀÖ´Ù.
    4. ¸ðµÎ ¸ÂÀ½
    5. ¸ðµÎ Ʋ¸²

    Á¤´ä d. ¸ðµÎ ¸ÂÀ½
    ¸ðµÎ ¸ÂÀ½. MDBs¿¡ °üÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº 2005³â 5¿ù 18ÀÏÀÚ J2EE Å×Å©ÆÁ EJB 2.1·Î ¸Þ½ÃÁö ±¸µ¿ ºó ÀÌ¿ëÇϱâÀÇ ³»¿ë ÂüÁ¶

  5. ½ºÆ®¸µ ¸®½ºÆ®¸¦ Á¤·ÄÇÏ´Â ¹æ¹ýÀº?
    1. TreeList Ŭ·¡½º¸¦ »ç¿ëÇÑ´Ù
    2. TreeMap »ý¼ºÀÚ¿¡ List¸¦ ÆÐ½ºÇÏ°í ¸ÊÀ» ¹Ýº¹ÇÑ´Ù
    3. ArraysÀÇ sort ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù
    4. CollectionsÀÇ sort ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù

    Á¤´ä d. CollectionsÀÇ Á¤·Ä ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù
    ÀÚ¼¼ÇÑ °ü·Ã Á¤º¸´Â 2004³â 7¿ù 16ÀÏÀÚ J2SE Å×Å©ÆÁ ¸®½ºÆ®¸¦ ºÐ·ùÇÏ°í ¼¯±â À§ÇÑ COLLECTIONSÀÇ ¸Þ¼Òµå »ç¿ëÇϱ⸦ ÂüÁ¶ÇÑ´Ù. Collections Framework¿¡ °üÇÑ ºÎºÐÀº ÀÌ¹Ì Å×Å© ÆÁÀ» ÅëÇØ ¿©·¯ Â÷·Ê¿¡ °ÉÃÄ ´Ù·é ¹Ù ÀÖ´Ù.

  6. ´ÙÀ½ Áß Math Ŭ·¡½º·Î ÇÒ ¼ö ¾ø´Â ¿¬»êÀº?
    1. ƯÁ¤ ¼öÀÇ ±â¼ö 10 ·Î±×¸¦ °è»êÇÑ´Ù
    2. ƯÁ¤ String¿¡ ´ëÇÑ ÇØ½ÃÄڵ带 »ý¼ºÇÑ´Ù
    3. À¯´ÏÄÚµå ¹®ÀÚÀÇ ¼¼Á¦°ö±ÙÀ» °è»êÇÑ´Ù
    4. µÎ Á¡°£ÀÇ À¯Å¬¸®µå °Å¸®¸¦ °è»êÇÑ´Ù

    Á¤´ä b. ƯÁ¤ String¿¡ ´ëÇÑ ÇØ½ÃÄڵ带 »ý¼ºÇÑ´Ù.
    StringÀÇ ÇØ½ÃÄÚµå °è»êÀº String Ŭ·¡½º¿¡ ÀÇÇØ ÀÌ·ç¾îÁö¸ç, ´Ù¸¥ ¼¼ ¿¬»êÀº JDK 5.0¿¡ Ãß°¡µÈ Math Ŭ·¡½º ¸Þ¼Òµå¸¦ ÅëÇØ ¼öÇàÇÒ ¼ö ÀÖ´Ù. À¯´ÏÄÚµå ¹®ÀÚÀÇ ¼¼Á¦°ö±ÙÀ» °è»êÇÏ·Á¸é °è»ê¿¡ ¾Õ¼­ ¹®ÀÚ¸¦ char¿¡¼­ int·Î º¯È¯ÇÑ´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº 2004³â 11¿ù 11ÀÏÀÚ J2SE Å×Å©ÆÁ MATH Ŭ·¡½º¿¡¼­ÀÇ »õ·Î¿î Á¡ÂüÁ¶
Back to Top

º» ¸ÞÀÏÀº ¼ö½ÅÀ» µ¿ÀÇÇÑ È¸¿ø´Ô¿¡°Ô¸¸ ¹ß¼ÛµË´Ï´Ù.
º» ¸ÞÀÏÀÇ ¼ö½ÅÀ» °ÅºÎÇϰųª ¼ö½ÅÁÖ¼Ò¸¦ º¯°æÇÏ·Á¸é SKDN@Sun.comÀ¸·Î ¹®ÀÇ Áֽñ⠹ٶø´Ï´Ù.

SKDN(Sun Korea Developers Network)¿¡¼­ J2EE/J2SE Å×Å©ÆÁ µî ´Ù¾çÇÑ ¾ÆÆ¼Å¬µéÀ» Âü°íÇϼ¼¿ä.

Copyright 2003-2005 Sun Korea, Ltd. All rights reserved.