Установка пользовательских заголовков HTTP-запроса в объекте URL не работает - PullRequest
7 голосов
/ 24 июня 2011

Я пытаюсь получить изображение с IP-камеры, используя HTTP.Для камеры требуется базовая аутентификация 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 не авторизован, хотя user и pass верны.

Что я делаю не так?

Я также пытался new URL("http://user:pass@myipcam/snapshot.jpg"), но это тоже не работает.

Ответы [ 3 ]

3 голосов
/ 24 июня 2011

В классе 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" };

Вот почему у вас null на uc.getRequestProperty("Authorization"). Вы пытались использовать HttpClient от Apache?

1 голос
/ 27 июня 2011

Проблема решена.Это не сработало, потому что я передавал url на ImageIO.read().

Вместо этого, передав uc.getInputStream(), получилось.

0 голосов
/ 24 июня 2011

Вы пытались создать подкласс URLConnection или HttpURLConnection и переопределить метод getRequestProperty()?

...