Java 在URL对象中设置自定义HTTP请求头不会';行不通
我正在尝试使用HTTP从IP摄像头获取图像。摄像头需要HTTP基本身份验证,因此我必须添加相应的请求标头:Java 在URL对象中设置自定义HTTP请求头不会';行不通,java,url,http-headers,http-authentication,urlconnection,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())));
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
是正确的
我做错了什么
我还尝试了新URL(“http://user:pass@myipcam/snapshot.jpg“
,但这也不起作用。在类中,它扩展了java.net.HttpURLConnection
,在请求安全敏感信息时,以下方法getRequestProperty(字符串键)
被重写为返回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);
}
这就是为什么在
uc.getRequestProperty(“授权”)
上有一个null
。您是否尝试过使用Apache?您是否尝试过子类化URLConnection
或HttpURLConnection
并重写getRequestProperty()
方法 问题已解决。它不起作用,因为我正在将url
传递到ImageIO.read()
相反,传递
uc.getInputStream()
让它工作起来。谢谢,现在我明白了获取null
的原因。但它为什么返回HTTP 401?是否可能根本没有设置“Authorization”属性?@Blagovest Buyukliev,如果uc扩展了HttpURLConnection
,则将其键入HttpURLConnection
,并通过调用getErrorStream()
获取错误的InputStream
。包含HTTP 401错误消息的。除此之外,我帮不了你。我尝试了HttpURLConnection uc=(HttpURLConnection)url.openConnection()
,但结果是一样的。我的问题实际上不在于getRequestProperty
,而在于unsent授权头。那么是否可以覆盖openConnection
方法?
// the following http request headers should NOT have their values
// returned for security reasons.
private static final String[] EXCLUDE_HEADERS = {
"Proxy-Authorization", "Authorization" };