7

我正在尝试使用 HTTP 从 IP 摄像机获取图像。摄像头需要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 Unauthorized,尽管user并且pass是正确的。

我究竟做错了什么?

我也尝试过new URL("http://user:pass@myipcam/snapshot.jpg"),但这也不起作用。

4

3 回答 3

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

这就是为什么你有一个nullon uc.getRequestProperty("Authorization")。您是否尝试过使用Apache的HttpClient ?

于 2011-06-24T15:03:30.767 回答
2

问题解决了。它不起作用,因为我正在传递urlImageIO.read().

相反,通过uc.getInputStream()让它发挥作用。

于 2011-06-27T09:00:37.980 回答
0

您是否尝试过继承URLConnectionHttpURLConnection覆盖该getRequestProperty()方法?

于 2011-06-24T15:13:49.833 回答