2010-03-27 10 views
4

J'essaie d'obtenir un certain cookie dans un client java en créant une série de requêtes Http. Il semble que je reçois un cookie valide du serveur mais quand j'envoie une requête à l'URL fnal avec le cookie apparemment valide, je devrais obtenir quelques lignes de XML dans la réponse mais la réponse est vide parce que le cookie est faux ou est invalidé parce qu'une session s'est fermée ou un autre problème que je ne peux pas comprendre. Le cookie distribué par le serveur expire à la fin de la session.Envoyer un cookie avec une requête HTTP en Java

Il me semble que le cookie est valide car lorsque je fais les mêmes appels dans Firefox, un cookie similaire portant le même nom et commençant par les 3 premières mêmes lettres et de la même longueur est stocké dans firefox, expirant également à la fin de la session. Si je fais ensuite une demande à l'url finale avec seulement ce cookie particulier stocké dans firefox (supprimé tous les autres cookies), le xml est bien rendu sur la page.

Des idées sur ce que je fais de mal dans ce morceau de code? Une autre chose, lorsque j'utilise la valeur du cookie très similaire généré et stocké dans Firefox dans ce morceau de code, la dernière requête donne des informations XML dans la réponse HTTP.

// Validate 
     url = new URL(URL_VALIDATE); 
     conn = (HttpURLConnection) url.openConnection(); 
     conn.setRequestProperty("Cookie", cookie); 
     conn.connect(); 

     String headerName = null; 
     for (int i = 1; (headerName = conn.getHeaderFieldKey(i)) != null; i++) { 
      if (headerName.equals("Set-Cookie")) { 
       if (conn.getHeaderField(i).startsWith("JSESSIONID")) { 
        cookie = conn.getHeaderField(i).substring(0, conn.getHeaderField(i).indexOf(";")).trim(); 
       } 
      } 
     } 

     // Get the XML 
     url = new URL(URL_XML_TOTALS); 
     conn = (HttpURLConnection) url.openConnection(); 
     conn.setRequestProperty("Cookie", cookie); 
     conn.connect(); 

     // Get the response 
     StringBuffer answer = new StringBuffer(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
     String line; 
     while ((line = reader.readLine()) != null) { 
      answer.append(line); 
     } 
     reader.close(); 

     //Output the response 
     System.out.println(answer.toString()) 
+1

Avez-vous déjà pensé à simplement passer au client http commun? http://hc.apache.org/httpclient-3.x/ – leonm

+1

On dirait que vous faites tout cela très manuellement. Je ne sais pas comment vous gérez l'expiration de la session. Si vous aviez tout le code de votre serveur dans une servlet, ce serait beaucoup plus facile. Est-ce une option? – John

Répondre

5

Je me sens un peu trop paresseux pour déboguer votre code, mais vous pourriez envisager de laisser un CookieHandler faire le levage de charges lourdes. Voilà que je disais plus tôt:

public class MyCookieHandler extends CookieHandler { 
    private final Map<String, List<String>> cookies = 
              new HashMap<String, List<String>>(); 

    @Override public Map<String, List<String>> get(URI uri, 
     Map<String, List<String>> requestHeaders) throws IOException { 
    Map<String, List<String>> ret = new HashMap<String, List<String>>(); 
    synchronized (cookies) { 
     List<String> store = cookies.get(uri.getHost()); 
     if (store != null) { 
     store = Collections.unmodifiableList(store); 
     ret.put("Cookie", store); 
     } 
    } 
    return Collections.unmodifiableMap(ret); 
    } 

    @Override public void put(URI uri, Map<String, List<String>> responseHeaders) 
     throws IOException { 
    List<String> newCookies = responseHeaders.get("Set-Cookie"); 
    if (newCookies != null) { 
     synchronized (cookies) { 
     List<String> store = cookies.get(uri.getHost()); 
     if (store == null) { 
      store = new ArrayList<String>(); 
      cookies.put(uri.getHost(), store); 
     } 
     store.addAll(newCookies); 
     } 
    } 
    } 
} 

Le CookieHandler suppose que votre gestion des cookies est globale à la machine virtuelle Java; Si vous voulez des sessions client par thread ou d'autres manipulations de transactions plus compliquées, il vaudrait mieux vous en tenir à votre approche manuelle.

Questions connexes