Module java.base
Package java.net

Class URLPermission

所有已实现的接口:
Serializable, Guard

public final class URLPermission extends Permission
代表访问由给定URL定义的资源或一组资源的权限,并针对给定的一组可由用户设置的请求方法和请求头。权限的名称是URL字符串。 操作字符串是请求方法和头的连接。此类不限制方法和头名称的范围。

URL

URL字符串具有以下预期结构。

     scheme : // authority [ / path ] [ ignored-query-or-fragment ]
 
scheme通常为http或https,但此类不限制。 authority被指定为:
     authority = [ userinfo @ ] hostrange [ : portrange ]
     portrange = portnumber | -portnumber | portnumber-[portnumber] | *
     hostrange = ([*.] dnsname) | IPv4address | IPv6address
 
dnsname是标准DNS主机或域名,即一个或多个由“.”分隔的标签。 IPv4address是标准的字面IPv4地址,IPv6addressRFC 2732中定义。但是,字面IPv6地址必须用'[]'字符括起来。 dnsname规范可以在名称之前加上“*.”,这意味着该名称将与其右侧域标签与此名称相同的任何主机名匹配。例如,“*.example.com”匹配“foo.bar.example.com”

portrange用于指定端口号,或适用于此权限的有界或无界端口范围。如果portrange不存在或无效,则假定如果方案是http(默认80)或https(默认443),则假定默认端口号。其他方案不假定默认值。可以指定通配符,表示所有端口。

userinfo是可选的。如果存在userinfo组件,则在创建URLPermission时将其忽略,并且对此类定义的任何其他方法没有影响。

path组件由一系列由'/'字符分隔的路径段组成。 path也可能为空。路径类似于FilePermission中的路径。以下示例显示了三种不同的方式:

URL示例
示例URL 描述
http://www.example.com/a/b/c.html 标识特定(单个)资源的URL
http://www.example.com/a/b/* '*'字符指代同一“目录”中的所有资源 - 换句话说,所有具有相同路径组件数量且仅在最终路径组件上有所不同的资源,由'*'表示。
http://www.example.com/a/b/- '-'字符指代在前面路径的所有资源的递归(例如,http://www.example.com/a/b/c/d/e.html匹配此示例)。

'*'和'-'只能在路径的最后一段中指定,并且必须是该段中的唯一字符。在构造URLPermissions时,将忽略URL的任何查询或片段组件。

作为特例,“scheme:*”形式的URL被接受为表示给定方案的任何URL。

URL字符串的schemeauthority组件在处理时不考虑大小写。这意味着对于这些组件,equals(Object)hashCode()implies(Permission)是不区分大小写的。如果authority包含字面IP地址,则将对地址进行规范化以进行比较。路径组件区分大小写。

ignored-query-or-fragment指的是出现在路径组件之后并且被此类的构造函数忽略的任何查询或片段。它定义为:

     ignored-query-or-fragment = [ ? query ] [ # fragment ]
 
其中queryfragmentRFC2396中定义。因此,getName()仅返回创建权限的URL字符串的schemeauthoritypath组件。

操作字符串

URLPermission的操作字符串是权限的方法列表请求头列表的连接。这些是权限的允许请求方法和允许请求头的列表(分别)。这两个列表由冒号':'字符分隔,每个列表的元素由逗号分隔。一些示例:

  • "POST,GET,DELETE"
  • "GET:X-Foo-Request,X-Bar-Request"
  • "POST,GET:Header1,Header2"

第一个示例指定方法:POST、GET和DELETE,但没有请求头。第二个示例指定一个请求方法和两个头。第三个示例指定两个请求方法和两个头。

如果请求头列表为空,则不需要存在冒号分隔符。操作字符串中不允许有空格。提供给URLPermission构造函数的操作字符串是不区分大小写的,并通过将方法名称转换为大写和将头名称转换为RFC2616中定义的形式(每个单词的首字母大写)来进行规范化。任一列表都可以包含通配符'*'字符,表示所有请求方法或头,分别。

注意。根据使用上下文,有些请求方法和头可能始终允许,而其他可能从不允许。例如,HTTP协议处理程序可能不允许应用程序代码设置某些头,如Content-Length,无论当前安全策略是否允许。

自1.8版本起:
1.8
外部规范
参见:
  • Constructor Summary

    Constructors
    Constructor
    Description
    通过调用两个参数构造函数创建具有给定URL字符串和不受限制的方法和请求头的URLPermission:URLPermission(url, "*:*")
    URLPermission(String url, String actions)
    从URL字符串创建新的URLPermission,并允许给定的请求方法和用户可设置的请求头。
  • Method Summary

    Modifier and Type
    Method
    Description
    boolean
    如果this.getActions().equals(p.getActions())并且p的URL等于this的URL,则返回true。
    返回规范化的方法列表和请求头列表,形式为:
    int
    返回从操作字符串和URL字符串的哈希码计算的哈希码。
    boolean
    检查此URLPermission是否暗示给定的权限。

    Methods declared in class java.security.Permission

    checkGuard, getName, newPermissionCollection, toString

    Methods declared in class java.lang.Object

    clone, finalize, getClass, notify, notifyAll, wait, wait, wait
  • Constructor Details

    • URLPermission

      public URLPermission(String url, String actions)
      从URL字符串创建新的URLPermission,并允许给定的请求方法和用户可设置的请求头。权限的名称是创建它的URL字符串。仅在内部使用URL的方案、权限和路径组件。将忽略任何片段或查询组件。权限操作字符串如上所述。
      参数:
      url - URL字符串
      actions - 操作字符串
      抛出:
      IllegalArgumentException - 如果URL无效或操作包含空格。
    • URLPermission

      public URLPermission(String url)
      通过调用两个参数构造函数创建具有给定URL字符串和不受限制的方法和请求头的URLPermission:URLPermission(url, "*:*")
      参数:
      url - URL字符串
      抛出:
      IllegalArgumentException - 如果URL不会导致有效的URI
  • Method Details

    • getActions

      public String getActions()
      返回规范化的方法列表和请求头列表,形式为:
            "method-names : header-names"
       

      其中method-names是由逗号分隔的方法列表,header-names是由逗号分隔的允许的头列表。返回的字符串中没有空格。如果header-names为空,则冒号分隔符可能不存在。

      在类中由指定:
      getActions in class Permission
      返回:
      Permission的操作。
    • implies

      public boolean implies(Permission p)
      检查此URLPermission是否包含给定的权限。具体地,按照以下顺序执行以下检查:
      • 如果'p'不是URLPermission的实例,则返回false
      • 如果p的任何方法不在this的方法列表中,并且如果this的方法列表不等于"*",则返回false。
      • 如果p的任何标头不在this的请求标头列表中,并且如果this的请求标头列表不等于"*",则返回false。
      • 如果this的URL方案不等于p的URL方案,则返回false
      • 如果this的URL的方案特定部分为'*',则返回true
      • 如果由p的URL hostrange定义的主机集不是this的URL hostrange的子集,则返回false。例如,"*.foo.example.com"是"*.example.com"的子集。"foo.bar.example.com"不是"*.foo.example.com"的子集
      • 如果由p的URL定义的端口范围不是this的URL定义的端口范围的子集,则返回false。
      • 如果由p的URL指定的路径包含在this的URL指定的路径集合中,则返回true
      • 否则,返回false

      下面显示了路径匹配的一些示例:

      路径匹配示例
      this的路径 p的路径 匹配
      /a/b /a/b
      /a/b/* /a/b/c
      /a/b/c/d
      /a/b/c/-
      /a/b/- /a/b/c/d
      /a/b/c/d/e
      /a/b/c/*
      指定者:
      implies 在类 Permission
      参数:
      p - 要检查的权限。
      返回:
      如果指定的权限由此对象隐含,则返回true,否则返回false
    • equals

      public boolean equals(Object p)
      如果this.getActions().equals(p.getActions())并且p的URL等于this的URL,则返回true。否则返回false。
      指定者:
      equals 在类 Permission
      参数:
      p - 与此对象进行相等性测试的对象。
      返回:
      如果两个Permission对象等效,则返回true
      参见:
    • hashCode

      public int hashCode()
      返回从操作字符串的哈希码和URL字符串的哈希码计算得到的哈希码。
      指定者:
      hashCode 在类 Permission
      返回:
      此对象的哈希码值。
      参见: