我正在尝试使用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()
,正如您可以猜到的那样,虽然user
和pass
是正确的,但我获得了HTTP 401未经授权
我做错了什么?
我也尝试了new URL("http://user:pass@myipcam/snapshot.jpg")
,但这也不起作用。
答案 0 :(得分:3)
在扩展java.net.HttpURLConnection
的课程sun.net.www.protocol.http.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")
的原因。您是否尝试过使用Apache的HttpClient?
答案 1 :(得分:1)
问题已解决。它没有用,因为我将url
传递给ImageIO.read()
。
相反,通过uc.getInputStream()
让它发挥作用。
答案 2 :(得分:0)
您是否尝试过URLConnection
或HttpURLConnection
的子类并覆盖getRequestProperty()
方法?