2010-05-19 8 views
12

Sto provando a leggere l'intestazione di autorizzazione per una richiesta HTTP (perché ho bisogno di aggiungervi qualcosa), ma ottengo sempre null per il valore dell'intestazione. Altre intestazioni funzionano bene.getRequestProperty ("Autorizzazione") restituisce sempre null

public void testAuth() throws MalformedURLException, IOException{ 
    URLConnection request = new URL("http://google.com").openConnection(); 
    request.setRequestProperty("Authorization", "MyHeader"); 
    request.setRequestProperty("Stackoverflow", "anotherHeader"); 
    // works fine 
    assertEquals("anotherHeader", request.getRequestProperty("Stackoverflow")); 
    // Auth header returns null 
    assertEquals("MyHeader", request.getRequestProperty("Authorization")); 
} 

Sto facendo qualcosa di sbagliato? È una funzionalità di "sicurezza"? C'è un modo per farlo funzionare con URLConnection, o devo usare un'altra libreria client HTTP?

risposta

21

Apparentemente, è una "funzionalità" di sicurezza. URLConnection è in realtà un'istanza di sun.net.www.protocol.http.HttpURLConnection. Esso definisce getRequestProperty come:

public String getRequestProperty (String key) { 
     // don't return headers containing security sensitive information 
     if (key != null) { 
      for (int i=0; i < EXCLUDE_HEADERS.length; i++) { 
       if (key.equalsIgnoreCase(EXCLUDE_HEADERS[i])) { 
        return null; 
       } 
      } 
     } 
     return requests.findValue(key); 
    } 

L'array EXCLUDE_HEADERS è definito come:

// the following http request headers should NOT have their values 
    // returned for security reasons. 
    private static final String[] EXCLUDE_HEADERS = { 
      "Proxy-Authorization", 
      "Authorization" 
    }; 
+1

Questo lo spiegherebbe. E anche perché lo stesso codice funziona bene su Google App Engine (dove utilizzano la propria implementazione di HttpUrlConnection). – Thilo

0

Hai provato a utilizzare URLConnection.addRequestProperty()? Ecco come uso per aggiungere intestazioni di richiesta HTTP.

+0

stesso risultato: le altre opere di intestazione, l'autorizzazione rimane nullo – Thilo

+0

Hai provato qualcosa di simile 'request.addRequestProperty (" Autorizzazione "," Base "+ hash (" nomeutente: password "));' dove 'hashed' è l'hash Base64 della stringa? Verifica se il tuo risultato è "assertEquals". –

+0

Non sto utilizzando l'autenticazione di base. – Thilo

0

Non sono contento delle dipendenze extra, ma seguendo lo suggestion to switch to Commons Http ho risolto il problema immediato per me.

Vorrei ancora sapere qual è il problema con il mio codice originale.