IBM FileNet P8 是一个产品系列,有若干个组件组成。主要组件有 ContentEngine,简称 CE,主要用于数据的储存和管理; ApplicationEngine,简称 AE,是给终端客户使用的,用于展示存储在 CE 里面的数据;ProcessEngine,简称 PE,主要用户业务流程的管理。FileNet P8 有不同的版本,主要版本有 3.5,4.0,4.5 和在 2010 年 11 月份发本的最新版本 5.0。

CE5.0 FileNet P8 的安全体CE5.0 FileNet P8 的安全体系

FileNet P8 是一个典型的企业级应用服务器,其本身不存储用户认证信息,所有的用户及密码等认证信息是存贮在第三方的 LDAP 服务器中,FileNet P8 ContentEngine 支持的 LDAP 有 IBM Tivoli,Microsoft Active Directory,Microsoft ADAM,Novell eDirectory,Oracle Internet Directory 和 SunJava Directory。FileNet P8 通过中间件服务器来做认证,然后 FileNet P8 自己来管理授权。

FileNet P8 认证机制

FileNetP8 的三大组件 CE,AE 和 PE,它们的认证机制有所不同。AE 是 CE 和 PE 的一个 Client 端,所以 AE 和 CE 认证方式类似,而 PE 的认证要依赖于 CE,PE 的认证时通过 CE 来完成。

 

CE 支持两种 transport,WSI (Webservice) 和 EJB (CORBA-RMI)。由于使用的协议不同,所以其认证也对应两种不同的方式,WS-Security 和 JAAS。

如图 1,CE 分别提供了 Webservice listener 和 EJB Listener 来处理来自不同协议的请求,对于 WSI 方式使用通用的 soap 协议,所以适用于各种平台。而对于 EJB 方式,各 application server 厂商分别有自己不同的实现协议,Websphere 通过 IIOP 实现,WebLogic 通过 T3 实现,而 JBoss 通过 JNP 实现。下面我们详细讨论 WS-Security 和 JAAS 认证方式。

图 1. CE 的架构

(1)JAAS 形式认证

JAAS 即 Java Authentication and Authorization Service 是标准的 java 认证授权服务,FileNet P8 只是用到了其中的认证框架。这样需要定制的就是认证模块部分。FileNet P8 目前支持主流的 3 种中间件服务器,WebSphere,Weblogic 和 JBoss。除了 P8 本身实现了一种默认的认证模块,针对三种服务器使用了其自身的认证模块,以 WebSphere 为例用到了其认证模块是:com.ibm.ws.security.common.auth.module.WSLoginModuleImpl ,图 2 说明了 JAAS 的一个完整的认证流程。除了 JAAS LoginModule 有不同实现外,其他过程都是由 JAAS 框架来实现的,由此看来 P8 本身并没有针对认证做复杂的实现,唯一需要做的就是如何维护认证通过的令牌。

图 2. JAAS 的认证流程

(2)WS-Security 认证形式

WSI 是 CE 提供给外部的另一种 WebService 接口,能够实现系统的异构集成。WSI 本身不会进行认证,其认证实质也是通过前面的 JAAS 来完成的,如图 3。当用户通过 WSI 请求 CE 的时候,WebService 首先将认证需要的信息发送的 CE 的 WebService 的监听,WebService 监听器再将认证信息传导至 JAAS,从而完成了认证。所以 CE 本质上还是用的 JAAS 来实现认证的。

图 3. WS-Security 认证流程

PE 的认证

PE 是 FileNet P8 的另一个核心流程引擎,早在 4.0 之前,PE 是独立的服务,所以其认证也是独立完成的,但是 4.0 之后,其认证功能由 CE 来完成了,因此 PE 是依赖于 CE 的。

正如 WebService 的认证过程一样,PE 的认证逻辑本质上也是由 CE 来完成的,只是将认证的信息传递给 CE,如图 4。

图 4. PE 认证流程

  • 客户应用调用 PE API
  • PE 的 API 然后调用通过 CE 的 API
  • CE 的 API 走 RMI-IIOP 协议调用 EJB 完成 JAAS 认证过程

综上所述,可以看到整个 FileNet P8 系统最终都是通过 JAAS 认证框架来实现认证的。

回页首

FileNet P8 授权机制

FileNet P8 在安装配置过程中需要两次配置 LDAP 信息,一次为认证做配置,一次为授权做配置,认证和授权的配置是分开来做的。根据客户的实际需求,FileNet P8 把认证和授权分开,在 LDAP 里面,有用户和组的概念,FileNet P8 可以给特定的组授权,所以在授权的那个 LDAP 里面,要维护大量的组的信息,这些信息由公司的具体部门来维护;而认证的时候,不需要维护组的信息,只要确保用户的合法性就好,这些用户信息一般由公司人事部门来维护。

在 CE 里面,所有的 Object 的权限都是通过 Access Control List( 即 ACL) 来控制的,一个 ACL 由如干个 Access Control Entry ( 即 ACE) 组成,一个 ACE 决定了一个用户或者组对这个 Object 有什么样的权限,所以 ACL 就决定了哪些用户或者组对这个 Object 有哪些权限。

当一个用户尝试对一个 Object 执行一个操作的时候,那验证权限的流程又是怎么样的呢?

  • 用户通过认证后,会返回一个 JAAS Subject。
  • CE 根据这个 JAAS Subject 到授权的 LDAP Server 里面查询这个用户的信息,然后返回 user access token,token 里面包含用户信息和用户所在组的信息,为什么要返回用户所在组的信息呢?因为在 CE 里面,我们可以给组赋予一定的权限,而组的管理是由 LDAP Server 来做的,这样通过修改组的信息来控制 CE Object 的权限,增加权限管理的灵活性。
  • 根据 user access token 来检查 Object 的 ACL,看看用户是否有执行具体操作的权限。

图 5. 权限验证流程

下面我们讨论对 CE Object 设置权限的五种方法,以及各种方法的应用场景。在讨论之前,先说明一下 CE 权限设置里面的两个特别账号 #AUTHENTICATED-USERS 和 #CREATOR-OWNER。#AUTHENTICATED-USERS 是一个组,所有通过认证的用户都是属于这个组,也就是说 #AUTHENTICATED-USERS 相当于 Windows 里面 Everyone 的意思;#CREATOR-OWNER 是 ACE 里面的一个占位符,比如说在 Class 中的 Default instance security 里面设置 #CREATOR-OWNER 有 Full Control,用户 UserA 登陆后用这个 Class 创建了一个文档,那么 #CREATOR-OWNER 就被替换为用户 UserA,对这个文档有 Full Control,如果是用户 UserB 创建的话,#CREATOR-OWNER 就被替换为用户 UserB,对这个文档有 Full Control。

Default instance security

在 CE 里面,有 Class 和 Instance 的概念,Class 类似模板的概念,而 Instance 就是根据这个模板创建的实例。如果要创建一个 Object,比如 document,folder 或者 custom object,必须先选择一个 Class,利用 Class 这个模板来创建具体的 instance。

Class 有一个“Default Instance Security”属性,在里面可以设置 ACL。这样,用这个 Class 创建的 instance 的默认权限就是“Default Instance Security”里面的 ACL。

比如说在 Document Class,我们设置 Default Instance Security 如下图 6,有四个 ACE,其中包括两个特别账号 #AUTHENTICATED-USERS 和 #CREATOR-OWNER。#AUTHENTICATED-USERS 有 View Content 的权限,我们在这边解释一下权限的两个概念 Level 和 Rights。一个 Object 对应不同的操作权限,比如 Delete 权限,Modify all properties 权限,Read permission 权限等等,若干个权限的集合就组成一个 Level,比如 Full Control,Publish,View content 等等。

图 6. Document Class 的 Default Instance Security

我们用上面的 Document Class 创建一个具体的 instance Doc1,它的权限如下图 7,因为这个文档是用户 Tester 创建的,在“Default Instance Security”里面的 #CREATOR-OWNER 被替换为具体的用户 Tester。

图 7. Doc1 的 Security

在哪些境况下我们可以应用 Default instance security 呢?在企业里面,不同部门都有自己的文档,这些文档本部门的人可以查看修改,其他某些部门有查看的权限。比如说公司 HR 部门的文档只有创建这个文档的人,本部门的人有 FullControl 的权限,而财务部门对这些文档只有查看的权限,其他部门的人没有任何权限。在这里,我们用 Group1000 代表 HR 部门,Group2000 代表财务部门,我们可以设置 HR Class 的 Default Instance Security 如下图 8。

图 8. Group1000 的 Default Instance Security

用上面 Group1000 Class 创建的文档,只有创建文档的人,HR 部门的人对这个文档有 Full Control,财务部门的人有查看的权限,其他部门的人没有任何权限,在这里,我们记得要删除掉 #AUTHENTICATED-USERS,默认 #AUTHENTICATED-USERS 有查看的权限,因为这个组相当于 Everyone 的意思,如果不把这个组从 Default Instance Security 删除的话,企业所有部门的人对用这个 Class 创建的文档就都有查看的权限。

Security parent and inheritance

Object 的权限可以从 Parent Object 那边继承,继承的权限有两类:一是 Child class 继承 Parent Class 的权限,这个主要用于 Class 的创建和管理;二是 Document,customer object 和 sub Folder 可以从 Folder 那继承权限。下面我们分别介绍这两类权限继承的详细用法。

首先我们看 Class 之间的权限继承。比如我们有两个 Class,Parent 和 Child,除了管理员 CEAdmin 和 CEAdminGroup 权限完,我们还给 Tester 和 Group1000 赋予了相应的权限,如下图 9,因为 Child class 是 Parent Class 的 sub class,我们希望 Child class 的权限和 Parent class 一样,为了达到这个目的,我们把 Parent class 的 Security 设置如下,注意 Tester 和 Group1000 的“Apply To”的值为“This object and all children”,这样,它所有的子类都将继承这个 ACE。

图 9. Parent class 的 Security

图 10. Child class 的 Security

我们在 Parent Class 上面创建一个子类 Child Class,查看 Security 属性,如上图 10,其权限是和 Parent Class 一样的。注意 Group1000 和 Tester 的图标,有 一个向下的绿箭头,表示两个 ACE 是从父类继承过来的。

接下来我们看看 Document,customer object 和 sub Folder 如何从 Folder 继承权限。之前接触过这样的客户场景,客户有不同的工程项目,客户为每个项目创建一个 Folder,然后把关于这个项目的所有文档都放在这个 Folder 里面。对于一个项目来说,有不同的项目阶段,如项目调研,项目实施和项目维护等阶段,不同的阶段对于这些文档有不同的权限,例如在项目调研阶段,项目参与人员有修改,删除文档的权限,等项目完成后,对这些文档就只能有查看的权限,不能删除和修改。这样的业务场景,我们可以用从 Folder 继承权限来完成,具体做法如下:

  • 创建 Project class,设置这个 Class 的“Default Instance Security”如下图 11,默认情况下,用这个 Class 创建的文档只有创建者和 CEAdminGroup 有 Full Control 的权限。
  • 创建 Folder BeijingProject,修改它的“Security”如下图 12,CEAdmin 和 Group1000 对这个文件夹有 FullControl 权限。注意 Group1000 的“Apply To”的值为“This object and all children”,这样,子文件夹或者存放在里面的 Document 和 Custom object 就可以继承这个 ACE。
  • 在 Folder BeijingProject 里面创建两个文档,bj_doc1 和 bj_doc2,如下图 13。注意创建文档的时候,我们需要把“Inherit Security from folder”勾上,这样文档就会从 Folder 继承“This object and all children”的权限。bj_doc1 和 bj_doc2 的文档权限如下图 14,请注意 Group1000 有一个向下的绿箭头,表示这个 ACE 是从 Folder 继承过来的。
  • 然后根据项目需求,我们可以修改 Folder BeijingProject 的权限,当 BeijingProject 文件夹权限被修改后,它下面所有的文档从文件夹继承的权限会相应自动的被修改。也就是说,我们可以根据修改 BeijingProject 文件夹的权限,动态控制它下面所有文档的权限。

图 11. Project class 的 Default Instance Security

图 12. Project class 的 Default Instance Security

图 13. bj_doc2 的 General

图 14. bj_doc2 的 Security

Security policies and security templates

在讨论 security template 和 security policy 之前,我们先了解一下文档的 version,CE 可以对文档进行版本控制,对于一个文档,有四个 versioning state,即 Released,Superseded,In Process 和 Reservation。当新创建一个文档,并且保存为 Major release,文档的版本为 1.0,状态为 Released;执行 Check out 操作,这时候版本为 1.1,状态为 Reservation;执行 Check in 操作,并且保存为 Minor version,版本为 1.1,状态为 In Process;重新执行 Check out,版本为 1.2,状态为 Reservation;重新执行 Check in 操作,并且保存为 Major version,版本为 2.0,状态为 Released,之前的版本 1.0 和 1.1 的状态变成 Superseded。也就是说当 Check in 并且保存为 Major version 的时候,版本状态为 Released,之前的版本状态就变成 Superseded;Check in 并且保存为 Minor version 的时候,版本状态为 In Process,表示文档还在编辑中;Check out 的时候,会增加一个新的版本,并且状态为 Reservation。文档有四个不同的版本阶段,用 Security policy 和 Security template,可以对各个阶段进行不同的权限控制。Security template 表示一个权限模板,在 security template 里面,我们定义一个 ACL,Security template 归属于一个 Security policy,在 Security policy 里面我们可以定义如干个 Security template。

比如当文档被 Check out 出来以后,我们希望 Group1000 对这个文档有 Full Control 权限,我们按如下的步骤实现这个功能。

  • 创建一个 Security Policy policyTest 并且设置 Reservation Security template 如下图 15。
  • 创建一个文档 testDoc,并且选择刚刚创建的 policyTest 作为位它的 Security Policy,如下图 16。
  • Check out testDoc,然后查看文档的 Security,如图 17。请注意 Group1000 有一个向下的绿箭头,表示这个 ACE 是从 Security template 过来的。

图 15. Reservation Security Template 的 ACL

图 16. 文档 testDoc 的 Security Policy

图 17. 文档 testDoc 的 Security

Directly applied security

上面介绍的 Default instance security,Security parent and inheritance 和 Security policy and security template 权限设置方法都是针对批量文档进行处理的,在企业里面,针对某些重要的文档,我们可以对具体某一个文档设置我们需要的权限。例如图 18,只有 CEAdmin 对文档 planDoc1 有 Full Control 权限,因为业务需要,需要让 Group1000 这个组里面的用户对这个文档有 View content 的权限,我们可以点击 Add 按钮,然后增加 Group1000,设置权限为 View content,如下图 19。Directly applied security 可以直接文档权限进行个性化设置,缺点是只能一个一个文档修改权限,不能批量化设置。

图 18. 修改前 planDoc1 的 Security

图 19. 修改后 planDoc1 的 Security

Markings

通过上面介绍的四种方法,可以批量或者个性化的对文档进行权限设置。下面介绍的 Markings 权限设置方法不同于上面介绍的 Default instance security,Security parent and inheritance,Security policy and security template 和 Directly applied security。Marking 的权限控制是基于一个属性,文档的权限根据这个属性值的变化而变化。

Marking 归属于一个 Marking Set,一个 Marking Set 包含若干个 Marking,有多少个 Marking,就表示和这个 Marking Set 关联的属性可能的值有多少种。对于一个 Marking,有两个重要的属性,Security 和 Constraint Mask。Security 记录着这个 Marking 的 ACL,即哪些用户或者组对这个 Marking 有哪些操作权限;Constraint Mask 记录着针对一个 ACE,哪些操作权限被限制了。在这里,被限制的意思是说,除了 Marking 里面的 ACL 指定的用户之外,其他用户都没有 Constraint Mask 的操作权限。

当把文档的属性值设置为一个 Marking 之后,文档的权限由文档的 Security 和 Marking 的 Constraint Mask 联合控制,联合控制的规则有下面两种:

(1)被选中的 Constraint Mask 的操作

文档被选中的 Constraint Mask 的操作权限,有 Marking 和文档的 Security 联合控制,只有即在 Marking 中 Security 的用户又在文档 Security 中的用户并且有被选中的 Constraint Mask 的操作权限的用户才最终有执行被选中的 Constraint Mask 的操作权限。

(2)未被选中的 Constraint Mask 的操作

未被选中的 Constraint Mask 的操作不受 Marking 的限制,文档未被选中的 Constraint Mask 的操作权限由文档 Security 控制。

下面我们举例说明 Marking 的用法以及它是如何影响权限的。

  • 创建一个 Marking set :markingTest,增加两个 marking:marking markingValue1 和 markingValue2 两个值。
  • 设置 markingValue1 的 Security,如下图 20,用户 suser 对这个 marking 有 Adding Marking,Remove Marking 和 Use Marked Objects 的权限。Adding Marking 表示用户 suser 可以把和这个 markingTest 关联的属性值设置为 markingValue1;Remove Marking 表示用户 suser 可以把属性值从 markingValue1 改成其它值;Use Marked Objects 表示用户 suser 可以用 Constraint Mask 属性设置。Constraint Mask 属性表示哪些操作权限被限制了,如下图 21,其中 Delete 这个操作被限制了。在这里,被限制意思是说,除了 markingValue1 里面 ACL 定义的用户之外 ( 在我们这个例子里,为了简便起见,只定义了用户 suser),其它用户都没有 Delete 操作的权限。
  • 增加一个属性 propTest,并把这个属性和 markingTest 关联起来。
  • 增加一个 Class classTest,并把属性 propTest 加到 classTest 里面。
  • 用 classTest 创建一个文档 docTest。
  • 修改 docTest 的 Securty 如下图 22。只有用户 suer 和 CEAdmin 对 testDoc 有 Full Control 权限。
  • 修改 docTest 的 propTest 的属性值为 markingValue1。修改前的值为空,文档 docTest 的权限由 Security 中的 ACL 控制,即用户 suser 和 CEAdmin 对 testDoc 有 Full Control 权限;把属性 propTest 的值设置为 markingValue1 后,文档 docTest 的权限由 Security 中的 ACL 和 markingValue1 的 Constraint Mask 联合控制,按照我们上面介绍的联合控制的规则:对于 Delete 这个 Constraint Mask 操作,查看 markingValue1 中的 secuirty,只有 suer,而 suer 也定义在文档的 Security 中,并且有执行 Delete 的权限,所以 suer 有执行文档 Delete 的权限,然后我们看用户 CEAdmin,在文档的 Security,CEAdmin 有 Delete 的权限,但是 CEAdmin 没有定义在 markingValue1 中,所以 CEAdmin 没有 Delete 的权限;对于没有被选中的 Constraint Mask 操作,例如 View content 操作权限,这个权限完全由文档的 Security 控制,由于在文档的 Security 中,suser 和 CEAdmin 都有 View content 的操作权限,所以 suer 和 CEAdmin 就有对文档的 View content 的操作权限。

图 20. Marking markingValue1 的 Security

图 21. Marking markingValue1 的 Constraint Mask

图 22. docTest 的 Security

图 23. 设置 docTest 的属性 propTest 值为 markingValue1

权限类别

权限有两种不同的类别,即 Allow 和 Deny。Allow 表示用户对 Object 有相应的操作权限;Deny 表示用户对 Object 没有相应的操作权限。如下图 24,用户 Tester 有 Full control,类型是 Deny,表示用户对文档没有任何权限;组 Group1000 有 Full control 权限,类型是 Allow,表示组 Group1000 对文档有所有执行权限。

对于 Deny,Deny 优先于 Allow,比如上面的例子,如果 Tester 用户属于 Group1000 组,Group1000 的类型是 Allow,用户 Tester 属于这个组,Tester 就有 Group1000 的权限,但是又定义了 Tester 的类型为 Deny,而 Deny 优先于 Allow,所以 Tester 对文档没有任何权限。

对于 Allow,Allow 的权限是累加的,比如给用户 UserA 赋予 Delete 权限,然后又给用户 UserA 赋予 View content 权限,那累加后结果是用户 UserA 既有 Delete 权限又有 View content 权限。

通过上面的介绍,权限可以通过 Default instance security 和 Directly applied security 方法设置,通过这两种方法设置的权限属于 Direct/Default 权限;通过 Security policy and security template 设置的权限属于 Template 权限;通过 Security parent and inheritance 设置的权限属于 Inherited 权限。它们之间 Deny 和 Allow 的判断顺序如下图 25。

图 24. testDoc 的 Security

图 25. Deny 和 Allow 的判断顺序

回页首

结束语

本文首先介绍了 FileNet P8 的认证方式和流程,然后介绍了授权的流程和设置权限的各种不同方法以及对应的应用场景,接着介绍了权限的类别以及判断顺序。通过本文的介绍和演示截图,读者可以根据自身的业务场景完成 FileNet P8 的权限设置。

IBM FileNet P8 的权限管理相关推荐

  1. 使用 Web Services 整合 IBM FileNet P8 BPM 与 IBM WebSphere ILOG JRules

    Ranjeeth Pasupathi, 软件工程师, IBM Ranjeeth 是 IBM India Software Labs 的一位软件开发人员.他专注于新技术.敏捷 BPM 和关系数据管理等方 ...

  2. 中海油基于IBM FileNet P8构筑海外业务管理系统

    积极进行海外业务拓展的中国海洋石油有限公司,急需通过信息管理平台的建设,应对海外业务信息繁杂.工作多样化的挑战,同时满足SOX 404法案的要求. 为什么选择IBM? IBM的内容管理解决方案具有前瞻 ...

  3. 多 LDAP 目录服务器的 FileNet P8 系统介绍和配置实例

    摘抄笔记:http://www.ibm.com/developerworks/cn/data/library/techarticle/dm-1312multipldap/ 多 LDAP 目录服务器的 ...

  4. Filenet P8阶段性总结

    FileNet P8产品的架构很清晰,它包括三大核心组件CE.PE和AE.之所以核心,从<了解ECM与FileNet P8>可以看出filenet p8的四大套件中有三个是基于这三大核心组 ...

  5. 杉岩数据对象存储替换IBM FileNet,突破性能瓶颈

    近年来随着非结构化数据的爆发性增长,由于IBM FileNet系统架构问题出现了明显性能瓶颈,杉岩海量对象存储系统(SandStone MOS)采用全分布式架构,针对海量文件场景提供可线性扩展的持续快 ...

  6. 什么是集中权限管理?为什么要集中权限管理?

    基于Spring+SpringMVC+Mybatis分布式敏捷开发系统架构,一般都会提供整套的公共微服务模块,在系统开发中会基于统一通用的UPMS系统来进行权限的集中管理. 那么为什么需要做通用的集中 ...

  7. Spring 整合 Apache Shiro 实现各等级的权限管理

    Spring 整合 Apache Shiro 实现各等级的权限管理 2015-10-25 JAVA, SECURITY, SHIRO, SPRING Background 前几个月在做一个常规的权限隔 ...

  8. cognos java用户权限_Cognos 权限管理之第三方目录管理员器、报表服务器权限管理、FrameWork权限管理等详细配置 【39页深度好文图文并茂带你全面了解Cognos权限管理】...

    一.引言 1.1. 编写目的 本文档是结合以往的开发经验,从实际报表开发出发,详细介绍了ReportNet报表设计流程.开发技巧,报表性能调优.FM建模规范及技巧讲解.总结的文档希望对大家在日后的开发 ...

  9. 合肥工业大学—SQL Server数据库实验十:用户及其权限管理

    用户及其权限管理 1. 创建登录名Mylog及密码 2. 创建用户user2关联登录名 3. 创建角色role1 4. 对用户user2及角色role1授权 5. 验证用户授权 6. 收回用户权限 1 ...

最新文章

  1. [Config]如何利用ConfigurationSettings.AppSettings.GetValues读取配置文件中多个同Key的value...
  2. 你有没有想过你的上级为什么让你干这件事情,他想干什么
  3. “sockaddr_in”:“struct”类型重定义
  4. 【从蛋壳到满天飞】JS 数据结构解析和算法实现-哈希表
  5. Jquery 日期差函数 修改 对火狐进行兼容
  6. 财付通接口(asp)
  7. 用PHP写一个最简单的解释器Part1
  8. 设计师中国风作品必备汉字毛笔字偏旁部首大集合
  9. python websocket django vue_Django资料 Vue实现网页前端实时反馈输出信息
  10. python零基础好学吗-Python零基础好学吗?零基础如何学习Python?
  11. 代码管理学:通过配置文件限制依赖关系
  12. c语言程序设计大一考题,C语言程序设计期末考试试题(含答案)
  13. 实验——示波器法测量相位差(试验记录)
  14. 基于51单片机的智能温控风扇(程序+仿真+原理图)
  15. 电脑启动显示“A disk read error occurred”的解决方法
  16. 011 dilate(膨胀)、erode(腐蚀)
  17. 大学生html5实训心得体会,实训心得体会600字(精选5篇)
  18. http隧道、https、SSL层、http代理、在线代理、socks代理区别
  19. 086 定积分应用元素法求面积
  20. Java学习打卡第七天——[再谈Collection之Set,TreeSet,泛型Generic的简介和使用]

热门文章

  1. ToB 产品拆解—Temu 商家管理后台
  2. Lisp语言:列表(List)
  3. 在父域的基础上,添加子域
  4. ADDS:启用 Advanced Offline Files
  5. 自动化测试简历编写应该注意哪方面?有哪些技巧?
  6. linux环境下抓包
  7. MT6763芯片datasheetMT6763芯片规格书MT6763芯片数据手册资料
  8. 简便式操作:使用虚拟机VMware15安装win10镜像系统
  9. flash cs4安装闪一下红的界面
  10. andriod 打造炫酷的电影票在线选座控件,1比1还原淘宝电影在线选座功能