2009-08-30 24 views
20

Mi sto connettendo all'applicazione AppEngine utilizzando la libreria Apache HttpComponents. Per autenticare i miei utenti, ho bisogno di passare un token di autenticazione insieme all'indirizzo di login dell'applicazione (http://myapp.appspot.com/_ah/login?auth=...) E prendere un cookie dall'intestazione della risposta. Tuttavia, la pagina di accesso risponde con un codice di stato di reindirizzamento e non so come impedire a HttpClient di seguire il reindirizzamento, impedendomi così di intercettare il cookie.Prevenzione di HttpClient 4 dal seguente reindirizzamento

Fwiw, il metodo effettivo che utilizzo per inviare la richiesta è riportato di seguito.

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

Come si può impedire al client di seguire il reindirizzamento?

Grazie.

Aggiornamento:

Come per la soluzione qui di seguito, ho fatto la seguente dopo aver creato un DefaultHttpClient client (e prima di passarlo al metodo 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; 
     } 
    }); 
} 

più dettagliato di quello che sembra esso deve essere, ma non così difficile come pensavo.

+1

Si noti che una volta impostato un RedirectHandler che rimane valido per tutte le Richieste successive, non solo la Richiesta di interesse qui.Quindi, se stai per emettere ulteriori Richieste che potrebbero richiedere il reindirizzamento per l'esecuzione corretta, dovrai eseguire un client.setRedirectHandler (nuovo DefaultRedirectHandler()) dopo l'esecuzione. – Torid

risposta

6

Provare a usare un RedirectHandler. Potrebbe essere necessario estendere DefaultHttpClient per restituire l'implementazione personalizzata da createRedirectHandler().

+1

Se si utilizza la sorprendente libreria di android-async-http, ho creato una richiesta di fork + pull con questo comportamento: https://github.com/loopj/android-async-http/pull/184 –

0

una rapida Google ha presentato: http://hc.apache.org/httpclient-3.x/redirects.html

+0

Grazie per il controllo, ma il collegamento è per HttpClient 3. Il mio problema è che sto scrivendo un'applicazione Android, e Android viene fornito con HttpClient 4. In effetti, se stavo usando l'HttpClient Commons (3.x), potrei semplicemente chiama setFollowRedirects (false) sul mio HttpMethod e si può fare con esso. Per quanto posso dire (e qualcuno mi corregga se ho torto), è un po 'più complicato (se possibile?) Con HttpComponents. – mjumbewu

29

Lo si può fare con i params http:

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

Il metodo non ha javadoc, ma se si guarda alla fonte si può vedere imposta:

HANDLE_REDIRECTS

che controlla :

Definisce se i reindirizzamenti devono essere gestiti automaticamente

1

La RedirectHandler sembrano essere deprecato, sono riuscito a disattivare automaticamente a seguito delle risposte di reindirizzamento modificando il default RedirectionStrategy per le liks DefaultHttpClient questo:

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

Sul fronte dei ribassi, questo ci legarlo ad una specifica implementazione di HttpClient ma fa il lavoro.

10

Con la versione 4.3.x di HttpClient è direttamente nello clientBuilder.

così quando u costruire il vostro uso del cliente:

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

So che la sua una vecchia questione, ma ho avuto anche questo problema e desidera condividere la mia soluzione.

Problemi correlati