2009-08-30 5 views
20

Je me connecte à mon application AppEngine à l'aide de la bibliothèque Apache HttpComponents. Pour authentifier mes utilisateurs, je dois passer un jeton d'authentification à l'adresse de connexion de l'application (http://myapp.appspot.com/_ah/login?auth=...) Et récupérer un cookie dans l'en-tête de la réponse. Cependant, la page de connexion répond avec un code d'état de redirection, et je ne sais pas comment empêcher HttpClient de suivre la redirection, ce qui m'empêche d'intercepter le cookie. Fwiw, la méthode actuelle que j'utilise pour envoyer la demande est ci-dessous.Prévention de HttpClient 4 à partir de la redirection suivante

private void execute(HttpClient client, HttpRequestBase method) { 
    // Set up an error handler 
    BasicHttpResponse errorResponse = new BasicHttpResponse(
      new ProtocolVersion("HTTP_ERROR", 1, 1), 500, "ERROR"); 

    try { 
     // Call HttpClient execute 
     client.execute(method, this.responseHandler); 
    } catch (Exception e) { 
     errorResponse.setReasonPhrase(e.getMessage()); 
     try { 
      this.responseHandler.handleResponse(errorResponse); 
     } catch (Exception ex) { 
      // log and/or handle 
     } 
    } 
} 

Comment empêcher le client de suivre la redirection?

Merci.

Mise à jour:

Selon la solution ci-dessous, je l'ai fait, après la création d'un DefaultHttpClient client (et avant de passer à la méthode execute):

if (!this.followRedirect) { 
    client.setRedirectHandler(new RedirectHandler() { 
     public URI getLocationURI(HttpResponse response, 
       HttpContext context) throws ProtocolException { 
      return null; 
     } 

     public boolean isRedirectRequested(HttpResponse response, 
       HttpContext context) { 
      return false; 
     } 
    }); 
} 

Un peu plus bavard il semble que doit être, mais pas aussi difficile que je pensais.

+1

Notez qu'une fois que vous avez défini un RedirectHandler qui reste actif pour toutes les demandes suivantes - pas seulement la demande d'intérêt ici.Donc, si vous êtes en train d'émettre d'autres requêtes qui peuvent nécessiter une redirection pour s'exécuter correctement, vous voudrez faire un client.setRedirectHandler (new DefaultRedirectHandler()) après l'exécution. – Torid

Répondre

6

Essayez d'utiliser un RedirectHandler. Cela peut nécessiter l'extension DefaultHttpClient pour renvoyer votre implémentation personnalisée de createRedirectHandler().

+1

Si vous utilisez l'étonnante bibliothèque android-async-http, j'ai créé une requête fork + pull qui a ce comportement: https://github.com/loopj/android-async-http/pull/184 –

0
+0

Merci de vérifier, mais le lien est pour HttpClient 3. Mon problème est que j'écris une application Android, et Android est livré avec HttpClient 4. En effet, si j'utilisais le HttpClient Commons (3.x), je pourrais juste appelez setFollowRedirects (false) sur mon HttpMethod et faites-le avec. Pour autant que je sache (et quelqu'un me corrige si je me trompe), c'est un peu plus compliqué (si possible?) Avec HttpComponents. – mjumbewu

29

Vous pouvez le faire avec les http params:

final HttpParams params = new BasicHttpParams(); 
HttpClientParams.setRedirecting(params, false); 

La méthode n'a pas javadoc, mais si vous regardez la source que vous pouvez le voir fixe:

HANDLE_REDIRECTS

qui contrôle :

Définit si les redirections doivent être traitées automatiquement

1

Les RedirectHandler semblent être dépréciée, j'ai réussi à désactiver automatiquement après les réponses de redirection en changeant la valeur par défaut RedirectionStrategy pour les liks DefaultHttpClient ceci:

httpClient.setRedirectStrategy(new RedirectStrategy() { 
     @Override 
     public boolean isRedirected(HttpRequest httpRequest, HttpResponse httpResponse, HttpContext httpContext) throws ProtocolException { 
      return false; 
     } 

     @Override 
     public HttpUriRequest getRedirect(HttpRequest httpRequest, HttpResponse httpResponse, HttpContext httpContext) throws ProtocolException { 
      return null; 
     } 
    }); 

En revanche, cela nous attacher à un particulier implémentation du HttpClient mais il fait le travail.

10

Avec la version 4.3.x de HttpClient son directement dans le clientBuilder.

donc quand u construire votre utilisation du client:

CloseableHttpClient client = clientBuilder.disableRedirectHandling().build(); 

Je sais que une vieille question, mais j'avais trop ce problème et que vous voulez partager ma solution.

Questions connexes