2009-08-30 7 views
20

Ich verbinde mich mit meiner AppEngine-Anwendung mithilfe der Apache HttpComponents-Bibliothek. Um meine Benutzer zu authentifizieren, muss ich ein Authentifizierungs-Token an die Login-Adresse der Anwendung übergeben (http://myapp.appspot.com/_ah/login?auth=...) Und ein Cookie aus der Kopfzeile der Antwort holen. Die Anmeldeseite antwortet jedoch mit einem Redirect-Statuscode, und ich weiß nicht, wie ich HttpClient davon abhalte, der Weiterleitung zu folgen, wodurch verhindert wird, dass ich den Cookie abfange.Verhindern, dass HttpClient 4 der Weiterleitung folgt

Fwiw, die tatsächliche Methode, die ich benutze, um die Anfrage zu senden, ist unten.

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 
     } 
    } 
} 

Wie würde ich den Client daran hindern, der Weiterleitung zu folgen?

Danke.

aktualisieren:

Gemäß der Lösung unten, ich habe folgende nach einem DefaultHttpClient client Erstellen (und bevor es an die execute Methode übergeben):

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

ausführlich Mehr als es scheint muss sein, aber nicht so schwierig wie ich dachte.

+1

Beachten Sie, dass Sie einen RedirectHandler festgelegt haben, der für alle nachfolgenden Anforderungen wirksam bleibt - nicht nur für die Anfrage von Interesse.Wenn Sie also weitere Requests ausgeben, die eine korrekte Weiterleitung erfordern, sollten Sie nach dem Ausführen einen client.setRedirectHandler (new DefaultRedirectHandler()) ausführen. – Torid

Antwort

6

Versuchen Sie, eine RedirectHandler verwenden. Das erfordert möglicherweise, DefaultHttpClient zu erweitern, um Ihre benutzerdefinierte Implementierung von createRedirectHandler() zurückzugeben.

+1

Wenn Sie die erstaunliche android-async-http-Bibliothek verwenden, habe ich eine fork + pull-Anforderung mit folgendem Verhalten erstellt: https://github.com/loopj/android-async-http/pull/184 –

0

eine schnelle Google präsentiert: http://hc.apache.org/httpclient-3.x/redirects.html

+0

Danke für die Überprüfung, aber der Link ist für HttpClient 3. Mein Problem ist, dass ich eine Android-Anwendung schreibe, und Android kommt mit HttpClient 4. In der Tat, wenn ich den Commons (3.x) HttpClient verwenden würde, könnte ich einfach rufe setFollowRedirects (false) auf meiner HttpMethod auf und mach damit fertig. Soweit ich das beurteilen kann (und jemand korrigiert mich bitte, wenn ich falsch liege), ist es etwas komplizierter (wenn möglich?) Mit HttpComponents. – mjumbewu

29

Sie können es mit den http params tun:

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

Das Verfahren keine javadoc hat, aber wenn man an der Quelle können Sie sehen, es setzt:

HANDLE_REDIRECTS

die steuert, :

Legt fest, ob Umleitungen automatisch verarbeitet werden sollen

1

Die RedirectHandler scheint veraltet zu sein, ich es geschafft, durch eine Änderung der Standard RedirectionStrategy für die diese DefaultHttpClient liks automatisch im Anschluss an die Umleitung Antworten zu deaktivieren:

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

Auf der anderen Seite, diese uns auf eine spezifische Bindung Implementierung des HttpClient, aber es macht den Job.

10

Mit der Version 4.3.x des HttpClient ist es direkt in der clientBuilder.

so, wenn u Ihre Client-Anwendung erstellen:

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

Ich weiß, ihr eine alte Frage, aber ich hatte auch dieses Problem und möchte, dass meine Lösung teilen.

Verwandte Themen