用于高速缓存万维网内容的方法、系统和计算机程序产品的制作方法

文档序号:7620142阅读:189来源:国知局
专利名称:用于高速缓存万维网内容的方法、系统和计算机程序产品的制作方法
技术领域
本发明涉及用于高速缓存万维网内容的方法、系统和计算机程序产品,特别涉及为动态门户页面产生高速缓存信息,并且在现存的高速缓存代理基础结构中产生它们的高速缓存。
背景技术
使用万维网的高速缓存已经有很长时间了。在下层的HTTP协议中定义了基本的标准,其允许万维网页面的高速缓存。这些协议主要侧重于静态页面所需的高速缓存。如果假设全是动态页面,则总是将它们作为由一个URL单独请求的不可分离的完整的页面。
门户服务器应用程序(之后称为门户)已经引入了万维网页面内容的灵活性的新的方面。门户页面(见图1)包括多个部分,它们具有不同的状态并且具有针对它们各自内容的不同高速缓存需求。Portlet是在门户中运行的应用程序。这些应用程序的UI包括由门户提供的门户页面的子部分。基于它们内部的状态,这些Portlet根据请求动态地产生它们的标记(markup)片段。由布局应用程序(主题/皮肤)产生门户的外观和感觉。布局应用程序是动态应用程序,其可以根据它们的状态来控制外观和感觉。迄今对完整提供的门户页面还没有进行高速缓存。仅仅可以高速缓存所产生的页面的非常小的子集,因为已知不随时间而改变它们的内容。
门户页面是高度动态的。由多个动态应用程序组件的等级结构和如在可以随时间改变的页面上的Portlet的组合的状态、在页面上的Portlet的状态、可以随时间改变的这些Portlet的内容、以及依照当前配置和当前状态的最可能导航元素,来产生它们页面的内容。
Portlet是有状态的应用程序而且根据每个请求提供它们的标记。不仅标记自身是动态的,而且所提供的标记的寿命也是在Portlet的执行时动态地计算的。标记片段的所期望寿命依赖于Portlet的当前状态。
门户页面的高度动态特性使得它们不可以高速缓存。
作为缓解措施,依照每个独立的片段的失效时间,今天的一些门户产品支持单个页面片段的高速缓存。对进来的请求,将这些片段汇集从而制成完整的门户页面。由门户自己来进行这个工作,所以对门户页面的每个请求都需要通过网络的全部路线到达起始服务器。
今天还没有技术能够利用高速缓存机制来允许高度动态的门户页面的高速缓存。
本发明的目的是提供方法、系统和计算机程序产品,其能够在不改变现存的高速缓存基础结构或将使用的传输协议的情况下,允许动态门户页面的高速缓存。

发明内容
本发明提供一种方法、系统和计算机程序产品,其能够在不改变现存的高速缓存代理基础结构或将使用的传输协议的情况下,通过提供高级的高速缓存组件,允许动态门户页面的高速缓存。
该高级的高速缓存组件提供功能,其中提供额外的动态页面特定高速缓存信息作为包括门户页面的响应的部分。
在门户中每个组件都额外地提供动态组件特定高速缓存信息,该门户动态地把将被汇集的页面片段提供给门户页面,该动态组件特定高速缓存信息包括组件特定高速缓存范围值和组件特定高速缓存失效值。使用所有的这些单一组件特定高速缓存范围和高速缓存失效值,来计算动态页面特定高速缓存信息,结果是产生将被汇集的门户页面的公共最小高速缓存范围和公共最小高速缓存失效值。该动态页面特定高速缓存信息确保正确地选择从组件提供来的最小高速缓存范围和不超过任何组件特定高速缓存失效值的最小高速缓存失效。提供动态页面特定高速缓存信息,作为包括门户页面的响应的头部的部分。然后高速缓存评估没有变动的动态页面特定高速缓存信息。


在下面的详细文字说明中本发明的上面及其他的目的、特点和优点将变得非常明显。
在所附权利要求中阐明了本发明的新颖特点。当结合附图阅读时,参照下面说明性实施例的详细描述,可以最好地理解本发明自身、其优选使用模式、进一步的目的及其优点,其中图1示出了典型的门户页面;图2示出了将被本发明使用的现有技术的代理高速缓存基础结构在不改变时的情况;图3A示出了在现存的门户中本发明的高级高速缓存组件的基本实现;图3B示出了本发明的高速缓存机制,用于为门户页面计算高速缓存范围和高速缓存失效;图3C示出了根据本发明的高速缓存信息的静态配置;和图4示出了计算总高速缓存信息所需的数据的概观图。
具体实施例方式
参照图2,其示出了本发明使用的现有技术的“代理高速缓存基础结构”在不改变时的情况。
当说到高速缓存时,HTTP1.1规范(RFC 2616)使用术语“共享高速缓存”和“非共享高速缓存”。在那个专利申请中将两种类型的高速缓存都称为高速缓存。它们位于请求起始进程之外,在大多数情况下完全位于起始服务器机器之外。起始服务器可以使用HTTP协议(使用头部变量),来将当前交付的信息(如网页、门户页面或图像)的所期望寿命传送到其他组件,这些组件参加这个通讯流。由高速缓存来评估作为HPPT响应头部而提供的元数据,从而允许起始服务器在时间间隔进行控制,在该时间间隔中高速缓存将假设所接收的内容还是有效的。
HTTP规范提供了关于协议使用的细节以便允许起始服务器将所交付的内容的有效性发送给高速缓存。高速缓存评估这个信息,并且相应地对相同的来源的随后请求的进程的处理进行操作。HTTP协议没有为起始服务器提供方法,以通过HTTP请求和响应来主动地使特定条目无效。唯一的无效机制是失效超时,并且其可以是管理行为。
HTTP头部相关HTTP 1.1头部是(该头部对于页面请求的内容高速缓存特别关注)对于高速缓存范围cache-controlpublic,cache-controlprivate,
cache-controlno-cache对于高速缓存失效cache-controlmax-age delta-seconds对于客户范围(变化头部)user-agentaccept-languageother-configuration-header-fields在这里列出的这些HTTP头部是为了使读者容易地在HTTP1.1规范中查找关于这些特性的更多信息。
指示响应可以用任何高速缓存进行高速缓存,即使其通常是不可高速缓存的或仅仅在非共享高速缓存内是可高速缓存的,也如此。
指示所有或部分响应消息是针对单一用户的,并且必须不由共享高速缓存进行高速缓存。这允许起始服务器声明响应的特定部分是针对仅仅一个用户,并且对其他用户的请求不是有效响应。专用(非共享)高速缓存可以对该响应进行高速缓存。
如果no-cache指示没有指定field-name,则在没有与起始服务器成功地进行重新生效的情况下,高速缓存必须不使用该响应来满足随后的请求。这允许起始服务器防止由已经被配置用于将过时的响应返回给客户请求的高速缓存进行的高速缓存。
当在高速缓存响应中出现max-age cache-control指示时,如果响应的当前寿命比在对那个来源有新请求时给出的寿命值大(以秒计),则所述响应是过时的。有关响应的max-age指示暗示了除非还出现一些其他更具有限制性的高速缓存指示,否则该响应是可以进行高速缓存的(即,“public”)。
服务器应该使用vary-header-field来通知高速缓存使用了什么样的request-header-fields来在可高速缓存的响应的多个表示中进行选择,该可高速缓存的响应服从于server-driven协商。已知由vary-field-value命名的系列头部字段作为“选择的”request-header。
Vary-field-value指示在响应是新的时,request-header字段系列完全确定是否允许高速缓存使用响应来应答随后的请求而不用重新生效。
这是HTTP协议提供的系列功能,以便由http交谈(talking)组件来使用。这个受限制的系列功能使得今天的门户服务主要以非可高速缓存来交付它们的响应。
图3A示出了在门户中的高级高速缓存组件的基本实现。
使用本发明的高级的高速缓存组件60扩展了现有技术的门户30。最好在门户汇集组件50中嵌入该高级的高速缓存组件60。
门户汇集组件接收有关门户页面的用户请求,并且产生请求80到独立的组件40,例如Portlet,主题,然后该组件动态地提供门户页面片段,该片段包括它们的组件特定动态高速缓存信息81-84。
组件特定动态高速缓存信息81-84包括组件特定动态高速缓存范围值和组件特定动态高速缓存失效值(时间)。该组件自己负责产生组件特定动态高速缓存信息81-84。在特定实施中,从与内容自身相同的应用程序检索组件特定动态高速缓存信息81-84。比如,Backend系统是内容管理应用程序,可以从内容元信息检索组件特定动态高速缓存信息。在另一个特定实施中,组件自己实施逻辑。可以在单独组件内与该逻辑一起来定义组件特定动态高速缓存信息81-84。
本高级的高速缓存组件从组件响应来提取组件特定动态高速缓存信息81-84,并且为将被汇集的门户页面计算动态页面特定高速缓存信息90。动态页面特定高速缓存信息包括用于所得门户页面的公共最小高速缓存失效值和公共最小高速缓存范围值。在后面的章节,说明计算算法。将完整的门户页面作为从门户服务器30来的响应的部分提供给高速缓存,该完整的门户页面包括动态页面特定高速缓存信息90。高速缓存20可以评估包含在用于对随后请求的页面进行高速缓存的响应之中的高速缓存信息90。可以由高速缓存20来响应对于将被高速缓存的页面的随后请求,而不涉及门户30。如果在门户页面中嵌入的高速缓存信息90不允许进行高速缓存,则将该请求从高速缓存20导向门户30。
可以如下所述来实现用于Portlet的可能的接口,该Portlet提供带有组件特定动态高速缓存信息81-84的门户片段在运行时提供由Portlet产生的组件特定动态高速缓存信息。门户APT(应用编程接口)定义在运行时(runtime)将被指定的EXPIRATION CACHE设置。本高级的高速缓存组件使用组件特定动态高速缓存失效的这个设置。可以使用同样的机制来利用动态高速缓存范围信息。
所说明的是Portlet程序员如何在运行时公布高速缓存信息(如,远程高速缓存)的例子。
RemoteCacheInfo.MetaData.SCOPE=“Portlet.remote-cache-scope”;RenderResponse.setProperty(“EXPIRATION_CACHE”,(newInteger(3000)).toString());RenderResponse.setProperty(“CACXHE-SCOPE”,“PRIVATE”);图3B示出了用于计算门户页面的公共高速缓存范围和公共高速缓存失效的本发明的高速缓存机制。
上面说明的处理流程确保最小执行时间。一旦任何给定组件阻止整个页面的高速缓存的情况变得清楚,则计算就完成了。
本高级的高速缓存组件将所有被寻址组件的组件特定动态高速缓存信息10、30、50进行集合,该所有被寻址组件提供门户页面片段(仍参见图3A)。基于这些单一的值,为完整的门户页面来计算公共高速缓存信息。典型地,200、300独立地执行门户页面的公共高速缓存范围的计算和门户页面的公共高速缓存失效的计算。在优选实施例中,在高速缓存范围计算前,进行公共高速缓存失效时间的计算。
为了计算某个门户页面的公共最小高速缓存失效值,本高级的高速缓存组件确定在由每个门户片段提供的失效时间中的最小失效时间,特别地将每个组件特定动态高速缓存失效时间与组件特定动态高速缓存失效时间的当前最小值进行比较。如果新的组件特定动态高速缓存失效时间小于当前识别的最小值,则将新的组件特定动态高速缓存失效时间作为新的最小值。当比较了所有组件特定动态高速缓存失效时间时,或者一个组件要求称为立即失效(失效时间=0)的最小可能的失效时间,则发现了最小即公共页面高速缓存失效值。一旦发现要求立即失效(失效时间=0)的组件,本高级的高速缓存组件可以停止组件失效时间中最小公共失效时间的计算,在这种情况下,停止计算并且将公共失效时间定义为立即失效(失效时间段=0)。如果所计算的公共高速缓存失效时间要求立即失效,则不要求公共高速缓存范围计算并且将其设置为专用。
为了计算门户页面的公共最小高速缓存范围值,本高级的高速缓存组件在由每个门户片段提供的组件特定动态高速缓存范围中,导出最小组件特定动态高速缓存范围。一旦发现只允许在专用范围(非可高速缓存的)进行高速缓存的组件,本高级的高速缓存组件可以停止公共高速缓存范围的计算。在那种情况下,停止计算,并且本高级的高速缓存组件将公共高速缓存范围定义为专用75或非可高速缓存的(85),90(100)、110(120),130(140)。
图3C示出了高速缓存信息的静态配置。如果组件不提供组件特定动态高速缓存信息,门户服务器落回默认的、为给定组件而配置的默认组件特定高速缓存信息。门户服务器的管理员35可以为每个组件定义默认的高速缓存信息36。
图4示出计算总高速缓存信息的所要求数据的概观图。其内容将在下面进行解释。
组件特定动态高速缓存信息的组成有门户、当前请求的页面目标(页面)、与该页面目标相关的布局应用程序、关于针对当前所请求的页面目标的所有Portlet的Portlet定义、和用于当前所请求的页面目标的Portlet窗口。
除门户以外的所有这些组件都提供关于组件特定高速缓存失效值(以秒计)和组件特定高速缓存范围(有效值为“shared(共享的)”和“non-shared(非共享的)”)的信息。
Portlet窗口还为高速缓存提供获得状态(render state)信息。使用Portlet的这种方法,可以动态地公布这个信息。这种设计甚至允许单一Portlet的几个观看状态(view state)都是可以高速缓存的。通过使用在JSR168 Portlet API规范中定义的获得参数(render parameter),可以用已经编码每个Portlet的状态的URL来寻址Portlet观看状态。因为该URL是高速缓存的唯一关键字,所以它是重要的特征,该特征是这个专利的总设计能够被有效实行的先决条件。Portlet获得将它们的当前视图指示为可高速缓存的可能性,该可能性可以被Portlet服务器使用来计算高速缓存的整个页面失效时间。使用这个设计,我们可以假设可以被高速缓存的页面的总数对于利用高速缓存基础结构是足够大的。比如新的Portlet可以示出几个视图,即,象文章的几个报纸页面。这些Portlet视图在合理的时间中是不变的,但是它们不同并且可以通过URL被直接地寻址,该URL编码Portlet的视图状态。
它当然依照于高速缓存的特点和是否将其按照HTTP 1.1规范中所说明的高速缓存控制头部的解释来实施。但是,在基础结构中没有高速缓存的情况下,如果由门户来公布这些高速缓存控制头部,则没有不妥之处。只是在基础结构中没有可以充分利用高速缓存控制头部的组件可能会简单些。
应用程序的任务在专利申请中所述的本发明要求对页面内容提供页面片段的所有组件额外地提供所提供的内容的失效值的信息。要么通过由门户处理的配置参数,要么组件自己或由在运行时动态地提供失效值,组件可以发送它们所产生的内容部分的失效值。
比如,在获得时Portlet自己可以决定其输出是不是可高速缓存的以及如果是可高速缓存的则是多长时间。这个发明的优选实施例也可以假设如果在获得时Portlet没有公布任何高速缓存信息,则落回到由Portlet定义提供的信息是可以的。在那种情况下,将只考虑由Portlet定义提供的值。
门户的任务门户负责交付完整的门户页面。门户负责将门户页面的失效时间提供给高速缓存。这个信息作为在HTTP协议规范中定义的高速缓存指示来提供。这允许在不要求对现存高速缓存进行任何改变的情况下,来应用本专利。仅仅要求在门户和其组件中进行改变。为了到达这些目的,门户服务器需要与所产生的HTTP响应一起来提供额外的高速缓存信息。需要与每个所产生页面一起提供的高速缓存信息至少是高速缓存范围可以将这个页面高速缓存吗?和高速缓存失效时间在高速缓存中的这一项目在多长时间内有效?这些信息以头部字段的形式来提供,该头部字段是门户服务器的HTTP响应的部分。
典型地,高速缓存接受输入请求的URL作为存储在高速缓存中的项目的关键字。因为门户中标记的产生并不仅仅依赖于URL,所以这可能成为问题。门户还可能考虑从请求来的‘user-agent’和‘accept-language’头部字段而产生标记。对这个潜在问题的解决方案是使用‘vary’头部字段来指示输入请求的哪个其他头部字段需要与存储在高速缓存中的值相同,从而不需要生效和到服务器的来回旅程。
门户从参与产生结果页面的不同的组件收集这个信息。每个将门户页面片段提供给门户页面的组件,同样提供组件特定高速缓存失效值。要么通过由门户处理的配置参数,要么组件自己或由在运行时动态地提供组件特定高速缓存失效值,组件可以发送它们的组件特定高速缓存失效值。如果没有由组件要么动态地要么通过配置,来提供组件特定高速缓存值或组件特定高速缓存范围值,则假设为默认的值。
由组件提供的所有组件特定动态高速缓存信息都需要被合并,从而必须计算公共最小高速缓存范围和公共最小高速缓存失效值。应该注意,根据HTTP规范为一个门户页面只可以指定一个系列的值。
本发明确保
1、公共最小高速缓存失效不超过从组件提供的任何值,以及2、按照从组件提供的,正确地选择公共最小高速缓存范围。
用数学方式将其定义如下将公共最小高速缓存范围定义如下所有Portlet定义pdi,所有Portlet窗口pvi(视图),在页面上的布局应用程序th和页面目标cm自己已经与个性化高速缓存范围联系cache-scope(pdi),cache-scope(pvi),cache-scope(th),cache-scope(cm)其可以采用带有如non-share<shared所定义的‘<’的关系的{non-share,shared}的值。
将公共最小高速缓存失效时间定义如下所有Portlet定义pdi,Portlet窗口pvi(视图),在页面上的布局应用程序th和页面目标cm自己已经与组件特定失效值-时间联系cache-scope(pdi),cache-scope(pvi),cache-scope(th),cache-scope(cm)其分别具有>=0(秒)的值。
将作为所有值的最小值来计算所获得的门户页面视图的公共最小高速缓存失效时间cache-expiration(page)=min{cache-expiration(pd1),......cache-expiration(pdn),
cache-expiration(pv1),......cache-expiration(pvn),cache-expiration(th),cache-expiration(cm)}将作为所有值的最小值来计算所获得的门户页面视图的公共最小高速缓存范围remote-cache-scope(page)=min{cache-scope(pd1),......cache-scope(pdn),cache-scope(pv1),......cache-scope(pvn),cache-scope(th),cache-scope(cm)}当根据给定公式来计算公共最小高速缓存范围和公共最小高速缓存失效值时,可以将这个值用于为整个的结果门户页面来设置相应的值。
使用这个发明,可以设计门户来有效利用高速缓存,而不改变基本的传输协议或现存高速缓存基础结构。将门户片段提供给门户标记的组件还可以额外地控制高速缓存范围和它们的门户片段的失效时间。在每次获得新内容时,可以计算和发送组件内容的高速缓存失效时间和范围。使用这个信息来计算门户标记的失效时间和范围。
使用这个新的发明,将可能在非常精细的水平上区分可高速缓存的和非高速缓存的门户页面。在对其本质为静态的页面有很多点击的情况下,和当需要处理高负载时,特别在不用再通过门户来获得内容的一些情况下,本发明为门户增加了价值。
权利要求
1.一种为门户中的动态门户页面动态地产生高速缓存信息的方法,其中每个门户包括门户汇集组件(50),该组件(50)接收用户请求(90)、提供用户请求给单一组件(80)、接收从所述组件来的以门户页面片段形式的响应、并且汇集所述门户片段来制成完整的门户网页,该方法包括步骤结合每个门户页面片段,动态地产生组件特定高速缓存信息(81-84),其中所述组件特定高速缓存信息至少包括组件特定高速缓存范围值和组件特定高速缓存失效值;从门户页面片段提取所述组件特定动态高速缓存信息;计算动态页面特定高速缓存信息(90),其中所述动态页面特定高速缓存信息包括公共最小高速缓存范围和公共最小高速缓存失效值;和将所述动态页面特定高速缓存信息插入到所述门户页面,该门户页面将被汇集为完整的门户页面。
2.根据权利要求1所述的方法,其中所述组件特定高速缓存信息是在运行时产生的。
3.根据权利要求1所述的方法,还包括步骤如果没有将组件特定高速缓存信息与所述门户页面片段一起提供,则使用组件特定默认高速缓存值。
4.根据权利要求1所述的方法,其中将所述动态页面特定高速缓存信息(90)插入到响应的头部,该响应包括所述完整的门户页面。
5.根据权利要求1所述的方法,其中通过确定门户页面是专用、公共或不高速缓存的来计算所述公共最小高速缓存范围。
6.根据权利要求1所述的方法,其中通过确定最低的组件特定动态失效值来计算所述公共最小失效值。
7.根据权利要求1所述的方法,其中在用于计算所述公共最小失效时间的所述方法步骤之后,进行用于计算所述公共最小高速缓存范围的所述方法步骤,并且对于门户页面如果所述公共最小失效时间的结果为“0”,则不进行所述公共最小高速缓存范围的计算。
8.根据权利要求1所述的方法,其中通过使用HTTP协议将所述门户页面提供给高速缓存。
9.一种门户,包括门户汇集组件(50),用于调用产生门户片段的组件、从所述组件接收所述门户片段、并且将所述门户片段汇集到完整的门户页面中;组件(40),用于提供动态门户页面片段;其特征在于高级的高速缓存组件(60),用于接收所述门户片段以及它们的组件特定高速缓存信息(81-84),该组件特定高速缓存信息(81-84)是对于每个门户片段动态地产生的;用于基于所述组件特定高速缓存信息,计算动态页面特定高速缓存信息(90);并且用于将所述动态页面特定高速缓存信息插入到所述响应中,该响应包括所述完整的门户页面。
10.根据权利要求5所述的门户,其中所述高级的高速缓存组件(60)是门户汇集组件(50)的部分。
11.根据权利要求5所述的门户,其中如果没有将组件特定高速缓存信息与所述门户页面片段一起提供,则所述高级的高速缓存组件(60)提供额外的功能来提供组件特定默认高速缓存值。
12.根据权利要求5所述的门户,其中所述高级的高速缓存组件(60)提供功能来将所述动态页面特定高速缓存信息插入到响应的头部,该响应包括所述完整的门户页面。
13.一种方法,用于在高速缓存(20)中高速缓存门户页面,其中所述高速缓存(20)具有到运行门户(30)的门户服务器的连接,该方法包括步骤接收响应,该响应包括门户页面和动态页面特定高速缓存信息,该信息是根据权利要求1至8之一已经为所述门户页面而产生的;如果公共最小高速缓存范围允许所述门户页面的高速缓存,则高速缓存所述响应,该公共最小高速缓存范围是所述动态页面特定高速缓存信息(90)的部分;只要不超过所述公共最小高速缓存失效值,则用所高速缓存的响应来对所述门户页面的请求进行响应,该所述公共最小高速缓存失效值是所述动态页面特定高速缓存信息的部分。
14.一种高速缓存(20),其中所述高速缓存(20)具有到运行门户(30)的门户服务器的连接,所述高速缓存(20)包括用于接收响应的装置,该响应包括门户页面和动态页面特定高速缓存信息,该信息根据权利要求1至8之一已经为所述门户页面而产生;高速缓存装置,如果公共最小高速缓存范围允许所述门户页面的高速缓存,则该高速缓存装置高速缓存所述响应,该公共最小高速缓存范围是所述动态页面特定高速缓存信息的部分;用于响应的装置,只要不超过所述公共最小高速缓存失效值,则该装置用所高速缓存的响应来对所述门户页面的请求进行响应,该所述公共最小高速缓存失效值是所述动态页面特定高速缓存信息的部分。
15.根据权利要求14所述的高速缓存,其中所述高速缓存可以是代理高速缓存、浏览器高速缓存、或门户的高速缓存。
16.计算机程序产品,该产品存储在计算机可用介质上,该计算机可用介质包括计算机可读程序装置,该装置用于当所述计算机程序产品在计算机上执行时,使计算机执行权利要求1到8中任何一个的方法。
全文摘要
本发明提供了方法、系统和计算机程序产品,其通过提供一种高级的高速缓存组件来允许动态门户页面的高速缓存,而不改变现存的高速缓存代理基础结构或将被使用的传输协议。该高级的高速缓存组件提供功能,其中将额外的动态页面特定高速缓存信息作为包括门户页面的响应的部分来提供。在门户中的每个组件都额外地提供动态组件特定高速缓存信息,该信息包括组件特定高速缓存范围值和组件特定高速缓存失效值。将这两个值用于计算动态页面特定高速缓存信息,结果产生是公共最小高速缓存范围和失效值。作为包括门户页面的响应的头部的部分来提供动态页面特定高速缓存信息。然后高速缓存评估动态页面特定高速缓存信息而不被改变。
文档编号H04L29/06GK1760862SQ20051008139
公开日2006年4月19日 申请日期2005年6月30日 优先权日2004年10月12日
发明者雷纳·齐尔宗, 卡斯滕·勒, 斯蒂芬·利施, 托马斯·谢克 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1