模块 java.base

类 SNIHostName


public final class SNIHostName extends SNIServerName
此类的实例表示服务名称指示 (SNI) 扩展中类型为 host_name 的服务名称。

TLS 扩展 (RFC 6066) 的第 3 节“服务名称指示”中所述,“主机名”包含服务的完全限定 DNS 主机名,如客户端所理解的那样。主机名的编码服务名称值使用不带尾随点的 ASCII 编码表示为字节字符串。这允许通过使用 RFC 5890 中定义的 A 标签(国际化域名应用程序 (IDNA) 的有效字符串的 ASCII 兼容编码 (ACE) 形式)支持国际化域名 (IDN)。

请注意,SNIHostName 对象是不可变的。

自从:
1.8
参见:
  • 构造方法详细信息

    • SNIHostName

      public SNIHostName(String  hostname)
      使用指定的主机名创建一个 SNIHostName

      请注意,根据 RFC 6066 ,主机名的编码服务名称值是 StandardCharsets.US_ASCII 兼容的。在此方法中,hostname 可以是用户友好的国际化域名 (IDN)。 IDN.toASCII(String, int) 用于强制限制主机名中的 ASCII 字符(参见 RFC 3490RFC 1122RFC 1123 )并将 hostname 转换为 ASCII 兼容编码 (ACE),如:

         IDN.toASCII(hostname, IDN.USE_STD3_ASCII_RULES);
       

      hostname 参数在以下情况下是非法的:

      • hostname 是空的,
      • hostname 以尾随点结尾,
      • hostname 不是符合 RFC 3490 规范的有效国际化域名 (IDN)。
      参数:
      hostname - 此服务名称的主机名
      抛出:
      NullPointerException - 如果 hostnamenull
      IllegalArgumentException - 如果 hostname 是非法的
    • SNIHostName

      public SNIHostName(byte[] encoded)
      使用指定的编码值创建一个 SNIHostName

      此方法通常用于解析请求的 SNI 扩展中的编码名称值。

      根据 RFC 6066 ,主机名的编码名称值是 StandardCharsets.US_ASCII 兼容的。但是,在以前版本的 SNI 扩展 (RFC 4366) 中,编码的主机名使用 UTF-8 编码表示为字节字符串。出于版本容错的目的,此方法允许 encoded 参数的字符集可以是 StandardCharsets.UTF_8 以及 StandardCharsets.US_ASCII IDN.toASCII(String) 用于将 encoded 参数转换为 ASCII 兼容编码 (ACE) 主机名。

      强烈建议此构造函数仅用于解析请求的 SNI 扩展中的编码名称值。否则,为了符合 RFC 6066 ,请始终使用 StandardCharsets.US_ASCII 兼容的字符集,并对主机名中的 ASCII 字符实施限制(参见 RFC 3490RFC 1122RFC 1123 )作为 encoded 参数,或者使用 SNIHostName(String) 代替。

      encoded 参数在以下情况下是非法的:

      请注意,克隆 encoded 字节数组以防止后续修改。

      参数:
      encoded - 此服务名称的编码主机名
      抛出:
      NullPointerException - 如果 encodednull
      IllegalArgumentException - 如果 encoded 是非法的
  • 方法详情

    • getAsciiName

      public String  getAsciiName()
      返回此 SNIHostName 对象的 StandardCharsets.US_ASCII 兼容主机名。

      请注意,根据 RFC 6066 ,返回的主机名可能是包含 A 标签的国际化域名。有关详细的 A 标签规范的更多信息,请参阅 RFC 5890

      返回:
      这个 SNIHostName 对象的 StandardCharsets.US_ASCII 兼容主机名
    • equals

      public boolean equals(Object  other)
      将此服务名称与指定对象进行比较。

      根据 RFC 6066 ,DNS 主机名不区分大小写。当且仅当两个服务主机名具有相同的名称类型并且主机名在大小写无关的比较中相等时,它们才相等。

      重写:
      equals 在类 SNIServerName
      参数:
      other - 要与之比较的其他服务名称对象。
      返回:
      当且仅当 other 被认为等于此实例时才为真
      参见:
    • hashCode

      public int hashCode()
      返回此 SNIHostName 的哈希码值。

      哈希码值是使用此 SNIHostName 的不区分大小写的主机名生成的。

      重写:
      hashCode 在类 SNIServerName
      返回:
      这个 SNIHostName 的哈希码值。
      参见:
    • toString

      public String  toString()
      返回对象的字符串表示形式,包括此 SNIHostName 对象中的 DNS 主机名。

      表示的确切细节未指定且可能会更改,但以下内容可能被视为典型:

         "type=host_name (0), value=<hostname>"
       
      "<hostname>" 是主机名的 ASCII 表示形式,可能包含 A 标签。例如,伪主机名的返回值可能类似于:
         "type=host_name (0), value=www.example.com"
       
         "type=host_name (0), value=xn--fsqu00a.xn--0zwm56d"
       

      请注意,表示的具体细节未指定,可能会发生变化。

      重写:
      toString 在类 SNIServerName
      返回:
      对象的字符串表示形式。
    • createSNIMatcher

      public static SNIMatcher  createSNIMatcher(String  regex)
      SNIHostName s 创建一个 SNIMatcher 对象。

      服务可以使用此方法来验证可接受的 SNIHostName s。例如,

         SNIMatcher matcher =
           SNIHostName.createSNIMatcher("www\\.example\\.com");
       
      将接受主机名“www.example.com”。
         SNIMatcher matcher =
           SNIHostName.createSNIMatcher("www\\.example\\.(com|org)");
       
      将接受主机名“www.example.com”和“www.example.org”。
      参数:
      regex - 正则表达式模式 表示要匹配的主机名
      返回:
      SNIHostNameSNIMatcher 对象
      抛出:
      NullPointerException - 如果 regexnull
      PatternSyntaxException - 如果正则表达式的语法无效