Java Security Architecture--Java安全体系技术文档翻译(四)

返回目录

四 访问控制机制和算法

4.1 java.security.ProtectionDomain

ProtectionDomain类囊括了域相关的一组特征。该域包括了一个类的集合,以一组当事人身份执行时这些类的实例会被赋予一组许可。
一个保护域(ProductionDomain)由一个CodeSource、一个ClassLoader、一个Principals数组以及一个Permissions的集合组成。CodeSource囊括了本域内的所有类的代码库(java.net.URL),同时包括了一个公钥证书(java.security.cert.Certificate)的集合,对应着用于签名本域内所有代码的私钥。Principals代表了代码正在以什么身份运行。
在ProtectionDomain构造时传递进来的许可(permissions)代表了与该域绑定的一个静态的许可集合,该静态许可集合不考虑正在生效的安全规则(Policy)。ProtectionDomain随后在每次安全检查中咨询当前的安全规则从而获得该域被赋予的动态许可。
从不同的代码源而来的类,或者以不同的当事人身份执行的代码,属于不同的域(domain)。
今天,所有作为Java 2 SDK的一部分而集成的代码都被认为是系统代码,运行在唯一的系统域中。每一个applet或应用运行在在由规则(policy)决定的合适的应用程序域中。
确保任何非系统域中的对象不能自动发现其他非系统域中的对象,这是可行的。这种分区性可通过非常小心的类解析与加载,例如,对不同域使用不同的类加载器(classloader),来实现。然而,SecureClassLoader(或者其子类)可以,如果选择的话,加载来自不同域的类,这样就能允许这些类存在于同一个命名空间(就像被classloader分区一样)。

4.2 java.security.AccessController

AccessController被用来达到三个目的,每一个会在下面的段落里进行详细的描述:
  • 决定对一个重要系统资源的访问是会被允许还是拒绝,基于当前起正在作用的安全规则。
  • 标记被执行了“privileged”的代码,如此一来就影响到随后的访问决定。
  • 获得一个当前调用上下文的“快照”,如此的话从一个不同上下文做出的访问控制的决定就可以考虑到被保存的上下文。
任何需要对系统资源进行访问控制的代码都应该调用AccessController的方法,如果希望使用这些方法所使用的特定的安全模型和访问控制算法。另一方面,如果应用程序希望延迟安全模型到运行期间注册的SecurityManager中,那它应该调用SecurityManager的相应的方法。例如,调用access control的典型的方法是如下的代码(从一个较早的JDK版本拿来的):
ClassLoader loader = this.getClass().getClassLoader();
	if(loader != null){
		SecurityManager security = System.getSecurityManager();
		if(security != null){
			security.checkRead("path/file");
		}
	}

在新的体系下,无论一个调用类是否有关联的classloader,其安全检查都应该被调用。这可以很简单,例如:
FilePermission perm = new FilePermission("path/file", "read");
AccessController.checkPermission(perm);

AccessController的checkPermission方法检查当前的执行上下文并做出一个访问请求是否被允许的正确决定。如果被允许的话,该方法就安静的退出。否则,一个AccessControlException(java.lang.SecurityException的子类)被抛出。
注意到在一些遗留系统中,例如在一些浏览器中,SecurityManager是否注册意味着采用了导致不同行为的安全状态。为了向后兼容,SecurityManager的checkPermission方法可以如下使用:

SecurityManager security = System.getSecurityManager();
	if(Security != null){
		FilePermission perm = new FilePermission("path/file", "read");
		security.checkPermission(perm);
	}

我们当前并没有改变这方面对于SecurityManager的使用,但是会鼓励应用开发者在未来的开发中,如果内置的安全控制算法合适的话,使用Java 2 SDK引入的新的技术。SecurityManager的checkPermission方法的默认行为实际上是调用AccessController的checkPermission方法。一个不同的SecurityManager实现可以实现其自己的安全管理方法,很可能在决定是否允许一个访问请求时包含了更多的约束。

4.2.1 检查许可时的算法

设想访问控制检查发生在由多个调用者(caller)组成的调用链的计算线程中(可以想象为多个处于不同安全域的方法的调用链),如下图所示:
当最近的调用者(例如:File类的方法)调用了AccessController的checkPermission方法,决定是允许还是拒绝访问请求的算法如下所示:
如果调用链上的任何一个调用者(caller)没有这次请求所需要的许可,将会抛出AccessControlException,除非接下来的情况属实--一个其安全域拥有上述许可的调用者被标记为“privileged”(查看下一章)并且所有直接或者间接被该调用者调用的安全域都拥有上述的许可。很明显有两种实现策略:
在“积极评估”实现中,一个线程无论进入还是退出一个新的保护域,起作用的许可集合都会被动态的更新。
该实现策略的好处是,检查一个访问是否被允许是很简单的,并且在很多情况下是更快速的。不利之处在于,由于许可检查发生频率远比跨域调用低,因此相当大一部分跨域调用时许可的更新都是在做无用功。
在“懒惰评估”实现中,当一个许可检查被请求时,线程状态(由当前状态,包括当前线程的调用栈或其等价物,来表达)被检查,然后该访问请求是被拒绝还是被允许的决定会被做出来。
该方式的一个可能的负面影响是,在权限检查时性能表现不佳,虽然该情况在“积极评估”实现中也可能被引起(虽然一开始快,但在每一次跨域调用时都会扩展)。到目前为止我们的实现折中于可接受的性能表现,所以我们感觉“懒惰评估”是最划算的方案。
因此,当前的实现中对许可的检查算法使用的是“懒惰评估”。设想当前的线程跨越了多个方法调用,按照caller1到caller2到callerm的顺序。callerm调用了checkPermission方法。checkPermission用来决定一个访问请求是被允许还是拒绝的基本算法如下所示(在随后的章节有些许改良):

i = m;
	while(i>0){
		if(caller i's domain does not have the permission)
			throw AccessControlException
		else if(caller i is marked as privileged)
			return;
		i = i-1;
	};

4.2.2 处理特权

AccessController的一个新的、静态的方法允许一个class对象的代码告知AccessController该代码的函数体是“特权的”,它自己负责对自己可达资源的访问请求,无论是什么代码调用导致的。
也就是说,一个调用者(caller)可以被标记为“特权的”,当它调用doPrivileged方法。当做访问控制决定时,checkPermission方法在到达一个无上下文参数的“特权的”调用者时会直接停止检查(关于上下文参数的信息请看随后的章节)。如果“特权”调用者(caller)的保护域有该特定许可,checkPermission就不会再做进一步的检查,然后直接安静的退出,意味着访问请求被允许了。如果“特权的”调用者(caller)的保护域没有该特定许可,异常会像平常一样被抛出。
常见“特权”特性的使用如下所示:
如果你不需要从“特权”代码块中返回值,像如下代码:

somemethod() {
       		...normal code here...
       		AccessController.doPrivileged(new PrivilegedAction() {
           		public Object run() {
               			// privileged code goes here, for example:
               			System.loadLibrary("awt");
               			return null; // nothing to return
           		}
       		});
       		...normal code here...
  	}

PrivilegeAction是一个只有一个方法的接口,该方法名为run,并且返回一个Object。上述的例子展示了一个实现了该接口的匿名内部类的创建;提供了一个run方法的具体实现。当调用doPrivilege时,一个PrivilegeAction实例被传递给它。doPrivilege方法在启用特权后调用该PrivilegeAction实现中的run方法,然后将该run方法中的返回值作为自己的返回值返回,在本例子中返回值被忽略。
(关于内部类的更多信息, 查看Java教程中的Nested Classes)
如果你需要返回一个结果,你可以像下面一样使用:

somemethod() {
       		...normal code here...
       		String user = (String) AccessController.doPrivileged(
         		new PrivilegedAction() {
           			public Object run() {
               				return System.getProperty("user.name");
           			}
         		}
       		);
       		...normal code here...
  	}

在你所写的run方法中的行为可能会抛出一个“checked”异常(在方法的throws语句中列出的异常),这样一来你需要使用PrivilegedExceptionAction接口来替代PrivilegedAction接口:
somemethod() throws FileNotFoundException {
       		...normal code here...
     		try {
       			FileInputStream fis = (FileInputStream)
        		AccessController.doPrivileged(
         			new PrivilegedExceptionAction() {
           				public Object run() throws FileNotFoundException {
               					return new FileInputStream("someFile");
           				}
         			}
       			);
     		} catch (PrivilegedActionException e) {
       			// e.getException() should be an instance of
       			// FileNotFoundException,
       			// as only "checked" exceptions will be "wrapped" in a
       			// <code>PrivilegedActionException</code>.
       			throw (FileNotFoundException) e.getException();
     		}
       		...normal code here...
 	}

一些关于特权代码的重要的点:首先,这个概念仅存在于单个线程中。一旦特权代码完成,该特权许可立刻会被清除或撤销。
第二,在该例子中,run方法中的函数体被标记为“特权的”。然而,如果它调用了低可信度并被授予更少权限的代码,该代码不会获得任何特权权限;只有在特权代码拥有相应权限并且该特权代码随后调用的直到checkPermission的调用者(caller)这整个调用链上的所有调用者(caller)都拥有相应权限时,才会赋予许可权。
查看如下网址获得将代码标记为“特权的”更多的信息 https://docs.oracle.com/javase/8/docs/technotes/guides/security/doprivileged.html 。

4.3 Access Control Context的继承

当一个线程创建了一个新线程,一个新的栈也被创建。如果在创建新线程时当前的安全上下文不被保存,那么当在新线程中调用AccessController.checkPermission时,安全决定将仅仅根据新线程的安全上下文做出,不会考虑父线程的安全上下文。
本质上说这个干净栈的问题并不是一个安全问题,但是它会使得编写安全代码,尤其是系统代码,更容易产生难易察觉的错误。例如,一个非专家的开发者可能会想当然的假定一个子线程(例如:一个没有涉及到不信任代码的)会从父线程(例如:一个涉及到不安全代码的)继承相同的安全上下文。而这将会导致不希望的安全漏洞,例如当从新创建的线程中访问受控的资源时(然后将该资源传递给不受信任的代码),如果父线程安全上下文没有被保存的话。
因此,当一个新线程被创建,我们实际上会确保(通过线程创建以及其他代码)在该子线程创建时自动的继承了父线程的安全上下文,以此来保证子线程中随后的checkPermission会考虑到继承的父线程安全上下文。
换句话说,逻辑上的线程安全上下文包括了父线程安全上下文(以AccessControlContext的形式,将在下一章描述)和当前调用栈的安全上下文,许可检查的算法扩展如下。(回想有m个caller直到调用checkPermission的caller,查看下一章来了解AccessControlContext的checkPermission方法。)

i = m;
 	while (i > 0) {
     		if (caller i's domain does not have the permission)
         		throw AccessControlException
     		else if (caller i is marked as privileged) 
         		return;
     		i = i - 1;
 	};


 	// Next, check the context inherited when
 	// the thread was created. Whenever a new thread is created, the
 	// AccessControlContext at that time is
 	// stored and associated with the new thread, as the "inherited"
 	// context.


 	inheritedContext.checkPermission(permission);

注意这种继承是可传递的,以至于一个祖孙线程会继承父线程和祖父线程的安全上下文。同样注意继承的上下文快照是在线程创建的时候取得,而不是线程第一次run的时候取得。并且没有开放的API可以修改这个继承特性。

4.4 java.security.AccessControlContext

回想在当前执行线程的安全上下文(包含了继承的安全上下文)中AccessController的checkPermission方法执行安全检查的情景。当这样一个安全检查只能在另外一个安全上下文中执行时候,困难就出现了。就是说,有些时候一个本应该在某特定安全上下文中执行的安全检查,实际上需要在另外一个不同的安全上下文中完成。例如,当一个线程向另外一个线程发送了一个事件,第二个线程在处理这个请求事件的时候没有正确的安全上下文来完成访问控制,如果这个服务需要请求访问受控资源的话。
为了解决该问题,我们为AccessController提供了getContext方法并提供了AccessControlContext类。getContext方法获取一个当前调用的安全上下文的“快照”,将其放在一个AccessControlContext对象中,并返回该对象。一个调用的样例如下:
AccessControlContext acc = AccessController.getContext();

该上下文快照抓取了相关的信息,所以一个访问控制决定可以在另外一个上下文中通过检查该上下文信息做出。例如,一个线程可以发送事件给另外一个线程,同时也提供当前的上下文快照信息。AccessControlContext本身有一个checkPermission方法,该方法基于它自己包含的安全上下文来做出访问控制决定,而不是当前执行线程的安全上下文。这样一来,如有必要,第二个线程就可以通过调用下面的代码来执行一个合适的安全检查:
acc.checkPermission(permission);

上面的方法调用等价于在第一个线程中执行安全检查,即使它是在第二个线程中执行的。
有时候一些安全控制上下文许可必须被检查,但是事先又不清楚是哪些许可。在这些情况下,你可以使用带上下文的doPrivilege方法:

somemethod() {
        	AccessController.doPrivileged(new PrivilegedAction() {
             		public Object run() {
                	// Code goes here. Any permission checks from 
                	// this point forward require both the current 
                	// context and the snapshot's context to have 
                	// the desired permission.
             	}
        }, acc);
        ...normal code here...

现在AccessController的checkPermission方法所使用的完整算法可以被给出了。假设当前线程跨越了m个调用者,按照caller1到caller2到callerm的顺序。然后callerm调用了checkPermission方法。checkPermission用来决定访问请求是被允许还是拒绝的算法如下:
i = m;
  	while (i > 0) {
     		if (caller i's domain does not have the permission)
        		throw AccessControlException
     		else if (caller i is marked as privileged) {
        		if (a context was specified in the call to doPrivileged)
           			context.checkPermission(permission);
        		return;
     		}
     		i = i - 1;
  	};




  	// Next, check the context inherited when
  	// the thread was created. Whenever a new thread is created, the
  	// AccessControlContext at that time is
  	// stored and associated with the new thread, as the "inherited"
  	// context.


  	inheritedContext.checkPermission(permission);






===========================================================================

本技术文档的翻译工作由不动明王1984独自完成,特此声明。

翻译辛苦,珍惜劳动,引用时请注明出处!

===========================================================================






返回目录


上一篇:Java Security Architecture--Java安全体系技术文档翻译(三)

下一篇:Java Security Architecture--Java安全体系技术文档翻译(五)




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JAVA开发人员必备是HTML格式的 JavaTM 2 Platform Standard Edition 6 API 规范 本文档Java 2 Platform Standard Edition 6.0 的 API 规范。 请参见: 描述 Java 2 Platform 软件包 java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。 java.awt 包含用于创建用户界面和绘制图形图像的所有类。 java.awt.color 提供用于颜色空间的类。 java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的各类事件的接口和类。 java.awt.font 提供与字体相关的类和接口。 java.awt.geom 提供用于在与二维几何形状相关的对象上定义和执行操作的 Java 2D 类。 java.awt.im 提供输入方法框架所需的类和接口。 java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的接口。 java.awt.image 提供创建和修改图像的各种类。 java.awt.image.renderable 提供用于生成与呈现无关的图像的类和接口。 java.awt.print 为通用的打印 API 提供类和接口。 java.beans 包含与开发 beans 有关的类,即基于 JavaBeansTM 架构的组件。 java.beans.beancontext 提供与 bean 上下文有关的类和接口。 java.io 通过数据流、序列化和文件系统提供系统输入和输出。 java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互。 java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio 定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。 java.nio.channels 定义了各种通道,这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义了用于多路复用的、非阻塞 I/O 操作的选择器。 java.nio.channels.spi 用于 java.nio.channels 包的服务提供者类。 java.nio.charset 定义用来在字节和 Unicode 字符之间转换的 charset、解码器和编码器。 java.nio.charset.spi java.nio.charset 包的服务提供者类。 java.rmi 提供 RMI 包。 java.rmi.activation 为 RMI 对象激活提供支持。 java.rmi.dgc 为 RMI 分布式垃圾回收提供了类和接口。 java.rmi.registry 提供 RMI 注册表的一个类和两个接口。 java.rmi.server 提供支持服务器端 RMI 的类和接口。 java.security安全框架提供类和接口。 java.security.acl 此包中的类和接口已经被 java.security 包中的类取代。 java.security.cert 提供用于解析和管理证书、证书撤消列表 (CRL) 和证书路径的类和接口。 java.security.interfaces 提供的接口用于生成 RSA Laboratory Technical Note PKCS#1 中定义的 RSA(Rivest、Shamir 和 Adleman AsymmetricCipher 算法)密钥,以及 NIST 的 FIPS-186 中定义的 DSA(数字签名算法)密钥。 java.security.spec 提供密钥规范和算法参数规范的类和接口。 java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text 包中类的服务提供者类。 java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序存储并获取用户和系统首选项和配置数据。 java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供用于读写标准 ZIP 和 GZIP 文件格式的类。 javax.accessibility 定义了用户界面组件与提供对这些组件进行访问的辅助技术之间的协定。 javax.crypto 为加密操作提供类和接口。 javax.crypto.interfaces 根据 RSA Laboratories' PKCS #3 的定义,提供 Diffie-Hellman 密钥接口。 javax.crypto.spec 为密钥规范和算法参数规范提供类和接口。 javax.imageio Java Image I/O API 的主要包。 javax.imageio.event Java Image I/O API 的一个包,用于在读取和写入图像期间处理事件的同步通知。 javax.imageio.metadata 用于处理读写元数据的 Java Image I/O API 的包。 javax.imageio.plugins.bmp 包含供内置 BMP 插件使用的公共类的包。 javax.imageio.plugins.jpeg 支持内置 JPEG 插件的类。 javax.imageio.spi 包含用于 reader、writer、transcoder 和流的插件接口以及一个运行时注册表的 Java Image I/O API 包。 javax.imageio.stream Java Image I/O API 的一个包,用来处理从文件和流中产生的低级别 I/O。 javax.management 提供 Java Management Extensions 的核心类。 javax.management.loading 提供实现高级动态加载的类。 javax.management.modelmbean 提供了 ModelMBean 类的定义。 javax.management.monitor 提供 monitor 类的定义。 javax.management.openmbean 提供开放数据类型和 Open MBean 描述符类。 javax.management.relation 提供 Relation Service 的定义。 javax.management.remote 对 JMX MBean 服务器进行远程访问使用的接口。 javax.management.remote.rmi RMI 连接器是供 JMX Remote API 使用的一种连接器,后者使用 RMI 将客户端请求传输到远程 MBean 服务器。 javax.management.timer 提供对 Timer MBean(计时器 MBean)的定义。 javax.naming 为访问命名服务提供类和接口。 javax.naming.directory 扩展 javax.naming 包以提供访问目录服务的功能。 javax.naming.event 在访问命名和目录服务时提供对事件通知的支持。 javax.naming.ldap 提供对 LDAPv3 扩展操作和控件的支持。 javax.naming.spi 提供一些方法来动态地插入对通过 javax.naming 和相关包访问命名和目录服务的支持。 javax.net 提供用于网络应用程序的类。 javax.net.ssl 提供用于安全套接字包的类。 javax.print 为 JavaTM Print Service API 提供了主要类和接口。 javax.print.attribute 提供了描述 JavaTM Print Service 属性的类型以及如何分类这些属性的类和接口。 javax.print.attribute.standard 包 javax.print.attribute.standard 包括特定打印属性的类。 javax.print.event 包 javax.print.event 包含事件类和侦听器接口。 javax.rmi 包含 RMI-IIOP 的用户 API。 javax.rmi.CORBA 包含用于 RMI-IIOP 的可移植性 API。 javax.rmi.ssl 通过安全套接字层 (SSL) 或传输层安全 (TLS) 协议提供 RMIClientSocketFactory 和 RMIServerSocketFactory 的实现。 javax.security.auth 此包提供用于进行验证和授权的框架。 javax.security.auth.callback 此包提供与应用程序进行交互所必需的类,以便检索信息(例如,包括用户名和密码的验证数据)或显示信息(例如,错误和警告消息)。 javax.security.auth.kerberos 此包包含与 Kerberos 网络验证协议相关的实用工具类。 javax.security.auth.login 此包提供可插入的验证框架。 javax.security.auth.spi 此包提供用于实现可插入验证模块的接口。 javax.security.auth.x500 此包包含应该用来在 Subject 中存储 X500 Principal 和 X500 Private Crendentials 的类。 javax.security.cert 为公钥证书提供类。 javax.security.sasl 包含用于支持 SASL 的类和接口。 javax.sound.midi 提供用于 MIDI(音乐乐器数字接口)数据的 I/O、序列化和合成的接口和类。 javax.sound.midi.spi 在提供新的 MIDI 设备、MIDI 文件 reader 和 writer、或音库 reader 时提供服务提供者要实现的接口。 javax.sound.sampled 提供用于捕获、处理和回放取样的音频数据的接口和类。 javax.sound.sampled.spi 在提供新音频设备、声音文件 reader 和 writer,或音频格式转换器时,提供将为其创建子类的服务提供者的抽象类。 javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API。 javax.sql.rowset JDBC RowSet 实现的标准接口和基类。 javax.sql.rowset.serial 提供实用工具类,允许 SQL 类型与 Java 编程语言数据类型之间的可序列化映射关系。 javax.sql.rowset.spi 第三方供应商在其同步提供者的实现中必须使用的标准类和接口。 javax.swing 提供一组“轻量级”(全部是 Java 语言)组件,尽量让这些组件在所有平台上的工作方式都相同。 javax.swing.border 提供围绕 Swing 组件绘制特殊边框的类和接口。 javax.swing.colorchooser 包含供 JColorChooser 组件使用的类和接口。 javax.swing.event 供 Swing 组件触发的事件使用。 javax.swing.filechooser 包含 JFileChooser 组件使用的类和接口。 javax.swing.plaf 提供一个接口和许多抽象类,Swing 用它们来提供自己的可插入外观功能。 javax.swing.plaf.basic 提供了根据基本外观构建的用户界面对象。 javax.swing.plaf.metal 提供根据 Java 外观(曾经代称为 Metal)构建的用户界面对象,Java 外观是默认外观。 javax.swing.plaf.multi 提供了组合两个或多个外观的用户界面对象。 javax.swing.plaf.synth Synth 是一个可更换皮肤 (skinnable) 的外观,在其中可委托所有绘制。 javax.swing.table 提供用于处理 javax.swing.JTable 的类和接口。 javax.swing.text 提供类 HTMLEditorKit 和创建 HTML 文本编辑器的支持类。 javax.swing.text.html 提供类 HTMLEditorKit 和创建 HTML 文本编辑器的支持类。 javax.swing.text.html.parser 提供默认的 HTML 解析器以及支持类。 javax.swing.text.rtf 提供一个类 (RTFEditorKit),用于创建富文本格式(Rich-Text-Format)的文本编辑器。 javax.swing.tree 提供处理 javax.swing.JTree 的类和接口。 javax.swing.undo 允许开发人员为应用程序(例如文本编辑器)中的撤消/恢复提供支持。 javax.transaction 包含解组期间通过 ORB 机制抛出的三个异常。 javax.transaction.xa 提供定义事务管理器和资源管理器之间的协定的 API,它允许事务管理器添加或删除 JTA 事务中的资源对象(由资源管理器驱动程序提供)。 javax.xml 根据 XML 规范定义核心 XML 常量和功能。 javax.xml.bind 为包含解组、编组和验证功能的客户端应用程序提供运行时绑定框架。 javax.xml.bind.annotation 定义将 Java 程序元素定制成 XML 模式映射的注释。 javax.xml.bind.annotation.adapters XmlAdapter 及其规范定义的子类允许任意 Java 类与 JAXB 一起使用。 javax.xml.bind.attachment 此包由基于 MIME 的包处理器实现,该处理器能够解释并创建基于 MIME 的包格式的已优化的二进制数据。 javax.xml.bind.helpers 仅由 JAXB 提供者用于: 提供某些 javax.xml.bind 接口的部分默认实现。 javax.xml.bind.util 有用的客户端实用工具类。 javax.xml.crypto 用于 XML 加密的通用类。 javax.xml.crypto.dom javax.xml.crypto 包的特定于 DOM 的类。 javax.xml.crypto.dsig 用于生成和验证 XML 数字签名的类。 javax.xml.crypto.dsig.dom javax.xml.crypto.dsig 包特定于 DOM 的类。 javax.xml.crypto.dsig.keyinfo 用来解析和处理 KeyInfo 元素和结构的类。 javax.xml.crypto.dsig.spec XML 数字签名的参数类。 javax.xml.datatype XML/Java 类型映射关系。 javax.xml.namespace XML 名称空间处理。 javax.xml.parsers 提供允许处理 XML 文档的类。 javax.xml.soap 提供用于创建和构建 SOAP 消息的 API。 javax.xml.stream javax.xml.stream.events javax.xml.stream.util javax.xml.transform 此包定义了用于处理转换指令,以及执行从源到结果的转换的一般 API。 javax.xml.transform.dom 此包实现特定于 DOM 的转换 API。 javax.xml.transform.sax 此包实现特定于 SAX2 的转换 API。 javax.xml.transform.stax 提供特定于 StAX 的转换 API。 javax.xml.transform.stream 此包实现特定于流和 URI 的转换 API。 javax.xml.validation 此包提供了用于 XML 文档验证的 API。 javax.xml.ws 此包包含核心 JAX-WS API。 javax.xml.ws.handler 该包定义用于消息处理程序的 API。 javax.xml.ws.handler.soap 该包定义用于 SOAP 消息处理程序的 API。 javax.xml.ws.http 该包定义特定于 HTTP 绑定的 API。 javax.xml.ws.soap 该包定义特定于 SOAP 绑定的 API。 javax.xml.ws.spi 该包定义用于 JAX-WS 2.0 的 SPI。 javax.xml.xpath 此包提供了用于 XPath 表达式的计算和访问计算环境的 object-model neutral API。 org.ietf.jgss 此包提供一个框架,该框架允许应用程序开发人员通过利用统一的 API 使用一些来自各种基础安全机制(如 Kerberos)的安全服务,如验证、数据完整性和和数据机密性。 org.omg.CORBA 提供 OMG CORBA API 到 JavaTM 编程语言的映射,包括 ORB 类,如果已实现该类,则程序员可以使用此类作为全功能对象请求代理(Object Request Broker,ORB)。 org.omg.CORBA_2_3 CORBA_2_3 包定义对 Java[tm] Standard Edition 6 中现有 CORBA 接口所进行的添加。 org.omg.CORBA_2_3.portable 提供输入和输出值类型的各种方法,并包含 org/omg/CORBA/portable 包的其他更新。 org.omg.CORBA.DynAnyPackage 提供与 DynAny 接口一起使用的异常(InvalidValue、Invalid、InvalidSeq 和 TypeMismatch)。 org.omg.CORBA.ORBPackage 提供由 ORB.resolve_initial_references 方法抛出的异常 InvalidName,以及由 ORB 类中的动态 Any 创建方法抛出的异常 InconsistentTypeCode。 org.omg.CORBA.portable 提供可移植性层,即可以使一个供应商生成的代码运行在另一个供应商 ORB 上的 ORB API 集合。 org.omg.CORBA.TypeCodePackage 提供用户定义的异常 BadKind 和 Bounds,它们将由 TypeCode 类中的方法抛出。 org.omg.CosNaming 为 Java IDL 提供命名服务。 org.omg.CosNaming.NamingContextExtPackage 此包包含以下在 org.omg.CosNaming.NamingContextExt 中使用的类: AddressHelper StringNameHelper URLStringHelper InvalidAddress 包规范 有关 Java[tm] Platform, Standard Edition 6 ORB 遵守的官方规范的受支持部分的明确列表,请参阅 Official Specifications for CORBA support in Java[tm] SE 6。 org.omg.CosNaming.NamingContextPackage 此包包含 org.omg.CosNaming 包的 Exception 类。 org.omg.Dynamic 此包包含 OMG Portable Interceptor 规范 http://cgi.omg.org/cgi-bin/doc?ptc/2000-08-06 的第 21.9 小节中指定的 Dynamic 模块。 org.omg.DynamicAny 提供一些类和接口使得在运行时能够遍历与 any 有关联的数据值,并提取数据值的基本成分。 org.omg.DynamicAny.DynAnyFactoryPackage 此包包含 DynamicAny 模块的 DynAnyFactory 接口中的类和异常,该模块在 OMG The Common Object Request Broker: Architecture and Specification http://cgi.omg.org/cgi-bin/doc?formal/99-10-07 的第 9.2.2 小节中指定。 org.omg.DynamicAny.DynAnyPackage 此包包含 DynAny 模块的 DynAnyFactory 接口中的类和异常,该模块在 OMG The Common Object Request Broker: Architecture and Specification http://cgi.omg.org/cgi-bin/doc?formal/99-10-07 的第 9.2 小节中指定。 org.omg.IOP 此包包含在 OMG 文档 The Common Object Request Broker: Architecture and Specification http://cgi.omg.org/cgi-bin/doc?formal/99-10-07 的 13.6.小节中指定的 IOP 模块。 org.omg.IOP.CodecFactoryPackage 此包包含 IOP::CodeFactory 接口中指定的异常(作为 Portable Interceptor 规范的一部分)。 org.omg.IOP.CodecPackage 此包根据 IOP::Codec IDL 接口定义生成。 org.omg.Messaging 此包包含 OMG Messaging Interceptor 规范 http://cgi.omg.org/cgi-bin/doc?formal/99-10-07 中指定的 Messaging 模块。 org.omg.PortableInterceptor 提供一个注册 ORB 钩子 (hook) 的机制,通过这些钩子 ORB 服务可以截取执行 ORB 的正常流。 org.omg.PortableInterceptor.ORBInitInfoPackage 此包包含 OMG Portable Interceptor 规范 http://cgi.omg.org/cgi-bin/doc?ptc/2000-08-06 的第 21.7.2 小节中指定的 PortableInterceptor 模块的 ORBInitInfo 本地接口中的异常和 typedef。 org.omg.PortableServer 提供一些类和接口,用来生成跨多个供应商 ORB 的可移植应用程序的服务器端。 org.omg.PortableServer.CurrentPackage 提供各种方法实现,这些实现能够访问调用方法的对象的身份。 org.omg.PortableServer.POAManagerPackage 封装 POA 关联的处理状态。 org.omg.PortableServer.POAPackage 允许程序员构造可在不同 ORB 产品间移植的对象实现。 org.omg.PortableServer.portable 提供一些类和接口,用来生成跨多个供应商 ORB 的可移植应用程序的服务器端。 org.omg.PortableServer.ServantLocatorPackage 提供定位 servant 的类和接口。 org.omg.SendingContext 为值类型的编组提供支持。 org.omg.stub.java.rmi 包含用于 java.rmi 包中出现的 Remote 类型的 RMI-IIOP Stub。 org.w3c.dom文档对象模型 (DOM) 提供接口,该模型是 Java API for XML Processing 的组件 API。 org.w3c.dom.bootstrap org.w3c.dom.events org.w3c.dom.ls org.xml.sax 此包提供了核心 SAX API。 org.xml.sax.ext 此包包含适合的 SAX 驱动程序不一定支持的 SAX2 设施的接口。 org.xml.sax.helpers 此包包含“帮助器”类,其中包括对引导基于 SAX 的应用程序的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值