2011-06-24 71 views
6

我想從使用HTTP的IP攝像機獲取圖像。相機需要HTTP基本認證,所以我必須添加相應的請求頭:在URL對象中設置自定義HTTP請求標題不起作用

URL url = new URL("http://myipcam/snapshot.jpg"); 
URLConnection uc = url.openConnection(); 
uc.setRequestProperty("Authorization", 
    "Basic " + new String(Base64.encode("user:pass".getBytes()))); 

// outputs "null" 
System.out.println(uc.getRequestProperty("Authorization")); 

我後來經過url對象ImageIO.read(),而且,你可以猜到,我得到一個HTTP 401未經授權,雖然userpass是正確的。

我在做什麼錯?

我也試過new URL("http://user:[email protected]/snapshot.jpg"),但那也行不通。

回答

1

問題已解決。它沒有工作,因爲我通過urlImageIO.read()

相反,通過uc.getInputStream()得到它的工作。

3

sun.net.www.protocol.http.HttpURLConnection類,它擴展java.net.HttpURLConnection,下面的方法getRequestProperty(String key)被重寫請求安全敏感信息時,返回null

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

這裏是EXCLUDE_HEADERS聲明:

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

這就是爲什麼你遇到的uc.getRequestProperty("Authorization")一個null。您是否嘗試過使用Apache的HttpClient

+0

謝謝,現在我明白了'null'的原因。但爲什麼它會返回HTTP 401?是否有可能「授權」屬性根本沒有設置? –

+0

@Blagovest Buyukliev,如果'uc擴展HttpURLConnection',然後通過調用'getErrorStream()'將其轉換爲'HttpURLConnection'並獲取錯誤的'InputStream'。這包含HTTP 401錯誤的消息。除此之外,我無法幫助你。 –

0

您是否嘗試過子類URLConnectionHttpURLConnection並覆蓋getRequestProperty()方法?

+0

我試過'HttpURLConnection uc =(HttpURLConnection)url.openConnection()',但結果是一樣的。我的問題實際上並不是使用'getRequestProperty',而是使用未發送的授權標頭。 –

+0

那麼也許重寫'openConnection'方法? –

相關問題