java Httpclient 4, errore 302. Come reindirizzare?



3 Answers

Nelle versioni successive di HttpCLient (4.1+), puoi fare questo:

DefaultHttpClient client = new DefaultHttpClient()
client.setRedirectStrategy(new LaxRedirectStrategy())

LaxRedirectStrategy reindirizzerà automaticamente le richieste HEAD, GET e POST. Per un'implementazione più rigida, utilizza DefaultRedirectStrategy.

java authentication post httpclient http-status-code-302

Voglio accedere a un sito che richiede prima un'autenticazione (server Tomcat) e quindi accedere con una richiesta POST e mantenere quell'utente per vedere le pagine del sito. Io uso Httpclient 4.0.1

La prima autenticazione funziona correttamente ma non l'accesso che si lamenta sempre di questo errore: "302 Spostati temporaneamente"

Conservo i cookie e tengo un contesto e ancora nulla. In realtà, sembra che l'accesso funzioni, perché se scrivo parametri errati o user || password, vedo la pagina di login. Quindi suppongo che ciò che non funziona è il reindirizzamento automatico.

Seguendo il mio codice, che genera sempre IOException, 302:

    DefaultHttpClient httpclient = new DefaultHttpClient();
    CookieStore cookieStore = new BasicCookieStore();
    httpclient.getParams().setParameter(
      ClientPNames.COOKIE_POLICY, CookiePolicy.BROWSER_COMPATIBILITY); 
    HttpContext context = new BasicHttpContext();
    context.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
    //ResponseHandler<String> responseHandler = new BasicResponseHandler();

    Credentials testsystemCreds = new UsernamePasswordCredentials(TESTSYSTEM_USER,  TESTSYSTEM_PASS);
    httpclient.getCredentialsProvider().setCredentials(
            new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT),
            testsystemCreds);

    HttpPost postRequest = new HttpPost(cms + "/login");
    List<NameValuePair> formparams = new ArrayList<NameValuePair>();
    formparams.add(new BasicNameValuePair("pUserId", user));
    formparams.add(new BasicNameValuePair("pPassword", pass));
    postRequest.setEntity(new UrlEncodedFormEntity(formparams, "UTF-8"));
    HttpResponse response = httpclient.execute(postRequest, context);
    System.out.println(response);

    if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK)
        throw new IOException(response.getStatusLine().toString());

    HttpUriRequest currentReq = (HttpUriRequest) context.getAttribute( 
            ExecutionContext.HTTP_REQUEST);
    HttpHost currentHost = (HttpHost)  context.getAttribute( 
            ExecutionContext.HTTP_TARGET_HOST);
    String currentUrl = currentHost.toURI() + currentReq.getURI();        
    System.out.println(currentUrl);

    HttpEntity entity = response.getEntity();
    if (entity != null) {
        long len = entity.getContentLength();
        if (len != -1 && len < 2048) {
            System.out.println(EntityUtils.toString(entity));
        } else {
            // Stream content out
        }
    }



Devi implementare un gestore di reindirizzamento personalizzato che indicherà che la risposta al POST è un reindirizzamento. Questo può essere fatto sovrascrivendo il metodo isRedirectRequested () come mostrato di seguito.

DefaultHttpClient client = new DefaultHttpClient();
client.setRedirectHandler(new DefaultRedirectHandler() {                
    @Override
    public boolean isRedirectRequested(HttpResponse response, HttpContext context) {
        boolean isRedirect = super.isRedirectRequested(response, context);
        if (!isRedirect) {
            int responseCode = response.getStatusLine().getStatusCode();
            if (responseCode == 301 || responseCode == 302) {
                return true;
            }
        }
        return isRedirect;
    }
});

Nella versione successiva di HttpClient, il nome della classe è DefaultRedirectStrategy, ma lì può essere utilizzata una soluzione simile.




I reindirizzamenti non vengono gestiti automaticamente da HttpClient 4.1 per altri metodi oltre a GET e PUT.




Related