精华内容
下载资源
问答
  • XMLHttpRequest 对象XMLHttpRequest 对象提供了 HTTP 协议完全访问,包括做出 POST 和 HEAD 请求以及普通 GET 请求能力。XMLHttpRequest 可以同步或异步地返回 Web 服务器响应,并且能够以文本或者一个 ...

     

    XMLHttpRequest 对象

    XMLHttpRequest 对象提供了对 HTTP 协议的完全的访问,包括做出 POST 和 HEAD 请求以及普通的 GET 请求的能力。XMLHttpRequest 可以同步或异步地返回 Web 服务器的响应,并且能够以文本或者一个 DOM 文档的形式返回内容。

    尽管名为 XMLHttpRequest,它并不限于和 XML 文档一起使用:它可以接收任何形式的文本文档。

    XMLHttpRequest 对象是名为 AJAX 的 Web 应用程序架构的一项关键功能。

    浏览器支持

    XMLHttpRequest 得到了所有现代浏览器较好的支持。唯一的浏览器依赖性涉及 XMLHttpRequest 对象的创建。在 IE 5 和 IE 6 中,必须使用特定于 IE 的 ActiveXObject() 构造函数。正如在 XMLHttpRequest 对象 这一节所介绍的。

    W3C 标准化

    XMLHttpRequest 对象还没有标准化,但是 W3C 已经开始了标准化的工作,本手册介绍的内容都是基于标准化的工作草案。

    当前的 XMLHttpRequest 实现已经相当一致。但是和标准有细微的不同。例如,一个实现可能返回 null,而标准要求是空字符串,或者实现可能把 readyState 设置为 3 而不保证所有的响应头部都可用。

    属性

    readyState

    HTTP 请求的状态.当一个 XMLHttpRequest 初次创建时,这个属性的值从 0 开始,直到接收到完整的 HTTP 响应,这个值增加到 4。

    5 个状态中每一个都有一个相关联的非正式的名称,下表列出了状态、名称和含义:

    状态名称描述
    0 Uninitialized 初始化状态。XMLHttpRequest 对象已创建或已被 abort() 方法重置。
    1 Open open() 方法已调用,但是 send() 方法未调用。请求还没有被发送。
    2 Sent Send() 方法已调用,HTTP 请求已发送到 Web 服务器。未接收到响应。
    3 Receiving 所有响应头部都已经接收到。响应体开始接收但未完成。
    4 Loaded HTTP 响应已经完全接收。

    readyState 的值不会递减,除非当一个请求在处理过程中的时候调用了 abort() 或 open() 方法。每次这个属性的值增加的时候,都会触发 onreadystatechange 事件句柄。

    responseText

    目前为止为服务器接收到的响应体(不包括头部),或者如果还没有接收到数据的话,就是空字符串。

    如果 readyState 小于 3,这个属性就是一个空字符串。当 readyState 为 3,这个属性返回目前已经接收的响应部分。如果 readyState 为 4,这个属性保存了完整的响应体。

    如果响应包含了为响应体指定字符编码的头部,就使用该编码。否则,假定使用 Unicode UTF-8。

    responseXML

    对请求的响应,解析为 XML 并作为 Document 对象返回。

    status

    由服务器返回的 HTTP 状态代码,如 200 表示成功,而 404 表示 "Not Found" 错误。当 readyState 小于 3 的时候读取这一属性会导致一个异常。

    statusText

    这个属性用名称而不是数字指定了请求的 HTTP 的状态代码。也就是说,当状态为 200 的时候它是 "OK",当状态为 404 的时候它是 "Not Found"。和 status 属性一样,当 readyState 小于 3 的时候读取这一属性会导致一个异常。

    事件句柄

    onreadystatechange

    每次 readyState 属性改变的时候调用的事件句柄函数。当 readyState 为 3 时,它也可能调用多次。

    方法

    abort()

    取消当前响应,关闭连接并且结束任何未决的网络活动。

    这个方法把 XMLHttpRequest 对象重置为 readyState 为 0 的状态,并且取消所有未决的网络活动。例如,如果请求用了太长时间,而且响应不再必要的时候,可以调用这个方法。

    getAllResponseHeaders()

    把 HTTP 响应头部作为未解析的字符串返回。

    如果 readyState 小于 3,这个方法返回 null。否则,它返回服务器发送的所有 HTTP 响应的头部。头部作为单个的字符串返回,一行一个头部。每行用换行符 "/r/n" 隔开。

    getResponseHeader()

    返回指定的 HTTP 响应头部的值。其参数是要返回的 HTTP 响应头部的名称。可以使用任何大小写来制定这个头部名字,和响应头部的比较是不区分大小写的。

    该方法的返回值是指定的 HTTP 响应头部的值,如果没有接收到这个头部或者 readyState 小于 3 则为空字符串。如果接收到多个有指定名称的头部,这个头部的值被连接起来并返回,使用逗号和空格分隔开各个头部的值。

    open()

    初始化 HTTP 请求参数,例如 URL 和 HTTP 方法,但是并不发送请求。

    send()

    发送 HTTP 请求,使用传递给 open() 方法的参数,以及传递给该方法的可选请求体。

    setRequestHeader()

    向一个打开但未发送的请求设置或添加一个 HTTP 请求。

     

    XMLHttpRequest.open()

    初始化 HTTP 请求参数

    语法

    open(method, url, async, username, password)

    method 参数是用于请求的 HTTP 方法。值包括 GET、POST 和 HEAD。

    url 参数是请求的主体。大多数浏览器实施了一个同源安全策略,并且要求这个 URL 与包含脚本的文本具有相同的主机名和端口。

    async 参数指示请求使用应该异步地执行。如果这个参数是 false,请求是同步的,后续对 send() 的调用将阻塞,直到响应完全接收。如果这个参数是 true 或省略,请求是异步的,且通常需要一个 onreadystatechange 事件句柄。

    username 和 password 参数是可选的,为 url 所需的授权提供认证资格。如果指定了,它们会覆盖 url 自己指定的任何资格。

    说明

    这个方法初始化请求参数以供 send() 方法稍后使用。它把 readyState 设置为 1,删除之前指定的所有请求头部,以及之前接收的所有响应头部,并且把 responseText、responseXML、status 以及 statusText 参数设置为它们的默认值。当 readyState 为 0 的时候(当 XMLHttpRequest 对象刚创建或者 abort() 方法调用后)以及当 readyState 为 4 时(已经接收响应时),调用这个方法是安全的。当针对任何其他状态调用的时候,open() 方法的行为是为指定的。

    除了保存供 send() 方法使用的请求参数,以及重置 XMLHttpRequest 对象以便复用,open() 方法没有其他的行为。要特别注意,当这个方法调用的时候,实现通常不会打开一个到 Web 服务器的网络连接。

    XMLHttpRequest.send()

    发送一个 HTTP 请求

    语法

    send(body)

    如果通过调用 open() 指定的 HTTP 方法是 POST 或 PUT,body 参数指定了请求体,作为一个字符串或者 Document 对象。如果请求体不适必须的话,这个参数就为 null。对于任何其他方法,这个参数是不可用的,应该为 null(有些实现不允许省略该参数)。

    说明

    这个方法导致一个 HTTP 请求发送。如果之前没有调用 open(),或者更具体地说,如果 readyState 不是 1,send() 抛出一个异常。否则,它发送一个 HTTP 请求,该请求由以下几部分组成:

    • 之前调用 open() 时指定的 HTTP 方法、URL 以及认证资格(如果有的话)。
    • 之前调用 setRequestHeader() 时指定的请求头部(如果有的话)。
    • 传递给这个方法的 body 参数。

    一旦请求发布了,send() 把 readyState 设置为 2,并触发 onreadystatechange 事件句柄。

    如果之前调用的 open() 参数 async 为 false,这个方法会阻塞并不会返回,直到 readyState 为 4 并且服务器的响应被完全接收。否则,如果 async 参数为 true,或者这个参数省略了,send() 立即返回,并且正如后面所介绍的,服务器响应将在一个后台线程中处理。

    如果服务器响应带有一个 HTTP 重定向,send() 方法或后台线程自动遵从重定向。当所有的 HTTP 响应头部已经接收,send() 或后台线程把 readyState 设置为 3 并触发 onreadystatechange 事件句柄。如果响应较长,send() 或后台线程可能在状态 3 中触发 onreadystatechange 事件句柄:这可以作为一个下载进度指示器。最后,当响应完成,send() 或后台线程把 readyState 设置为 4,并最后一次触发事件句柄。

     

    原文:http://www.w3school.com.cn/xmldom/dom_http.asp

    展开全文
  • 类都是用来描述对象的

    千次阅读 2012-12-04 23:36:09
    在面向对象语言Java中,所有的对象都是通过类来描述,但是类都是用来描述对象的吗?  我们会想到什么呢?Yeah,它就是抽象类!如果一个类并没有足够的信息去描述一个具体的对象,那么,就应该把类定义为抽象类。...

        在面向对象语言Java中,所有的对象都是通过类来描述,但是类都是用来描述对象的吗?

        我们会想到什么呢?Yeah,它就是抽象类!如果一个类并没有足够的信息去描述一个具体的对象,那么,就应该把类定义为抽象类。比如,当我们需要用一个类来定义一组具有共同属性和行为,但是又不需要给出行为的具体实现,这时,我们可以将此类定义为抽象类。抽象类往往用来表示我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。这时,我们就可以得出一个简单的结论:抽象类的作用就是用来定义一些共同的属性或行为但又不需要不用给出具体的实现。这时,你会联想到什么?

        接口!接口的作用就是用来定义一些实现类必须实现的行为。其实,一个接口就是一个只存在抽象方法或静态常量的抽象类。在关系方面来说,类的继承是强是关系(意思就是,你必须是以我为父类所衍生的子类),例如:人,必须是动物的一种。而接口的实现则是弱是关系(意思是,你是我的一部分,不是我的子类,就像眼睛是动物的一部分)。

        我比较喜欢使用接口,而不喜欢使用继承。天知道,这个类什么时候还要继承另外一个类!Java只允许单继承,也就是一个类只能有一个父类,而不能有很多父类,就像在现实生活中,你只可能也必须只有一个亲生父亲,而你的父类可以有很多个孩子。而接口就不存在这种限制,就好像你要我去一个地方,你管我是走路、挤公交、打的或者是飞机等等,我只要去到那里就成。当然,我可以走路走一段,挤公交挤一段,另外一段可能搭飞机去了。相对于类的继承来说,接口具有很大的灵活性,因为一个类可以实现多个接口。灵活,意味着难控制,也意味着可移植性强。工厂模式也不过如此吧。

        做事,都有要留有余地,做人,就更要有余地。其实,接口也体现了这个道理。

    展开全文
  • 下列关于对象的哪一种说法是正确的?请选择一个正确的答案。 (a)对象是可以其进行实例化从而得到类的东西。 (b)对象是类的实例。 (c)对象是一种蓝本,据此可以创建抽象的具体实现。 (d)对象是指向属性的...

    相关面试题搜索:
    Java春招面试题之编程基础类(一)

    Java春招面试题之编程基础类(二)

    今天能给大家介绍一个下常见面试题:

    用自己的语言描述Java中的类和对象

    下列关于对象的哪一种说法是正确的?请选择一个正确的答案。

    (a)对象是可以对其进行实例化从而得到类的东西。

    (b)对象是类的实例。

    (c)对象是一种蓝本,据此可以创建抽象的具体实现。

    (d)对象是指向属性的引用。

    (e)对象是一种变量。

    考点:该面试题考察求职者对于Java类和对象的理解。

    出现频率:★★★

    【面试题解析】

    1.类

    在处理复杂事物的时候,用到的一种基本手段就是抽象。抽象的目的就是区别事物之间的本质和不同,面向对象编程(OOP)的实质就是利用类和对象来建立抽象模型。

    类表示了对象的类别,是创建对象的蓝本。建立一个事物的抽象模型,本质上就是表达该事物的性质和行为。使用类来建立抽象模型,是通过在类中定义变量和方法来实现的。

    类中定义的属性是一种可存储值的变量,该变量代表着事物的具体性质。类的对象所具有的行是由定义的方法来实现的。类中定义的变量和方法被称为类的成员。

    在项目开发中,类一般可以通过UML建模来表示,如图1.1所示。
    在这里插入图片描述

    图1.1中,定义了类Gun的成员,即类Gun的变量和方法。从UML图中可以看到,类定义了如下所示3个变量。

    caliber:是一个Double 类型的变量,表示Gun 类所抽象事物(枪)的口径。

    length:是一个Double 类型的变量,表示Gun 类所抽象事物(枪)的长度。

    gun_type:是一个字符串类型的变量,表示Gun类所抽象事物(枪)的类型,例如是手枪还是突击步枪。

    同时类中定义了如下所示3个方法。

    fire:定义了Gun 的开火行为,及fire 方法。

    maintenance:定义了Gun 的维护方法。

    Gun:定义了一个同类同名的构造方法。

    开发者可以通过UML生成代码工具,或者是手工在编辑器中建立图1.1中所示的类,如下所示:

    public class Gun {

    // 定义枪的口径
    public Double caliber;

    // 定义枪的长度

    public Double length;

    // 定义枪的类型

    public int gun_type;

    // 构造方法

    public Gun() {

    }

    // 带参数的构造方法

    public Gun(String name) {

    }

    // 开火的方法

    public void fire() {

    System.out.println(gun_type +" is fireing");

    }

    // 维护的方法

    public Boolean maintenance() {

    return true;

    }

    }

    2.对象

    对象是类的实例。对象在构造时以类为蓝本,创建对象的过程叫做实例化。对象是类所表示的抽象事物的具体实例。例如前面所讲述的Gun类,那么可以根据Gun类创建一个ak47的对象,即Gun的具体实现。

    对象可以使用UML来表示,如图1.2所示。
    在这里插入图片描述

    ak47是根据Gun类创建的一个对象,在Java程序中,可以使用如下代码创建一个Gun对象:

    ……

    public static void main(String[] args) {

    //建立一个Gun类对象,即Gun类的实例ak47

    Gun ak47=new Gun();

    //定义ak47的口径

    ak47.caliber=7.6;

    //定义ak47的长度

    ak47.length=57.8;

    //定义ak47的类型

    ak47.gun_type=“AK47”;

    //调用fire方法

    ak47.fire();

    }

    ……
    运行该示例,结果如下:

    AK47 is firing

    参考答案:(b)。

    以上内容来自面试的书籍《Java程序员面试秘笈》

    在这里插入图片描述

    此书已加入到VIP会员卡,只要购买VIP会员卡即可免费阅读上百本电子书,这张VIP卡除了免费让你读书,还有更多的权益等你来领,往下↓拉
    在这里插入图片描述

    阅读电子书的方法如下:

    打开CSDN APP(软件商城搜索“CSDN”即可找到哦)—>登录CSDN账号—>学习—>电子书

    在这里插入图片描述

    展开全文
  • 对象安全描述

    千次阅读 2014-01-11 16:13:21
      简称:SDDL 四个主要组件令牌:所有者 (O:)、主要组 (G:)、DACL (D:) 和 SACL (S:) ...摘要:基于 ACL 安全性以及 Windows 访问控制模型简介。 1: ACL 编辑器 介绍 在这一系列文章中,我将讨论 Win

    本文转自:http://blog.csdn.net/luckylion/article/details/6524275

     

    简称:SDDL

    四个主要组件的令牌:所有者 (O:)、主要组 (G:)、DACL (D:) 和 SACL (S:)

    摘要:对基于 ACL 的安全性以及 Windows 访问控制模型的简介。

    1: ACL 编辑器

    介绍

    在这一系列的文章中,我将讨论 Windows 访问控制模型以及其在 Windows NT 和 2000 上的实现。我计划将此系列分为四部分。开始的时候我认为只需要一篇就行了(我只想写关于 Windows 2000 风格的 ACL 编辑器),但由于需要读者对 Windows 访问控制了解相当多的内容,因此我不得不完成针对这一主题的一个完整的系列。

    第一篇是对 Windows NT 上基于 ACL 的许可(从编程的观点)以及访问控制模型的实现的一个介绍。如果你从未用 Windows 安全性进行过编程,或者是刚刚开始,那么本文正适合于你。尽管在本文里使用 C 语言来呈现相关的结构,但是即使你不使用 C 语言编程,你也应该读一下本文。它包含了与所有程序员相关的概念。

    本系列不是有关安全管理的初级读本(已经有大量的这方面的文章,网站,教程和书籍了),而是试图从编程的角度讨论 Windows NT 的安全性模型。我将假定你知道如何设置文件或注册表键的许可权限,而且对 ACL 编辑器相当精通。我也将假定你知道什么是用户、什么是组。

    访问控制在 16 位 Windows 或者 Windows 95/98/ME 上不可用。

    目录

    整个系列的目录如下。

    1. 第一部分 - 背景知识和核心概念。访问控制相关结构
      1. 安全标识符(SID)
      2. 安全描述符(SD)
      3. 访问控制列表(ACL)
      4. 选择一个好的自由访问控制列表
      5. Windows 2000 的继承模型
      6. 令牌
      7. 对安全描述符定义语言的一些解释
      8. 小结
    2. 第二部分 - 基本的访问控制编程
      1. 选择语言
      2. 玩玩 SID
      3. 你是哪一组?
      4. 启用令牌特权
      5. 剖析安全描述符
      6. 遍历访问控制列表
      7. 创建访问控制列表
      8. 我可以访问吗?
      9. 创建并编辑安全的对象
      10. 保护自己的类
      11. 玩具程序下载
    3. 第三部分 - 用 .NET v2.0 进行访问控制编程
      1. .NET 安全性的历史
      2. 在 .NET 中读取一个 SID
      3. .NET 版本的 Whoami
      4. 在 .NET 中进行特权处理
      5. 在 .NET 中以非特权用户运行
      6. 在 .NET 中获取并编辑安全描述符,并将之应用到对象
      7. 在 .NET 中进行访问检查
      8. NetAccessControl 程序以及 AccessToken 类库
    4. 第四部分 - Windows 2000 风格的访问控制编辑器
      1. ACL 编辑器的特性(ACLUI)
      2. 开始
      3. 实现 ISecurityInformation 接口
      4. ISecurityInformation::SetSecurity
      5. 可选接口
      6. 呈现接口
      7. Filepermsbox - 一个显示 NTFS 文件或者文件夹的安全描述符的程序
      8. 历史

    背景

    Windows NT 的原始目标之一就是提供一个可以为操作系统实现安全性的层。Windows NT 为其对象实现安全性的途径就是使用访问控制模型。甚至基于角色的安全性和 .NET 类都不能够取代这一基于 ACL 的安全模型。ACLs are far too embedded in the NTFS architecture objects, and the registry was to be rendered obsolete (so much so, that .NET v2.0 had to relent and end up supporting the ACL model too).

    一开始,我将会描述在访问控制编程过程中可能遇到的不同类型的结构。本文的初衷是面向所有的程序员,这里面没有代码,只有结构和编程概念。

    1. 安全标识符(SID)

    在钻研授权(authorization)的概念之前,我们先讨论一下安全标识符(SID)。我们人类喜欢拿用户名来指代一个用户(例如"Administrator"),而计算机需要用二进制数据来指代用户。它使用被称为 SID 的哈希值来辨识用户。当一个用户被创建时,计算机会为该用户创建一个 SID,从那时起,计算机将使用用户的 SID 而不是用户名来指代用户。要看你自己的 SID 列表,可以打开注册便编辑器并展开 HKEY_USERS 树(可以看到当前登录的用户们的 SID 列表)(译者注:原文如此。但译者自己的看法是可以看到本机所有用户的 SID)。可以使用 ConvertSidToStringSid() 把原始的 SID 结构转换为文本形式。文本的 SID 通常以 S-1-5-21- 开头,由至少三个用短线分开的值组成,这些值代表了修订版本、职权(authority)、子职权(sub authority)、ID 以及主组(primary groups)。

    SID 也可以表示一个用户组、一台计算机、一个域乃至森林。Windows 维护着一个被称为周知 SID 的硬编码 SID 列表,它们代表了诸如 LocalSystem 或者NetworkService 这样的帐户。可以在 WELL_KNOWN_SID_TYPE 枚举中查看到这些 SID 的清单。

    要把一个 SID 转换为用户名,需要调用 LookupAccountSid(),而 LookupAccountName() 则可以把用户名转换为 SID。不过,大多数的安全性函数既接受 SID 也接受用户名(实际上是接受一个 TRUSTEE 结构,该结构是一个用户名和 SID 的联合体)。

    2. 安全描述符(SD)

    Windows NT 使用称为安全描述符的结构来保证对象的安全(SECURITY_DESCRIPTOR)。安全描述符是 Windows 创建对象时所基于的结构的一个主要部分。这意味着 Windows NT 可识别的每一个对象(可以是文件对象、注册表键、网络共享、互斥量、信号灯、进程、线程、令牌、硬件、服务、驱动...)都可以保证其安全。安全描述符结构既存在于内核模式也存在于用户模式,而且在两个模式中是一致的。虽然这允许了内核模式与用户模式在安全性方面的代码重用,但同时也意味着 SECURITY_DESCRIPTOR 从内核模式里继承了一些糟糕的怪异特性。

    如果打开 Winnt.h 并滚动到 SECURITY_DESCRIPTOR 结构,你就可以看到安全描述符的构成(图 2)。SECURITY_DESCRIPTOR 实际上有可能是两个结构之一,一个是绝对安全描述符(SECURITY_DESCRIPTOR),另一个是自相关安全描述符(图 3 SECURITY_DESCRIPTOR_RELATIVE)。

    typedef struct _SECURITY_DESCRIPTOR
    {
        BYTE Revision;             /* currently SECURITY_DESCRIPTOR_REVISION */
        BYTE Sbz1;                 /* 0 */
        SECURITY_DESCRIPTOR_CONTROL Control;
            /* The type of security descriptor */
        PSID Owner;                /* points to a SID (the owner SID) */
        PSID Group;                /* points to a SID (the primary group) */
        PACL Sacl;                 /* An array of discretionary accesses */
        PACL Dacl;                 /* the auditing accesses */
    } SECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;

    图 2: 绝对安全描述符

    我们可以看到,去掉两个版本控制成员,一个安全描述符由五个成员组成:

    • 自由访问控制列表(Dacl):这儿保存着对象的许可(允许谁访问对象,而拒绝谁)。
    • 系统访问控制列表(Sacl):指定要对对象执行的审核的类型。如果发生了审核事件,会被存储到审核事件的日志中。
    • Owner:指定对象的所有者(一个 SID)。对象的所有者总是可以更改安全描述符,而不管其他人对访问的锁定。
    • Group:指定对象的主组(一个 SID)。Windows 通常忽略此参数(这是为了 POSIX 兼容性,但它现在已经退化了)。
    • Control:表现为一个 16 位整数的一组标志。可以为零或以下标志: 
      • SE_DACL_PRESENTDacl 成员有效。
      • SE_SACL_PRESENTSacl 成员有效。
      • SE_DACL_AUTO_INHERITED:DACL 从其包含的父那里自动继承并得到其中各项。
      • SE_SACL_AUTO_INHERITED:和 SE_DACL_AUTO_INHERITED 一样,只不过应用于 SACL。
      • SE_DACL_PROTECTED:如果父的 ACL 与这里定义的任何 ACL 冲突,覆盖父的 ACL。用于覆盖继承。
      • SE_SACL_PROTECTED:和 SE_DACL_PROTECTED 一样,只不过用于 SACL。
      • SE_DACL_DEFAULTEDDacl 成员等同于此类对象的缺省 DACL。
      • SE_SACL_DEFAULTEDSacl 成员等同于此类对象的缺省 SACL。
      • SE_GROUP_DEFAULTEDGroup 成员等同于此类对象的缺省组。
      • SE_OWNER_DEFAULTEDOwner 为缺省的。
      • SE_SELF_RELATIVE:表示此安全描述符是自相关的。

    此结构的后四项都是指针,指向 ACL 等所在的缓冲区。这些指针可以指向内存中的任意合法地址,而且并不需要在一个连续块中。由于安全描述符不是连续的,所以将安全描述符写到磁盘或者令之跨越进程将会是一件相当麻烦的事情。微软通过引入一个称为自相关安全描述符的结构来解决这一问题(图 3 SECURITY_DESCRIPTOR_RELATIVE)。

    /* This is not valid C or C++ code. */
    typedef struct _SECURITY_DESCRIPTOR_RELATIVE
    {
        BYTE  Revision;    /* currently SECURITY_DESCRIPTOR_REVISION */
        BYTE  Sbz1;        /* 0 */
        SECURITY_DESCRIPTOR_CONTROL Control;
        /* The type of security descriptor */
        DWORD OwnerOffset;
        /** The index of this->Owner. ie.
        *   (this+OwnerOffset) should == this->Owner
        **/
        DWORD GroupOffset; /* The index of this->Group */
        DWORD SaclOffset;  /* The offset to Sacl */
        DWORD DaclOffset;  /* The offset to Dacl*/
    
        struct SecurityDescriptorData 
        {
        /* The data for the security descriptor is after the 4 DWORDs */
            ...            /* padding bytes */
            SID Owner;     /* The SID is stored Inside the structure */
            ...
            SID Group;     /* so are the other parts */
            ...
            ACL Sacl[]; 
            /* the entries need not appear in this order */
            ...
            ACL Dacl[];
        } ;
    } SECURITY_DESCRIPTOR_RELATIVE, *PISECURITY_DESCRIPTOR_RELATIVE;

    图 3:自相关安全描述符的结构

    自相关安全描述符比起绝对安全描述符来更加复杂。(相当复杂,甚至不能用 C++ 来表示它)。虽然前三个字段和绝对安全描述符一样,但其后就变得大不相同。在 Control 成员之后是四个表示数据偏移的 DWORD。安全描述符相关的数据全部在这四个 DWORD 之后。我在结构中插入了填充字节以显示数据可以出现在缓冲区中的任意位置,简单地改变 Offset 成员即可移动缓冲区。四个成员也不需要以任何特殊的顺序出现。使用特定的偏移,可以使 Owner 成员出现在 Group 之后。付出令人生畏的复杂性的代价之后,自相关安全描述符占据了一个连续内存快,使它适合于在应用边界间以及存储介质间传递。

    现在你可以说出绝对安全描述符和自相关安全描述符之间的区别了?区别在于,对于一个绝对安全描述符,在 Control 成员之后是四个指针,分别依次指向 Group / Owner / SACL / DACL,而且这四个指针指向内存中用以存放数据的不同位置。而对于一个自相关安全描述符,在 Control 成员之后是四个 DWORD,以表示到 Group / Owner / SACL / DACL 的偏移。举例来说,如果 group 成员的值为 0xf,则就是在告诉 Windows,"你可以在我之后的 0xf 字节处找到组 SID"。由于这两个结构具有不同的大小,所以 64 位的 Windows 会使得这件事情更加令人迷惑!

    更糟糕的是,微软在文档中并不区分绝对安全描述符和自相关安全描述符。微软还保留了对安全描述符作内部更改的权利,也就是说你不能认为将来此结构和现在是一样的。如果要操作安全描述符,你应该使用授权 API。使用 API 可以隐藏这些结构带来的复杂性。因此,要区别绝对安全描述符和自相关安全描述符应该调用 GetSecurityDescriptorControl(),然后再测试 SE_SELF_RELATIVE 标志。

    知道哪个 API 需要绝对安全描述符而哪个需要自相关安全描述符很重要。在此系列的第二部分[^],你将自己构建一个安全描述符。

    3. 访问控制列表(ACL)

    在 Windows NT 里,无论什么时候,当你要对一个对象执行操作(比如说读)时,要执行的操作会被编码为一个 32 位的整数(称为 ACCESS_MASK)。ACCESS_MASK 对于你试图创建的对象是特定的,如果你要读文件,那么 ACCESS_MASK 就应该是 FILE_GENERIC_READ。当你用请求 ACCESS_MASK 打开对象时,Windows 会取得你在线程令牌里的用户名并开始读取从安全描述符中取得的自由访问控制列表(Discretionary Aaccess Control List,DACL)。

    DACL 可以被想象为一张表,其中有用户的 SIDACCESS_MASK 以及访问类型。不过不要试图把它写成一个结构数组。如果你要分析 ACL 的话,可以使用低级 ACL 函数 GetAce()GetAclInformation() 以及其他的辅助函数。在 NT4 中,微软提供了 ACL 的一个示意,看起来就是由 SIDACCESS_MASK 和类型组成的一个表(即 EXPLICIT_ACCESS 结构)。

    /* Not valid C or C++ code */
    struct ACE
    {
        BYTE AceType;     /* can be allow/deny/audit/custom */
        BYTE AceFlags;    /* Inherited? */
        ...
        ACCESS_MASK Mask; /* Specifies the action */
        ...
        SID Sid;          /* associate with this user/group/... */
    } ;
    
    struct ACL
    {
        BYTE AclRevision;
        ...
        WORD AceCount;                  /* number of ACEs */
        ...
        ACE AceList[this->AceCount];    /* An array of ACEs */
    } ;
    
    /* You can think of an ACL as an array of EXPLICIT_ACCESSes */
    typedef struct _EXPLICIT_ACCESS
    {
        DWORD grfAccessPermissions;     /* ACCESS_MASK */
        ACCESS_MODE grfAccessMode;      /* Allow/deny/audit/custom/... */
        DWORD grfInheritance;           /* Inherited? */
        TRUSTEE Trustee;                /* The SID */
    } EXPLICIT_ACCESS, *PEXPLICIT_ACCESS;

    图 4:ACL 和 ACE 的概貌

    如果 DACL 是一个表的话,则其中的每一行就是一个访问控制项(Access Control Entry)。当要执行操作时,Windows 就遍历此 ACE 列表来寻找指向 就是线程令牌)的那一项。Windows 按照在 ACL 中的出现次序遍历 ACE。乍一看这与你的直觉、帮助文档甚至 MCP 的书中所述相悖("我认为 Windows 首先遍历所有的拒绝 ACE,然后才是允许 ACE。而现在,你竟然告诉我这是错的?")。实际上,我们都是对的。当 Windows 设置 DACL 时,它将访问控制项排序[^],拒绝 ACE 会优先于允许 ACE,从而访问控制模型也符合你的先前所学。

    如果对低级函数进行调用,你就可以绕过排序而使 ACE 以你喜欢的任意顺序出现。Cygwin 工具使用这一技术来创建不排序的 DACL。不过这些 DACL 不能遵从访问控制规则。你也可以使用这些不正常的 ACL 来创建文件。

    如果在 ACL 中没有找到(你的令牌),则打开对象的函数就会失败(访问被拒绝)。如果被找到了,Windows 会通过 ACE 来查看到底允许做什么。如果 ACE 允许打开此对象,则被允许访问。如果这中间有什么事情失败了,则会被拒绝访问。这是安全性最优方法的一个例子:"如果有什么错了,那么就安全地失败"。

    现在,你已经被允许或者拒绝访问了,Windows 开始检查另一个 ACL - 系统访问控制列表(System Access Control List)。SACL 和 DACL 的不同在于 DACL 包含允许/拒绝项,而 SACL 包含审核项。SACL 告诉 Windows 哪些动作要向安全事件日志中记录(审核成功/失败)。除此之外,你可以将 SACL 和 DACL 同等对待。如果 Windows 找到一个 SACL (译者注:更准确地说应该是 SACL 中的某一个 ACE)说要审核此访问,则此次的访问企图会被写到事件日志里。

    如果想知道一个 ACL 是否允许访问某个对象,可以对那个对象使用 AccessCheck() API。

    4. 创建一个好的自由访问控制列表

    在大多数情况下,Windows 已经为你确立了一个良好的自由访问控制列表。如果你遇到一个需要安全描述符或者 SECURITY_ATTRIBUTES 结构的 API,可以简单地为此参数传递 NULL。将 SECURITY_ATTRIBUTES 或者 SECURITY_DESCRIPTOR 传递为 NULL 会通知系统使用缺省的安全描述符。And that is probably what you were after.

    如果需要更高级的安全性,则要你要确保创建了一个拥有填充过的 DACL 的安全描述符。如果你初始化了一个安全描述符,却忘记了为之构建一个关联的 DACL,你会得到一个 NULL DACL。Windows 将此 NULL DACL 对待为其具有以下 ACE:

    "所有人:完全控制"("Everyone: Full control")

    所以,Windows 会允许使用任何操作访问该对象。这是微软打破自己的最优方法的一个地方。当遇到了非预期的东西时,Windows 应该安全地失败,而在这种情况下它却不是。利用 NULL DACL,包括恶意软件在内的任何人都可以对对象做任何事情,包括设置一个具有威胁性的 rootkit 式 DACL 在内。出于这一原因,所以,不要创建具有 NULL DACL 的安全描述符

    设置一个 NULL DACL 并不等同于使用一个 NULL 安全描述符。将 NULL 作为安全描述符传递时,Windows 将使用一个缺省的安全描述符来替换它,而此安全描述符是安全的,允许对对象进行恰当的访问。设置一个 NULL DACL 意味着传递一个合法的安全描述符,只不过它的 Dacl 成员为 NULL

    出于同样的理由,你也许不希望设置一个没有包含任何访问控制项的 DACL。对于这样的 DACL,Windows 在遍历访问控制项时,第一次尝试就会失败,因此,它会拒绝任何操作。其结果就是一个完全不可访问的对象,这样的对象不会比一个不存在的对象好到哪儿去。如果你还想要访问一个对象,那你就必须有一个填充过的 DACL。

    那么我们怎样才能构造一个自由访问控制列表呢?

    考虑一下你想要谁能访问而又不想让谁访问,你的 DACL 是基于黑名单(全部都是拒绝 ACE)呢,还是基于白名单(全部都是允许 ACE)。如果你正要为安全描述符创建一个 ACL,最好还是使用白名单的方式。对象要持续多长时间?究竟是一个长时间运行的对象(就像长时间运行的进程中的应用程序互斥量那样),还是一个短时间运行对象(比如一个同步事件对象),或者是一个永久对象(例如一个文件)?

    确定一个好的安全描述符取决于你计划对对象做些什么事情。如果你要保证一个内核对象的安全,你可能只需要同步、读以及读取其上的安全性。如果你要保证一个文件的安全,你可能会需要所有可用的访问模式(一整天)。

    一般来说,对于永久对象至少需要有两个账户能访问它。第一个是 LocalSystem 账户,对一个永久对象来说,限制此账户的访问会导致很严重的问题;另一个则是对象的创建者或者当前的所有者。还需要考虑赋予管理员对此对象的完全控制。其他需要考虑的技术是仅允许用户的读访问和执行访问。当要删除文件时,他们必须自己添加 DELETE 权限,然后再删除。

    对于短时间运行的对象来说,应该对对象的负责人赋予最少的权限。例如,如果你只希望从对象中读取并对之进行同步,那么就创建一个只允许读访问和同步访问的 DACL,在这种情况下你甚至可以对 LocalSystem 账户进行限制。

    如果你的对象支持继承,除非你的文件在安全性方面有特殊要求,那么对它来讲不需要特殊的 DACL,你可以只是对它应用其父的 DACL,你可以通过在安全描述符的 Control 成员中设定自动继承标志来做到这一点。缺省的安全描述符会代你使用继承标志。

    最后,如果仍然有疑问,去问管理员!

    5. Windows 2000 的继承模型

    从 Windows 2000 开始,ACL 可以被设置为从其父那里继承。这就是说,父的 ACL 会被应用到子的身上,例如"/Program Files/Common Files/Microsoft Shared"的访问许可将会和"/Program Files/Common Files"是一样的。ACE 中的一个特定标志会表明它是继承过来的。

    正如在前一节中提到的,Windows 遍历 ACE 列表直到末尾或者是找到了匹配的 ACE。如果开启了继承,当 Windows 到达列表的末尾时,它会开始遍历父文件夹的 ACL 来寻找匹配的 ACE。因此,对象会自动将其父的 ACL 应用到自身。这种情况仅当在 ACL 被设置为从其父对象那儿继承才会发生。

    如果文件夹也是继承的,Windows 将继续向上遍历。这一过程会持续到 Windows 遇到了一个禁用了继承的文件夹或者是驱动器的根。结果是得到一个由当前对象及其父对象合并而成的一个组合 ACL。来自于父的 ACE 称为 继承 ACE,来自文件自身的 ACE 称为 保护 ACE。

    为了支持 ACL 的继承,你必须把你的类设计为具有父子关系,就像文件/文件夹或者注册表键/值那样。父被看作是像文件夹那样的容器,而子被看作是像文件那样的对象。

    为了实现真正高级的 ACL 控制,Windows 2000 还支持仅将 ACE 应用于文件夹而不是文件(或者反过来)。控制继承的 ACE 标志同时也指出了要使用的继承类型。有四个标志:

    1. OBJECT_INHERIT_ACEOI):表示此 ACE 可以被子对象继承(例如文件)。
    2. CONTAINER_INHERIT_ACECI):表示此 ACE 可以被子容器继承(例如子文件夹)。
    3. INHERIT_ONLY_ACEIO):表示此 ACE 不作用于对象自己,而是作用于子(例如仅子文件/子文件夹)。
    4. NO_PROPAGATE_INHERIT_ACENP):不将此 ACE 应用于孙,仅作用于直接的子(例如应用于不在子文件夹里的文件)。

    这些标志可以并且经常组合使用。要使 ACE 作用于每个子对象,包括在子文件夹中的,可以指定 (OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE)

    关于 ACE 继承更完整的描述,参看 Keith Brown 的书籍。

    6. 访问令牌

    要描述的最后一个结构是访问令牌(Access token)。我并不计划深入钻研这一结构,否则的话有可能会跑题,因为它不仅关系到访问控制,还牵扯着特权、策略、组成员资格以及跨登录会话的 IPC。访问令牌是线程对象和进程对象的主要组成部分。在安全性上下文中,访问令牌标识着你是谁。Windows NT 为每个进程维护着用户信息,从而使得进程和线程可以以另外一个用户的身份运行。如果你想知道任务管理器是如何知道一个进程是以哪个用户身份运行的,其答案就是访问令牌。访问令牌是允许服务、以其他用户身份运行和快速用户切换等功能存在的关键。

    访问令牌可以是进程令牌、线程主令牌或者线程模拟令牌。除非你的线程在模拟他人身份,否则就不需要有令牌,而是使用进程的令牌。一旦你让线程进行身份模拟,就会有一个模拟令牌关联到你的线程上。通过调用 DuplicateTokenEx(),你可以把模拟令牌转换为一个用于 CreateProcessAsUser() 的主令牌。

    当你登录到 Windows 后,进程在运行时会把它们的令牌设置为你的用户名。如果你打开令牌并查看其内部,你就可以找到以其身份运行的用户的名字,完全不需要调用 GetUserName()


    图 5:访问令牌图解

     

    通过 GetTokenInformation() 可以从令牌中的到很多有用的信息。比方说:

    • TokenUser:进程以哪个用户身份运行
    • TokenGroupsandPrivileges:用户属于哪些组(也就是 TokenGroupsTokentRestrictedSidsTokenPrivilegesTokenUser
    • TokenGroups:用户所属组的 完整 列表(会比"net.exe user <user>"、WMI、用户管理控制台和"control userpasswords2"得到更多信息)
    • TokenPrivileges特权列表
    • TokenDefaultDaclTokenOwnerTokenDefaultGroup:缺省安全描述符定义
    • TokenType:是否是模拟令牌
    • TokenSource:访问令牌的来源
    • TokenRestrictedSids:受限 SID 列表

    我们出于访问控制的目的需要从访问令牌中获取的大部分信息都在 TokenGroupsandPrivileges 结构中。有了它,你就是把 GetUserName()NetUserGroups()CheckTokenMembership()LookupPrivilegeValue() API 集于一身了。令牌显示出,作为 administrators 组的成员也将使你成为以下组的成员:None 组、Authenticated Users 组、Users 组、Power Users 组和 LOCAL 组。这非常有用,因为现在你有了一个所属组的列表,而且还可以使用这一列表来搜索一个 ACL。要看一个 ACL 是否授予了你访问:

    1. 打开你的线程令牌
    2. 取得组列表
    3. 获取对象的 SECURITY_DESCRIPTOR
    4. 从安全描述符中得到 ACL
    5. 对 ACL 中的每个 ACE,都找到其相关的 SID
    6. 在第二步中你所创建的祖列表里查找这个 SID
    7. 如果找到了,看他是拒绝 ACE 还是允许 ACE
    8. 若是一个允许 ACE,将其 ACCESS_MASK 与你所希望的 ACCESS_MASK 进行比较
    9. 如果所有的访问方式都允许,那你被就允许访问
    10. 如果有错误发生,那你就被拒绝访问

    在以上列出的步骤里加上错误和参数的检查以及审核,那你就创建了自己的 AccessCheck() 函数。

    在前面已经接触过缺省安全描述符了。如果你遇到一个需要 SECURITY_ATTRIBUTES 参数的 API,通常可以将之传递为 NULL,也即意味着"缺省的安全描述符"。通过调用 GetTokenInformation(TokenDefault*),就可以找出缺省安全描述符究竟是什么。

    特权(privilege)是指一系列的策略,在允许你执行危及系统的操作(比如关闭系统或是安装驱动程序)之前,他们必须是启用了的。这些特权可以通过组策略(用户权限分配)来配置,并罗列到你的线程令牌中。特权在缺省状态下是被禁用了的(一个例外是 SeChangeNotifyPrivilege),因此你在使用之前首先要启用它。Platform SDK 提供了一个示例函数 SetPrivilege() 可以禁用或者启用你所需要的特权。我强烈建议你把这个函数添加到你的安全辅助函数库里,因为你会一再使用该函数,尤其是在进行访问控制的时候。启用一个特权对你而言只不过是两行代码的事:

    ...
    SetPrivilege(SePrivilegeName, TRUE); 
    
    /* ... Use privilege ... */
    
    SetPrivilege(SePrivilegeName, FALSE);
    ...

    图 6:使用 Platform SDK 的示例函数启用或者禁用特权

    我不计划深入到沙盒(sandboxing)(译者注:沙盒式在进行 Internet 开发时保证安全性的两个基本方法之一,另一个是使用数字签名。)或者模拟中去,因为他们都偏离了访问控制这一主题。如果你希望得到关于模拟和特权的更多内容,可以去看 WindowsSecurity 这篇文章,或者是 Paul Cooke 的书籍。

    7. 对安全描述符定义语言的一些解释

    安全描述符定义语言是使用文本来描绘安全描述符的一个尝试,使用的文本既可以让管理员明白也可以让计算机理解。在帮助文档中有 SDDL 格式的完整参考,而且,窃以为,那是唯一像样的参考。

    简单地说,SDDL 串包含以下部分:一个组,一个所有者,DACL 和 SACL。这些部分使用带有一个冒号的单字母标记分开,O: 用以区分出所有者, G: 区分组, D: 区分 DACL, S: 区分 SACL。紧随组以及分隔符的是表示用户和组的 SID。在 D:S: 分隔符之后是一串用括号括起来的独立的项,其中每一对括号都表示一个 ACE。

    每个括起来的 ACE 由分号分隔的六部分组成,分别表示 ACE 类型、继承标志、 ACCESS_MASK、GUID、继承 GUID,还有用户 SID。把列表中括起来的 ACE 加起来就得到了完整的 ACL。在 ACE 括号之前可以放其他一些安全描述符的控制标志。下面是我们即将剖析的一个示例 SDDL,清晰起见,我已经把不同的阶段分开了:

    O:AOG:DAS:D:(A;;RPWPCCDCLCSWRCWDWOGA;;;S-1-0-0)(A;;GA;;;SY)

    首先,使用分隔符把这个串分开:

     

    O: G: S: D:
    AO DA   (A;;RP WP CC DC LC SW RC WD WO GA;;;S-1-0-0) (A;;GA;;;SY)

     

    图 7a:SDDL 串被分为多个单独的串

    其次,把 SID 串和 ACE 串展开:

     

    所有者 SACL DACL
    Account Operators Domain Administrators   (A;;ADS_RIGHT_DS_READ_PROP | ADS_RIGHT_DS_WRITE_PROP | ADS_RIGHT_DS_CREATE_CHILD | ADS_RIGHT_DS_DELETE_CHILD | ADS_RIGHT_DS_LIST | ADS_RIGHT_DS_SELF | READ_CONTROL | WRITE_DAC | WRITE_OWNER | GENERIC_ALL;;; null SID)(A;;GENERIC_ALL;;; LocalSystem)

     

    图 7b: 展开了 SID 串和 ACE 串的 SDDL 串

    最后,把常量串展开:

     

    所有者 SACL DACL
    Account Operators Domain Administrators   Allow (null SID): 0x01e000bb
    Allow LocalSystem: 0x100000

     

    图 7c: SDDL 串中指定的安全描述符

    这就是 SDDL 串的详细含义。想要更多 SDDL 串的示例,可以看看 %windir%/security/templates/*.inf 这些文件。这是 Windows 安装程序用来为 Windows 应用缺省的安全描述符所使用的东西。看看你能不能把这些串表示的安全描述符搞明白。至于答案嘛,可以对安全描述符字符串调用 ConvertStringSecurityDescriptorToSecurityDescriptor() 函数。

    很抱歉对于 SDDL 串只有少的可怜的解释。就像我说过的,SDDL 的最佳参考在 SDK 文档里,现在我仍然持相同看法。

    8. 小结

    在这一部分里,你学习了 Windows NT 如何使用安全描述符来保证对象的安全。知道了 Windows 使用 SID 来识别用户、组以及计算机。你还了解到安全描述符最初来自于内核模式,因此它是一个复杂的怪物。还给你看了组成安全描述符的五个部分以及它们在内存中是怎么存储的。然后又看到了两种类型的访问控制列表。向你揭示了 ACL 的组织结构,Windows 如何读一个 ACL,以及在访问控制模型里继承是如何实现的。学到的最后一个结构是访问令牌,告诉你从令牌里可以读出什么信息,最后以开放一个许可结束。

    在第二部分里,你就要写一些代码对安全描述符进行读写了。还要通过从主令牌里获取信息来打造一个 WhoAmI 程序的复制品。在你期待下一篇文章到来之时,我希望你能选择一下你想要用以编程的技术。我将使用四种方法针对安全性进行编程:

    1. 低级方法。如果你需要对 NT3.5 编程而又没有 ATL,那除此之外你就再也没有别的选择了。这一方法要直接调用低级的 ACL 函数,而那些函数实在是太恐怖了!除了极其难于编写以外,这种方法又复杂又容易出错(Windows NT 有如此多的安全问题[^]实在不足为奇!)。除非你要支持后向兼容(兼容到何时呢?),否则只要可能,我就强烈建议你避开这一方法。如果你想事先了解一下,可以查看 SDK 文档里的 SetEntriesInAcl() [^]。
    2. Windows 2000 的方法。由于意识到了方法 1 是多么的难于应用,微软又造出了另外的一组 API 来用于创建安全描述符,即安全描述符定义语言(SDDL)。最初你会觉得 SDDL 可能不比低级的许可方式好多少,当然,仅是对复杂度而言,而非兼容性。但是,其文本形式使得 SDDL 对于程序员 管理员来说极其易读。如果你仔细看上一些 SDDL 及其相应的 ACL,你很快就能掌握它。Windows 2000 还引入了辅助 API 以自动完成一些重复工作,比如说用文本形式打印一个 SID。如果你计划先了解一下,可以查看 SDK 文档里的 ConvertStringSecurityDescriptorToSecurityDescriptor() [^]。
    3. ATL 方法。作为可信赖主动计算(Trustworthy Computing Initiative)的一部分,微软对 ATL 作了许多更新,将 ATL 中的安全性相关类推到了极致。如果你有 Visual C++ .NET,而又不介意使用 ATL C++ 编程,你会希望使用这一方法。想提前了解的话,可以从 Visual C++ 的帮助里查看 CSecurityDesc() [^ ]类。
    4. .NET 方法。从 .NET Framework 2.0 版本开始,你可以选择在托管环境中使用完全面向对象的方法来进行安全性编程。注意,在本系列的第二部分里我不会涵盖此内容。在 .NET 里的安全性编程将会有单独属于自己的一篇,也就是第三篇。如果你有 Visual Studio .NET 2005,你应该强烈考虑选择这一方法。可以通过 System.Security.AccessControl [^] 事先了解一下。

    历史

    历史和参考书目在第四部分[^]。

     

    原文地址:http://www.codeproject.com/win32/accessctrl1.asp

     

    展开全文
  • 对象使用时,下面描述错误

    千次阅读 2011-06-24 15:32:00
    对象使用时,下面描述错误是 A.通过“。”运算符调用成员变量和方法 B.通过成员变量访问权限设定限制自身这些变量方法调用 C.将一个对象申明为类成员时,必须在使用前为其分配内存 D.在方法中使用对象...
  • 具体说在编程语言里对象是一种比较特殊数据结构(类型),可以用来描述具体某种事物,在对象这种数据类型里,还可以存储其他复杂数据结构,简而言之,对象是若干属性集合,具有强大封装性,由此可见,...
  • 面向对象是现实世界的...对象具有状态和行为,一个对象用具体数据值来描述它的状态,用于改变对象状态的操作就是对象的行为。类:具有相同或相似性质的对象的抽象就是类,对象的抽象是类,类的具体化是对象,也可...
  • 如何描述事物(对象)

    2016-11-23 20:19:27
    * 我们能拿它来做什么(骑车上班)自行车这个事物的描述入上图括号内。可以总结为 1. 这个事物是什么 2. 这个事物有能做什么 3. 这个事物能够被用做什么描述事物可分为这三个角度描述,以及描述具体程度、描述熟悉...
  • STIX关系对象(SRO)表示用于描述CTI关系类型。 通用关系SRO用于描述许多不同类型关系,而特定Sighting SRO包含表示Sighting关系其他属性。   为下面定义每个SRO提供属性信息,关系信息和示例。 ...
  • UML静态信息的描述

    2013-02-20 10:40:22
    在uml建模中,可以用类图和对象图以及包图系统静态信息进行描述,它们可以统一称为静态视图。类图用于定义系统中类,包括描述内部结构和类之间关系,主要用于描述系统静态结构。而对象图是类图一个...
  • 以面向对象的思想,编写自定义类描述图书信息。设定属性包括:书名,作者,出版社名,价格;方法包括:信息介绍 三、要求: 1、设置属性的私有访问权限,通过公有的get,set方法实现属性的访问 2、限定介格...
  • [译]为驱动设备对象设置适当的安全描述符正确的安全描述符能够让你有效的控制其他人你的驱动设备对象的访问。通常,你可以调用:IoCreateDeviceSecure 来创建驱动设备对象并拥有正确的 DACL 权限。...
  • 1.介绍 ...下表列出了 Map 对象的属性和描述。 构造函数  指定创建映射的函数。 Prototype — 原型  为映射返回原型的引用。 size  返回映射中的元素数。 方法 下表列出了 Map 对象的方法...
  • corners:包含大量本地...descriptors:它是 keypoints 进一步处理结果。通常它具有更低维度,从而使得图像块能够在另一幅不同图像中被更快地识别 KeyPoints对象 为了描述关键点,Opencv 关键点类定...
  • JS获取对象键值中key值方法

    千次阅读 2020-08-14 16:48:17
    下面是MDN中Object.keys的描述 Object.keys()方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用for...in循环遍历该对象时返回的顺序一致 (两者的主要区别是 一个 for-in...
  • 结构与对象描述语言...

    千次阅读 2010-12-25 16:41:00
    目的是提供一个通用的描述语言用于提供数据给各种 code generator.当然xml可以做到同样的事,但xml那卧槽的语法让惯用惯用文本编辑器的我录入起来实在是火大.但中途还是走了歪路,约一个月前我开始希望它能成为一个...
  • 在实际的工作开发中,我们经常会遇到需要list集合中的某个对象的某个属性进行排序的操作,如果手工判断,步骤较为麻烦,所以在此处小编将会介绍集合中排序的方法。 普通的字符串集合的排序 排序方式以及排序的结果...
  • 1、什么是面向对象语言 面向对象语言(Object-Oriented Language)是一类以对象作为基本程序结构单位的程序设计语言,指用于描述的...以下是个人面向对象的理解: 什么是对象? 引用我的一位大学老师的说:一切...
  • 段错误之 memset 对象的误用

    千次阅读 2015-12-21 23:03:17
    1.问题描述实际项目中,定义一个如下基类和子类,均包含有虚函数。//基类 class OriginalTask { public: OriginalTask() {}; virtual ~OriginalTask() {}; virtual bool readFromFileInit(TiXmlElement* const ...
  • Python中的类的定义和对象的创建

    万次阅读 多人点赞 2018-08-16 17:35:59
    1.类 :一类事物的描述,是抽象的、概念上的定义。比如做石膏像的模型 2.对象:实际存在的该类事物的每个个体,因而也称实例(instance)。比如石膏像 二者的关系:对象是由类派生的、创建的。一个类可以创建无穷多...
  • 某公司要开发名为”我爱购物狂”的购物网站,请使用面向对象的思想设计描述商品信息 三、要求: 1、分析商品类别和商品详细信息的属性和方法,设计商品类别类和商品详细信息类 2、在商品详细信息类中通过属性...
  • -----------android培训、java培训、java学习型技术博客、期待与您交流! ------------  类和对象的定义  类:具有相同属性和行为的...例如: age的属性特定值是int类型,就是指对象的属性是通过常量和变量来描述
  • 分布式环境下具有对象类型的属性的对象的添加、删除及修改1. 问题描述要讨论问题首先要把问题说清楚才好讨论,下面是我们所要讨论的问题的描述。注意,我们这里不讨论对象传输时的marshal及unmarshal问题,总之,...
  • JavaScript面对对象#继承理解

    千次阅读 2013-06-08 13:00:28
    前期看到一篇高手写的文章,文章非常棒,读了好几遍。 记下自己JavaScript#OOP这块的感悟,其实重要的点就两个,一个是结构,一个是数据,如果... * 1、结构对象,负责描述具体数据对象的结构,类似Java中的类
  • 图像中的对象(圆)进行提取

    千次阅读 2019-12-23 20:25:38
    一.问题描述 图像中对象进行提取,获取所需要的对象,去掉其它干扰和非目标对象。 二.参考博客 https://blog.csdn.net/weixin_41695564/article/details/80099917 ...上面两个博客思路差不多,都是通过二值分割+...
  • FastJsonObject对象的解析问题

    千次阅读 2019-02-25 19:17:37
    问题描述 ActivityRuleBase 基础类,ActivityRuleUserVo,ActivityRulePayTypeVo 继承ActivityRuleBase 类 public class Activity implements Serializable { private Long id; // private String name; //活动...
  • DOM对象和js对象以及jQuery对象的区别

    千次阅读 2018-08-31 09:53:25
    DOM对象和js对象以及jQuery对象的区别 一、DOM对象 文档对象模型简称DOM,是W3C组织推荐的处理可扩展置标语言的标准编程接口。 DOM实际上是以面向对象方式描述的文档模型。DOM定义了表示和修改文档所需的对象、...
  • 映射两表之间关系通过两个和两个元素来完成,用VO来描述两表之间关系在IBatis框架中,其实仍然是通过SQL来完成。怎样用SQL来表达“一多”和“多一”关系呢?可以利用主表主键作为从表外键从表查询...
  • 面向对象编程认识2001

    千次阅读 2006-12-25 14:10:00
     面向对象方法都支持三种基本的活动:识别对象和类,描述对象和类之间的关 系,以及通过描述每个类的功能定义对象的行为。2. 面向对象编程(OOP)中最重要的概念是类(Class),指的是数据类型,而对象(Object)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,118
精华内容 12,047
关键字:

对对象的描述