在 Web 上发布重要的公共警报

以一种基于标准的方式使用 Atom Publishing Protocol 发布 Common Alerting Protocol(CAP)警报

最近完成的 Atom Publishing Protocol 为在 Web 上发布和管理内容提供了一个简单的基于 HTTP 的机制。通过使用 Common Alerting Protocol 标准,Atom 发布技术为发布重要的紧急信息提供了一种强大且灵活的方式。学习如何使用 Atom 创建、发布和使用紧急警报。

James Snell (jasnell@us.ibm.com), 软件工程师, EMC

Photo of James M SnellJames M. Snell 是 IBM WebAhead 小组的软件工程师,主要研究 IBM 自己使用的前沿性软件技术的开发和实际应用。James 参与了 Atom Syndication Format 和 Atom Publishing Protocol 标准的制订过程,并实现了至少九个不同的 Atom Publishing Protocol 服务器实现。


developerWorks 投稿作者

2007 年 9 月 24 日

Common Alerting Protocol(CAP)是一种简单的标准化 XML 数据格式,United States Department of Homeland Security、United States Geological Survey(USGS)、加拿大政府和许多其他组织使用这种格式交换大量警报和紧急事件信息(使用 CAP 的公司和组织的清单见 参考资料)。

CAP 标准定义了一种称为警报(alert)的文档类型,这种文档用来交换许多方面的警报和事件,比如地质、气象、公共卫生和安全、营救、执法、环境、交通运输、基础设施和恐怖活动。这种警报可以由事件响应部门手工生成,也可以由监视和传感设备自动生成,而且可以使用多种方式分布它们。Atom 和 RSS 等联合格式为日益流行的 CAP 警报提供了一种发布渠道。

Atom Publishing Protocol(有时称为 Atompub 协议)是一种使用基本的 HTTP GET、POST、PUT 和 DELETE 操作发布和管理资源集合的机制。尽管 Atompub 协议最初被设计为一种向 weblog 软件发布新文章的机制,但是它适合管理几乎任何类型的 Web 内容。在本文中,我将介绍一个示例 Java™ Web 应用程序,这个程序使用 Atom Publishing Protocol 发布和分布 CAP 警报。

Common Alerting Protocol 简介

CAP 警报文档的结构由一个 <alert /> 元素组成,其中包含一个或多个 <info /> 元素,这些元素提供事件的详细信息。在每个 <info /> 元素中,包含简单的元数据元素集合以及许多提供额外信息的 <resource /><area /> 元素,比如照片和文档的链接或者受警报影响的地区的地图坐标。常常需要为一个事件产生许多警报文档,从而跟踪紧急情况的发展。清单 1 给出一个 CAP 警报示例。

清单 1. CAP V1.1 规范提供的诱拐儿童警报示例
<?xml version = "1.0" encoding = "UTF-8"?> 
<alert xmlns = "urn:oasis:names:tc:emergency:cap:1.1"> 
  <identifier>KAR0-0306112239-SW</identifier> 
  <sender>KARO@CLETS.DOJ.CA.GOV</sender> 
  <sent>2003-06-11T22:39:00-07:00</sent> 
  <status>Actual</status> 
  <msgType>Alert</msgType> 
  <source>SW</source> 
  <scope>Public</scope> 
  <info> 
    <category>Rescue</category> 
    <event>Child Abduction</event> 
    <urgency>Immediate</urgency> 
    <severity>Severe</severity> 
    <certainty>Likely</certainty> 
    <eventCode> 
      <valueName>SAME</valueName> 
      <value>CAE</value> 
    </eventCode> 
    <senderName>LOS ANGELES POLICE DEPT - LAPD</senderName> 
    <headline>AMBER ALERT</headline> 
    <description>DATE/TIME: 06/11/03, 1915 HRS. VICTIM(S): KHAYRI DOE JR. 
    M/B BLK/BRO 3'0", 40 LBS. LIGHT COMPLEXION. DOB 06/24/01. WEARING RED 
    SHORTS, WHITE T-SHIRT, W/BLUE COLLAR. LOCATION: 5721 DOE ST., 
    LOS ANGELES, CA. SUSPECT(S): KHAYRI DOE SR. DOB 04/18/71 M/B, BLK HAIR, 
    BRO EYE. VEHICLE: 81' BUICK 2-DR, BLUE (4XXX000).</description> 
    <contact>DET. SMITH, 77TH DIV, LOS ANGELES POLICE 
    DEPT-LAPD AT 213 485-2389</contact> 
    <area> 
      <areaDesc>Los Angeles County</areaDesc> 
      <geocode> 
        <valueName>SAME</valueName> 
        <value>006037</value> 
      </geocode> 
    </area> 
  </info> 
</alert>

在这个示例中,可以看到典型 CAP 警报的大多数主要组件。下面是典型警报元素的列表:

  • 惟一的 <identifier /><sender />:这些元素一起惟一地标识每个警报。<identifier> 是否必须是全局惟一,还是只在一个特定 <sender /> 的上下文中惟一,关于这一点当前的 CAP 标准的规定并不明确。但是,有一点非常明确,<sender /> 的值必须是全局惟一的。
  • 发送时间戳:这是发送警报文档的日期和时间,采用 IS0 8601 格式。
  • 描述<status /><msgType /><scope /> 元素描述警报文档的特定性质:
    • 状态:警报文档可以描述一个实际事件、一次演习、系统之间的一次通信、测试或草案。
    • 消息类型:警报文档可以是最初的通知、更新、对以前警报的撤消、对收到以前警报的确认或错误通知(描述以前接收的警报为什么被拒绝了)。
    • 范围:警报文档可以向一般公众发布、向需要了解相关情况的特定受众发布或者只发布给有限的一组非公共人员。

下面是典型的信息元素列表:

  • 类别:每个警报属于几个类别之一,包括地质、气象、公共卫生和安全、营救、执法等等。
  • 描述:这个信息元素包含文本信息,可以描述事件、建议的响应、指示、联系信息、更多信息的链接等等。
  • 倾向<urgency /><severity /><certainty /> 元素提供关于情况的重要性和影响的信息:
    • 紧急性:情况的紧急性可以是立即、预期、过去、未来或未知。
    • 严重性:情况的严重性可以是极端严重、严重、中等、轻微或未知。
    • 确定性:情况的确定性可以是已经观察到、很可能、可能、不可能或未知。
  • 时间戳:警报描述的情况可以有多个时间戳,包括情况发生的时间、信息生效的日期和时间以及信息过期的日期和时间。

资源元素描述情况报告附带的照片、文档和数据等资源。例如,执法警报可能包含嫌疑犯或受害人的照片、嫌疑犯的车辆的照片等等。可以通过 URL 链接资源,资源也可以作为 Base64 编码的文本直接包含在警报中。

区域元素描述受到警报影响的地理区域。这些元素可以包含详细的地理坐标(比如用精确地图坐标表示的圆形或多边形),还可以是简单的一般性文本描述。

为了增加安全性,CAP 警报可以包含 XML 数字签名,还可以使用 XML Encryption 进行加密。

创建和使用 CAP 警报

在实现基于 CAP 的应用程序时,第一步是提供一种产生和解析警报文档的方法。可以使用任何 XML 库,以及几个目前用来处理 CAP 警报的 Java 库。在这里的示例中,我使用 Apache Abdera 项目中对数字签名和加密文档的内置支持。Abdera 简化了实现 Atom Publishing Protocol 端点的过程。在后面,我将演示如何使用端点发布和管理警报。可以通过访问 Abdera 的 Web 站点了解更多信息(参见 参考资料)。

这个示例提供一组接口和类,它们提供对警报文档内容的完整访问能力。本文提供的可下载 .zip 文件中包含这个 CAP 实现的完整源代码(见本文后面的 下载)。

清单 2 演示如何创建一个警报文档,其中只包含一个 <info /> 元素。

清单 2. 用 Apache Abdera 创建 CAP 警报
Abdera abdera = new Abdera();
Factory factory = abdera.getFactory();

Alert alert = (Alert) factory.newElement(CAP_ALERT);
alert.setIdentifier("ABC123DEF456");
alert.setSender("jasnell@example.org");
alert.setSent(new Date());
alert.setStatus(Alert.Status.Actual);
//...
Info info = alert.addInfo();
info.setCategories(Info.Category.Geo);
info.setEvent("Something happened");
info.setUrgency(Info.Urgency.Past);
info.setSeverity(Info.Severity.Extreme);
//...

清单 3 演示如何解析 CAP 警报文档并访问它包含的信息。

清单 3. 用 Apache Abdera 解析 CAP 警报
Abdera abdera = new Abdera();
Parser parser = abdera.getParser();
InputStream in = ... // get the input stream

Document<Alert> doc = parser.parse(in);
Alert alert = doc.getRoot();

System.out.println(alert.getIdentifier());
System.out.println(alert.getSender());
System.out.println(alert.getSent());
System.out.println(alert.getStatus());
//...
for (Info info : alert.getInfo()) {
  System.out.println(info.getEvent());
  //...
}

因为这个 CAP 实现是基于 Abdera 的,所以继承了许多有用的特性,比如可以使用 toString()writeTo(...) 方法直接序列化为 XML,更重要的是,可以支持对警报文档进行 XML 数字签名。

对 CAP 警报进行数字签名

经过数字签名的 CAP 警报允许收件人检验这个警报的真实性。在处理公共安全情况时,这种安全措施对于确保警报分布系统不被滥用是非常重要的。

为了使用示例实现对警报进行签名,需要可选的 Abdera 安全模块、用来产生数字签名的私钥和一个 X.509 证书(其中包含用来检验签名的公钥)。清单 4 演示了这个过程。对 getSignatureOptions(...) 的调用为签名过程准备私钥和 X.509 证书。

清单 4. 对 CAP 警报进行数字签名
Abdera abdera = new Abdera(); 
//... create the Alert document
AbderaSecurity absec = new AbderaSecurity(abdera); 
Signature sig = absec.getSignature(); 
SignatureOptions sigoptions = getSignatureOptions(sig); 

doc = sig.sign(doc.getRoot(), sigoptions).getDocument();

在签名之后,警报文档就包含一个封装的签名,其中包含 X.509 证书,如 清单 5 所示。

清单 5. 经过数字签名的 CAP 警报
<alert xmlns="urn:oasis:names:tc:emergency:cap:1.1"> 
  <identifier>ABC123DEF456</identifier> 
  <sender>jasnell@example.org</sender> 
  <sent>2007-06-30T19:15:32.468Z</sent> 
  <status>Actual</status> 
  <info>...</info> 
  <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
    <ds:SignedInfo> 
      <ds:CanonicalizationMethod 
        Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /> 
      <ds:SignatureMethod 
        Algorithm="http://www.w3.org/2000/09/xmldsig#dsa-sha1" /> 
      <ds:Reference URI=""> 
        <ds:Transforms> 
          <ds:Transform 
            Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> 
          <ds:Transform 
            Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> 
        </ds:Transforms> 
        <ds:DigestMethod 
          Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> 
        <ds:DigestValue>...</ds:DigestValue> 
      </ds:Reference> 
    </ds:SignedInfo> 
    <ds:SignatureValue>...</ds:SignatureValue> 
    <ds:KeyInfo> 
      <ds:X509Data> 
        <ds:X509Certificate> 
          ...
        </ds:X509Certificate> 
      </ds:X509Data> 
    </ds:KeyInfo> 
  </ds:Signature>
</alert>

在生成数字签名之后,如果警报的任何部分被修改了,那么签名就会失效。如果签名是有效的,而且签名中的 X.509 证书是可信的,那么收件人就可以认为警报是可信的,至少没有被第三方修改过。

在包含 X.509 证书的签名的警报中,包含检验签名所需的所有信息,见 清单 6

清单 6. 检验经过数字签名的 CAP 警报
Abdera abdera = new Abdera();
//... parse the Alert document
AbderaSecurity absec = new AbderaSecurity(abdera);
Signature sig = absec.getSignature();

boolean isValid = sig.verify(doc.getRoot(),null);

这个示例应用程序要求通过 Atom Publishing Protocol 发布的所有 CAP 警报都包含有效的数字签名。另外,它以一种特定的方式重新分布这些警报,能够让签名在分布之后仍然有效。

对 CAP 警报进行加密

警报常常包含机密信息,只有经过适当授权的某些人才能访问这些信息。尽管可以按照许多方式确保警报的机密性,但是 CAP 规范明确要求支持 XML Encryption。这里的示例应用程序没有使用加密的文档,但是基于 Abdera 的实现可以轻松地处理这种加密,见 清单 7

清单 7. 对 CAP 警报进行加密
Alert alert = //... create the CAP Alert

String jceAlgorithmName = "AES"; 
KeyGenerator keyGenerator = 
    KeyGenerator.getInstance(jceAlgorithmName); 
keyGenerator.init(128); 
SecretKey key = keyGenerator.generateKey(); 

AbderaSecurity absec = new AbderaSecurity(abdera); 

Encryption enc = absec.getEncryption(); 
EncryptionOptions options = enc.getDefaultEncryptionOptions(); 
options.setDataEncryptionKey(key); 

// Encrypt the document using the generated key 
Document enc_doc = enc.encrypt(alert.getDocument(), options);

在这个示例中,使用一个对称密钥对警报文档进行加密,接收方必须知道这个密钥才能对文档进行解密。使用对称密钥只是为了简化这个示例。使用公钥/私钥对的非对称密钥加密或者 Diffie-Hellman 等密钥交换方法也是可行的,而且在某些情况下建议采用这些更安全的方法。清单 7 的结果是一个加密的 XML 文档,见 清单 8(缩略形式)。

清单 8. 加密的 CAP 警报
<?xml version='1.0' encoding='utf-8'?> 
<xenc:EncryptedData 
  xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" 
  Type="http://www.w3.org/2001/04/xmlenc#Element"> 
  <xenc:EncryptionMethod 
    Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc" /> 
  <xenc:CipherData> 
    <xenc:CipherValue>...</xenc:CipherValue> 
  </xenc:CipherData> 
</xenc:EncryptedData>

因为许多攻击方法无需破解密码,就可以修改加密的数据,所以在对警报文档进行加密之前,强烈建议先进行数字签名,以防止这些攻击。

发布 CAP 警报

既然已经有办法创建并解析警报文档,就需要有一种发布和管理它们的方法。为此,可以借助于 Atom Publishing Protocol。

Atompub 基于不同资源的集合。对于 CAP 服务,只有一个集合,可以在其中添加 CAP 警报文档。要想获得一个 Atom Feed 所表示的警报集合,可以向集合的 URI 发出一个 HTTP GET 请求。每个警报由一个 Atom Entry 和一个 CAP 警报文档表示。

表 1 列出 CAP 发布服务支持的方法及 URI,并提供简单的描述。

表 1. CAP 服务 TEST FOR PRINT 支持的 URI 和操作
URI 和类型方法操作描述

URI:/capservice

类型:application/atomsvc+xml

GET检索获得 Atom Service 文档

URI:/capservice/alerts

类型:application/atom+xml;type=feed

GET列出清单获得这个集合的 Atom Feed

URI:/capserver/alerts

类型:application/alert+xml

POST创建在 Atom 集合中添加一个 CAP 警报

URI:/capserver/alerts/{identifier}.atom

类型:application/atom+xml;type=entry

GET检索获得表示 CAP 警报的 Atom Entry

URI:/capserver/alerts/{identifier}.atom

类型:n/a

DELETE删除删除 CAP 警报

URI:/capserver/alerts/{identifier}.cap

类型:application/alert+xml

GET检索获得发布的 CAP 警报

URI:/capserver/alerts/{identifier}.cap

类型:application/alert+xml

PUT更新更新发布的 CAP 警报

URI:/capserver/alerts/{identifier}.cap

类型:n/a

DELETE删除删除 CAP 警报

本文的可下载 .zip 文件中包含这个 CAP 服务的完整实现(更多信息见 下载)。要想运行这个示例,需要一个 Java Web 应用服务器,比如 Apache Tomcat 或 IBM WebSphere® Application Server。存档文件中包含完整的说明。

CAP 标准没有为警报文档定义 MIME 媒体类型。尽管可以使用 application/xml 媒体类型,但是用这样的一般化媒体类型表示警报这样特殊的文档格式不太理想。对于本文的示例应用程序,我用一个组合的 application/alert+xml 媒体类型表示警报文档。

发布警报

要想将一个警报文档发布到集合中,只需执行两个步骤,见 清单 9。首先,创建一个警报文档并进行签名(见 清单 2清单 4)。然后创建一个 Abdera 客户机并为警报指定适当的媒体类型。最后,使用 HTTP POST 将警报发送到集合中。

清单 9. 将一个警报发布到集合中
Alert alert = // create and sign the alert
RequestOptions options = client.getDefaultRequestOptions(); 
options.setContentType("application/alert+xml"); 
resp = client.post(
  "http://localhost:9080/capserver/alerts", 
  alert.getDocument(), options);

switch(resp.getType()) { 
  case SUCCESS: 
    // posting succeeded
  default: 
    // something else happened
    System.out.println(resp.getStatus()); 
    System.out.println(resp.getStatusText()); 
}

如果 POST 操作成功,那么 HTTP 响应就包含一个 Location 头,它指定表示发布的警报的 Atom Entry Document 的位置。这个条目包含发送到集合中的 CAP 警报文档的链接。服务器会对 Entry Document 进行数字签名。清单 10 显示服务器产生的 Entry Document。

清单 10. 表示发布的 CAP 警报的 Atom Entry Document
<?xml version="1.0" encoding="utf-8"?> 
<entry> 
  <id>http://localhost:9080/capserver/alerts/KAR0-0306112239-SW</id> 
  <updated>2003-06-12T05:39:00.000Z</updated> 
  <published>2003-06-12T05:39:00.000Z</published> 
  <app:edited xmlns:app=
      "http://www.w3.org/2007/app">2007-06-27T05:12:05.448Z</app:edited> 
  <title type="text">AMBER ALERT</title> 
  <author><name>LOS ANGELES POLICE DEPT - LAPD</name></author> 
  <summary type="text">...</summary> 
  <link href="http://localhost:9080/capserver/alerts/KAR0-0306112239-SW.cap" />
  <link href="http://localhost:9080/capserver/alerts/KAR0-0306112239-SW.cap" 
      rel="edit-media" />
  <link href="http://localhost:9080/capserver/alerts/KAR0-0306112239-SW.cap" 
      rel="enclosure" />
  <link href="http://localhost:9080/capserver/alerts/KAR0-0306112239-SW.atom" 
      rel="self" />
  <content type="application/alert+xml"
      src="http://localhost:9080/capserver/alerts/KAR0-0306112239-SW.cap" /> 
  <category scheme="urn:oasis:names:tc:emergency:cap:1.1:status" term="Actual" /> 
  <category scheme="urn:oasis:names:tc:emergency:cap:1.1:msgtype" term="Alert" />
  <category scheme="urn:oasis:names:tc:emergency:cap:1.1" term="Rescue" />
  <category scheme="urn:oasis:names:tc:emergency:cap:1.1:urgency" term="Immediate" />
  <category scheme="urn:oasis:names:tc:emergency:cap:1.1:severity" term="Severe" /> 
  <category scheme="urn:oasis:names:tc:emergency:cap:1.1:certainty" term="Likely" /> 
  <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
    ...
  </ds:Signature>
</entry>

在这个示例中,CAP 警报中包含的几个数据元素转换为 Entry Document 中的 atom:category 元素。这样 Atom 客户机实现就可以表达关于警报的额外信息,而不需要预先了解 CAP 规范。由于在 Atom Entry 中没有表示警报元数据的标准方式,不同的实现可能以不同的方式表示这些信息。

客户机应用程序可以使用条目中各个 atom:link 元素中提供的 URI 访问 Entry Document 或 CAP 警报文档。可以在 http://localhost:9080/capserver/alerts/KAR0-0306112239-SW.cap 获得 CAP 警报文档(见 清单 11)。

清单 11. 获得 CAP 警报文档
Entry entry = // get the entry
ClientResponse resp = client.get(
    "http://localhost:9080/capserver/alerts/KAR0-0306112239-SW.cap");
Document<Alert> doc = resp.getDocument();
Alert alert = doc.getRoot();

可以在 http://localhost:9080/capserver/alerts/KAR0-0306112239-SW.atom 获得 Entry Document(见 清单 12)。

清单 12. 获得警报的 Atom Entry
ClientResponse resp = client.get(
  "http://localhost:9080/capserver/alerts/KAR0-0306112239-SW.atom");
Document<Entry> doc = resp.getDocument();
Entry entry = doc.getRoot();

列出发布的警报

集合提供的 Atom Feed Document 中列出了发布的警报,其中最近创建或修改的警报列在最前面。如 清单 13 所示,每个条目只表示一个警报文档,并提供获得或修改警报所需的链接。

清单 13. 类别 Atom 集合
<?xml version="1.0" encoding="utf-8"?> 
<feed xml:base="http://localhost:9080/capserver/alerts" 
      xml:lang="en-US" 
      xmlns="http://www.w3.org/2005/Atom"> 
   <id>http://localhost:9080/capserver/alerts</id> 
   <title type="text">CAP Catalog</title> 
   <updated>2007-06-27T07:51:29.676Z</updated> 
   <author><name>CAP Catalog</name></author> 
   <link href="http://localhost:9080/capserver/alerts" rel="self" />
   <link href="http://localhost:9080/capserver/alerts?page=2" 
     rel="next" type="application/atom+xml" />
   
   <entry> 
     <id>http://localhost:9080/capserver/alerts/KAR0-0306112239-SW</id> 
     ...
   </entry> 
   ... 
   <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
     ... 
   </ds:Signature> 
 </feed>

修改和删除警报

修改警报是个非常简单的过程。首先,为了获得警报文档当前的可编辑表示,编辑客户机对 CAP 文档发送一个 HTTP GET 请求。这返回警报以及最近修改的时间戳或实体标记。然后,客户机可以根据需要执行任何修改,从警报中删除原来的数字签名并对修改后的文档重新签名。完成这些操作之后,客户机将一个 PUT 请求(包含修改后的警报)发送回用来获得原文档的 URL,见 清单 14

清单 14. 更新 CAP 警报
Alert alert = // get and modify the alert
RequestOptions options = client.getDefaultRequestOptions(); 
options.setIfMatch(etag);
options.setContentType("application/alert+xml"); 
resp = client.put(
  "http://localhost:9080/capserver/alerts/KAR0-0306112239-SW.cap", 
  alert.getDocument(), options);

switch(resp.getType()) { 
  case SUCCESS: 
    // update succeeded
  default: 
    // something else happened
    System.out.println(resp.getStatus()); 
    System.out.println(resp.getStatusText()); 
}

注意,在典型的 Atom Publishing Protocol 实现中,Atom Entry Documents 是可编辑的。但是,在 CAP 服务器示例中,根据警报文档中包含的信息自动生成 Entry Documents,客户机不能直接编辑它们。要想编辑 Entry Document,客户机必须编辑 CAP 警报。

要想删除一个警报,需要向用来获得警报文档的 URL 发送一个 HTTP DELETE 请求,见 清单 15

清单 15. 删除 CAP 警报
RequestOptions.options = client.delete(
  "http://localhost:9080/capserver/alerts/KAR0- 0306112239-SW.cap");

尽管这个示例应用程序没有实现任何访问控制机制,但是真实的实现应该确保只允许那些获得适当授权的用户发布、修改和删除警报文档。

结束语

开发 Common Alerting Protocol 的关键目标之一是,以一种全面的标准化方式发布关于各种威胁生命安全事件的相关信息。使用 Atom Publishing Protocol 发布和管理 CAP 警报集合有助于实现这个目标。


下载

描述名字大小
本文的示例 Java Web 应用程序atomcap.zip18455KB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=XML, Open source, Web development
ArticleID=258241
ArticleTitle=在 Web 上发布重要的公共警报
publish-date=09242007