在URL对象中设置自定义HTTP请求标头不起作用

时间:2011-06-24 14:51:07

标签: java url http-headers http-authentication urlconnection

我正在尝试使用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(),正如您可以猜到的那样,虽然userpass是正确的,但我获得了HTTP 401未经授权

我做错了什么?

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

3 个答案:

答案 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)

您是否尝试过URLConnectionHttpURLConnection的子类并覆盖getRequestProperty()方法?