18

我正在尝试读取 HTTP 请求的授权标头(因为我需要向其中添加一些内容),但标头值总是为 null。其他标题工作正常。

public void testAuth() throws MalformedURLException, IOException{
    URLConnection request = new URL("http://google.com").openConnection();
    request.setRequestProperty("Authorization", "MyHeader");
    request.setRequestProperty("Stackoverflow", "anotherHeader");
    // works fine
    assertEquals("anotherHeader", request.getRequestProperty("Stackoverflow"));
    // Auth header returns null
    assertEquals("MyHeader", request.getRequestProperty("Authorization"));
}

难道我做错了什么?这是“安全”功能吗?有没有办法使用 URLConnection 进行这项工作,还是我需要使用另一个 HTTP 客户端库?

4

4 回答 4

29

显然,这是一个安全“功能”。URLConnection 实际上是sun.net.www.protocol.http.HttpURLConnection的一个实例。它定义getRequestProperty为:

    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"
   };
于 2010-05-19T12:40:45.910 回答
0

我对额外的依赖项不满意,但是按照切换到 Commons Http 的建议为我解决了眼前的问题。

我仍然想知道我的原始代码有什么问题。

于 2010-05-19T09:22:29.437 回答
0

正如德文郡的回答正确指出的那样:这不是错误,而是“安全”功能

但是您不必切换到不同的库:始终可以MessageHeader通过反射访问底层-collection 并提取“Authorization”-header 值。

经过一番头疼后,我设法在这里提出了一个工作片段

于 2021-10-13T21:50:38.303 回答
-1

你试过使用URLConnection.addRequestProperty()吗?这就是我用来添加 HTTP 请求标头的方式。

于 2010-05-19T09:02:33.037 回答