URLConnection.getHeaderFields()返回Map <String,List <String >>的重点是什么?

rgh*_*rgh 2 java http

我无法在此方法中看到返回Map <String List <String >>的值,而不仅仅是Map <String,String>

当Web服务器在给定标头中返回多个值时,我期望Map <String List <String >>具有价值.将几个值作为逗号分隔列表返回是合法的.我最经常使用Cache-Control看到这个.我希望每个值都是列表中的一个项目.但是,情况并非如此:

import java.net.*;
import java.io.*;
import java.util.*;

class URLConnectionDemo {
  private static final String DEFAULT_URL = "http://stackoverflow.com";
  public static void main(String[] args) {
    URL url; 
    URLConnection urlConnection;
    try { 
      url = new URL((args.length==0) ? DEFAULT_URL : args[0]); 
      urlConnection = url.openConnection();  
      Map<String, List<String>> headerMap = urlConnection.getHeaderFields();
      System.out.printf("Header count = %d\n", headerMap.size());
      for(String key:headerMap.keySet()){
        System.out.printf("%s:\n", key);
        List<String> valuesList = headerMap.get(key);
        for(String value:valuesList){
          System.out.printf("  %s\n", value);
        }
      }
    } catch (IOException e) {
      System.out.println(e);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:

Header count = 19
null:
  HTTP/1.1 200 OK
....many other headers....
Cache-Control:
  public, max-age=7
Run Code Online (Sandbox Code Playgroud)

Cache-Control值仅作为单个String返回.

那么,在任何情况下,标题值List <String>是否有用?

解:

我在Tomcat上使用servlet来尝试生成重复的http响应头.

在servlet代码中,使用带有重复标题名称的HttpServletResponse.addHeader()的重复调用不起作用.所有标头值都合并为一个逗号分隔值.

但是,这不允许添加cookie.如果我多次使用HttpServletResponse.addCookie(),我会得到几个不同的Set-Cookie标头.这些确实最终成为列表中的独特字符串.

use*_*421 5

原因很简单,HTTP头可以重复和多值.