﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-jinfeng_wang-随笔分类-view</title><link>http://www.blogjava.net/jinfeng_wang/category/1002.html</link><description>G-G-S,D-D-U!</description><language>zh-cn</language><lastBuildDate>Fri, 07 Mar 2008 16:23:56 GMT</lastBuildDate><pubDate>Fri, 07 Mar 2008 16:23:56 GMT</pubDate><ttl>60</ttl><item><title>单点登陆(SSO)组件的设计与实现 zz</title><link>http://www.blogjava.net/jinfeng_wang/archive/2008/03/07/184540.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Fri, 07 Mar 2008 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2008/03/07/184540.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/184540.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2008/03/07/184540.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/184540.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/184540.html</trackback:ping><description><![CDATA[http://www.cnblogs.com/jillzhang/archive/2008/02/01/1061212.html<br />
<br />
<br />
<br />
<br />
<p>&nbsp;
先说几句废话，自我感觉此方案还不错，至少解决了安全性的问题，也实现了统一登出，能跨平台，跨服务期，跨域名，当然需要相应的联盟站点的支持，但从原理上绝对能跨平台。设计和具体实现的描述比较长，今天先介绍一部分
<br />
<br />
<br />
</p>
<h1>1引言 </h1>
<h2>1.1 编写目的 </h2>
<p>详细说明单点登录组件(SSO)的设计思想和实现方法，是日后该组件维护和扩展工作的基本依据文档。预期读者是要实现单点登录(SSO)系统的系统设计人员，系统开发人员，系统维护人员。
</p>
<h2>1.2 背景 </h2>
<p>说明： </p>
<ol style="margin-left: 39pt;">
    <li>
    <div style="text-align: justify;">待开发软件系统的名称；jillzhang的SSO组件 </div>
    </li>
    <li>
    <div style="text-align: justify;">本项目的任务提出者为jillzhang、开发者为jillzhang、用户为有用户整合需求平台的开发和设计人员。
    </div>
    </li>
</ol>
<h2>1.3 定义 </h2>
<p><strong>SSO</strong>是Single Sign
On的缩写，该技术主要用于用户整合。<br />
<strong>认证中心</strong>：认证中心是用户注册，成员站点管理，用户登录，验证登录信息，保存登录
信息，颁发登录认证的中心站点。&nbsp;<br />
<strong>成员站点:
</strong>成员站点是遵从认证中心规则，享用认证中心统一用户的站点。&nbsp;&nbsp;<br />
<strong>注册站点：</strong>如果想成为成员站点，必须先在认证中心进行站点登记，登记后，认证中心会保存注册站点的配置信息，并将该配置信息发给注册站点。注册站点也需保存这些配置信息，供日后与认证中心交互时候使用。&nbsp;&nbsp;<br />
<strong>联盟用户</strong>：指在认证中心注册的用户，这些用户能被所有的成员站点所共享。<br />
<strong>登录请求</strong>：指成员站点向认证中心发出的带有站点配置的用户登录请求信息。<br />
<strong>登出请求</strong>：只用户向认证中心发出的要求退出登录的请求。&nbsp;&nbsp;<br />
<strong>登录请求验证：</strong>指的是认证中心根据存储的站点信息对成员站点的登录请求信息进行来
源和真实性的验证。<br />
<strong>登出请求验证：</strong>指认证中心在接受来自成员站点的登出请求的时候，对请求的来源和真实性进行的验证<br />
<strong>登录答复：</strong>指认证中心对经过验证的登录请求作出的答复信息。该答复包含用户的登录信息。<br />
<strong>在线联盟用户数</strong>：指的是在成员站点中，在线的联盟用户数量。&nbsp;&nbsp;<br />
<strong>在线联盟用户列表</strong>：指的是在成员站点中，在线的联盟用户的列表信息。&nbsp;<br />
<strong>登录站点清单：</strong>是由认证中心维护的用户的登录站点信息，当用户注销的时候，会遍历此清单，逐个登出。
</p>
<h2>1.4 参考资料 </h2>
<p>本组件的设计和实现参考了下面的系统和书籍 </p>
<ol style="margin-left: 39pt;">
    <li>
    <div style="text-align: justify;"><a href="http://www.cnblogs.com/David-weihw/archive/2007/01/25/630621.html">http://www.cnblogs.com/David-weihw/archive/2007/01/25/630621.html</a>
    </div>
    </li>
    <li>
    <div style="text-align: justify;">《数字签名技术原理及技术》 <br />
    <br />
    </div>
    </li>
</ol>
<h1>2 程序系统的结构 </h1>
<p>本组件包括下面几个应用接口，分别如下： </p>
<ol style="margin-left: 41pt;">
    <li>
    <div style="text-align: justify;">ISite：ISite是用于描述和操作成员站点的接口 </div>
    </li>
    <li>
    <div style="text-align: justify;">IUser : IUser是用于描述和操作联盟用户的接口 </div>
    </li>
    <li>
    <div style="text-align: justify;">IServer:IServer是认证中心处理登录请求和登出请求的接口 </div>
    </li>
    <li>
    <div style="text-align: justify;">IClient: IClient是成员站点发出登录请求和处理登录答复的接口 </div>
    </li>
    <li>
    <div style="text-align: justify;">IUserLoginList：IUserLoginList是描述和操作用户登录站点清单的接口
    </div>
    </li>
    <li>
    <div style="text-align: justify;">ILoginRequest：是记录和操作成员站点发送登录请求的接口。 </div>
    </li>
    <li>
    <div style="text-align: justify;">ILoginRequestContainer：用于保存和维护登录请求列表的接口 </div>
    </li>
    <li>
    <div style="text-align: justify;">IUserStateContainer：是联盟站点中保存用联盟用户登录信息的接口。
    </div>
    </li>
</ol>
<p>它们的定义如下： </p>
<p style="margin-left: 20pt;"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/jillzhang/013108_1233_SSO1.jpg" />
</p>
<p style="margin-left: 20pt;"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/jillzhang/013108_1233_SSO2.jpg" />
</p>
<p style="margin-left: 20pt;">组件的工作流程描述如下： </p>
<ol style="margin-left: 41pt;">
    <li>
    <div style="text-align: justify;">第一步，首先注册联盟站点，注册联盟站点用到接口ISite </div>
    </li>
    <li>
    <div style="text-align: justify;">第二步：注册好联盟站点之后，将认证中心产生的站点配置信息（包括站点编号，站点公钥，站点私钥，认证中心的登录地址，认证中心登出地址）存储到联盟站点本地。
    </div>
    </li>
    <li>
    <div style="text-align: justify;">在认证中心上注册一新用户，注册用户需要使用IUser接口 </div>
    </li>
    <li>
    <div style="text-align: justify;">在联盟站点对认证中心发出登录请求 </div>
    </li>
    <li>
    <div style="text-align: justify;">认证中心验证登录请求 </div>
    </li>
    <li>
    <div style="text-align: justify;">在认证中心进行登录 </div>
    </li>
    <li>
    <div style="text-align: justify;">登录成功后，保存登录票据，认证中心对联盟站点发送登录答复，并将此次登录记录到登录站点清单
    </div>
    </li>
    <li>
    <div style="text-align: justify;">联盟站点接收到登录答复后，先进性验证，正确后，根据登录答复中的信息产生用户登录票据，并且更新联盟用户登录数和登录列表
    </div>
    </li>
    <li>
    <div style="text-align: justify;">在联盟站点中发出登出请求 </div>
    </li>
    <li>
    <div style="text-align: justify;">认证中心验证登出请求，正确的话，销毁认证中心用户登录票据，通过用户的登录站点清单，逐个调用联盟站点的登出页面
    </div>
    </li>
    <li>
    <div style="text-align: justify;">在认证中心回调联盟站点的登出页的时候，联盟站点会在登出页中销毁各个的登录票据，并更新在线用户数和用户列表。
    </div>
    </li>
</ol>
<p>&nbsp;</p>
<h1>3 ISite接口设计说明&nbsp;</h1>
<h2>3.1 接口描述 </h2>
<p>ISite接口包括7个属性和2个方法，分别用于在认证中心用于描述和操作站点的配置 </p>
<p>信息。 </p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/jillzhang/013108_1233_SSO3.png" align="left" /><br />
</p>
<p><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
其中，各个属性的含义如下</p>
<div style="margin-left: 26pt;">
<table style="border-collapse: collapse;" border="0">
    <colgroup>
    <col style="width: 154px;">
    <col style="width: 189px;">
    <col style="width: 189px;"></colgroup>
    <tbody valign="top">
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">属性名称</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">类型</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">含义</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">SiteID</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">string</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">站点编号，用于表示站点的唯一性。</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">HomePage</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">string</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">当登录请求中未提供来源网址项的时候，登录答复发送的地址</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">LogOutUrl</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">string</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">在进行统一登出的时候，回调的联盟站点页面地址，这个页面会负责销毁本站的登录票据信息。</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">PublicKey</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">string</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">用于数据交换时加密或签名用的公钥</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">PublicAndPrivateKey</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">string</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">用于数据交换时加密或签名用的私钥</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">FromUrlKey</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">string</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">用于指示联盟站点在发送登录请求和认证站点进行请求验证的时候来源网址存储位置。</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">UidField</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">string</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">用于指示联盟站点在发送登录请求和认证站点进行请求验证的时候用户信息的存储位置。</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p>还包括两个方法，分别为： </p>
<div style="margin-left: 26pt;">
<table style="border-collapse: collapse;" border="0">
    <colgroup>
    <col style="width: 248px;">
    <col style="width: 284px;"></colgroup>
    <tbody valign="top">
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">方法名</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">含义和作用</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">Add</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">添加新的联盟站点。</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">Validate</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">验证联盟对象是否已经存在</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<h2>3.2功能 </h2>
<p>该接口能在认证中心完成新联盟站点添加操作，添加之前可以验证站点是否存在。 </p>
<h2>3.3 默认实现 </h2>
<p style="margin-left: 22pt;">在SSO组件中，已经实现了一个默认的ISite对象。为DefaultServer/
DefaultSite.cs，它将放置在认证中心根目录下的sites.config文件作为存储介质，通过Add方法添加新联盟站点后的效果为：附件中的site.config文件，可自行下载文件后，看其结构。
</p>
<p>&nbsp;</p>
<p style="margin-left: 22pt;">&nbsp;</p>
<h1>4 IUser接口设计说明 </h1>
<h2>4.1接口描述 </h2>
<p>IUser接口包括2个属性和2个方法，用于在认证中心端描和操作述联盟用户。 </p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/jillzhang/013108_1233_SSO4.png" />
</p>
<p>其中，各个属性的含义如下 </p>
<div style="margin-left: 26pt;">
<table style="border-collapse: collapse;" border="0">
    <colgroup>
    <col style="width: 154px;">
    <col style="width: 189px;">
    <col style="width: 189px;"></colgroup>
    <tbody valign="top">
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">属性名称</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">类型</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">含义</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">Uid</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">string</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">用户编号，是用户的标识</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">Pwd</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">string</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">用户密码</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p>还包括两个方法，分别为： </p>
<div style="margin-left: 26pt;">
<table style="border-collapse: collapse;" border="0">
    <colgroup>
    <col style="width: 248px;">
    <col style="width: 284px;"></colgroup>
    <tbody valign="top">
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">方法名</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">含义和作用</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">Validate</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">验证用户是否存在</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">Register</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">添加新用户</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<h2>4.2功能 </h2>
<p>该接口能在认证中心完成新联用户添加操作，添加之前可以验证用户是否存在。 </p>
<h2>4.3 默认实现 </h2>
<p style="margin-left: 22pt;">在SSO组件中，已经实现了一个默认的IUser对象。为DefaultServer/
DefaultUser.cs，它将放置在认证中心根目录下的users.config文件作为存储介质，通过Register方法添加新联盟用户的效果为：附件中的users.config文件，可自行下载文件后，看其结构。
</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h1>5 IUserLoginList接口设计说明 </h1>
<h2>5.1接口描述 </h2>
<p style="margin-left: 22pt;">IUserLoginList接口包括3个方法，用于在认证中心描述和操作用户登录的站点清单。 </p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/jillzhang/013108_1233_SSO5.png" />
</p>
<p>还包括三个方法，分别为： </p>
<div style="margin-left: 26pt;">
<table style="border-collapse: collapse;" border="0">
    <colgroup>
    <col style="width: 248px;">
    <col style="width: 284px;"></colgroup>
    <tbody valign="top">
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">方法名</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">含义和作用</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">Add</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">验证用户是否存在</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">GetLoginSites</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">获取用户的登录站点清单</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">DeleteUser</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">删除用户的登录站点清单数据</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<h2>5.2功能 </h2>
<p>该接口在认证中心用于用户记录和维护用户登录的站点清单&nbsp;&nbsp;</p>
<h2>5.3 默认实现 </h2>
<p style="margin-left: 22pt;">在SSO组件中，已经实现了一个默认的IUserLoginList对象。为DefaultServer/
UserLoginLog.cs，它通过一个Collection对象来实现用户登录站点清单的维护工作。 </p>
<p style="margin-left: 22pt;">&nbsp;</p>
<p style="margin-left: 22pt;">&nbsp;</p>
<h1>6 IServer接口设计说明 </h1>
<h2>6.1接口描述 </h2>
<p style="margin-left: 22pt;">IServer接口包括2个属性和5个方法，用于接收，验证登录请求，发送登录答复，接搜，验证登出请求，创建本地登录票据，维护用户登录清单。
</p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/jillzhang/013108_1233_SSO6.png" />
</p>
<p>两个属性为： </p>
<div style="margin-left: 26pt;">
<table style="border-collapse: collapse;" border="0">
    <colgroup>
    <col style="width: 154px;">
    <col style="width: 189px;">
    <col style="width: 189px;"></colgroup>
    <tbody valign="top">
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">属性名称</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">类型</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">含义</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">Site</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">ISite</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">当前上下文处理请求和答复的站点对象</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">Uid</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">string</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">当前处理的上下文中的用户编号</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p>&nbsp;</p>
<p>还包括三个方法，分别为： </p>
<div style="margin-left: 26pt;">
<table style="border-collapse: collapse;" border="0">
    <colgroup>
    <col style="width: 248px;">
    <col style="width: 284px;"></colgroup>
    <tbody valign="top">
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">方法名</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">含义和作用</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">CheckUser</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">验证用户对象是否存在</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">CheckExistToken</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">验证登录票据已经存在</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">SaveToken</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">在认证中心本地保存登录票据</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">Jump</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">通过url跳转，发送登录答复</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">LogOut</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">统一登出。</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<h2>6.2功能 </h2>
<p style="margin-left: 22pt;">该接口在认证中心，用于接收，验证登录请求，发送登录答复，接搜，验证登出请求，创建本地登录票据，维护用户登录清单
</p>
<h2>6.3 默认实现 </h2>
<p style="margin-left: 22pt;">在SSO组件中，已经实现了一个默认的IServer对象。为DefaultServer/
LoginRequest.cs。 </p>
<p style="margin-left: 22pt;">&nbsp;</p>
<p style="margin-left: 22pt;">&nbsp;</p>
<h1>7 ILoginRequest接口设计说明 </h1>
<h2>7.1接口描述 </h2>
<p style="margin-left: 22pt;">ILoginRequest接口包括2个属性，用于记录和描述联盟站点的登录请求，这些信息在发出登录请求的时候创建，在收到登录答复的时候销毁。用于确保登录答复的不可复用性。
</p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/jillzhang/013108_1233_SSO7.png" />
</p>
<p>两个属性为： </p>
<div style="margin-left: 26pt;">
<table style="border-collapse: collapse;" border="0">
    <colgroup>
    <col style="width: 154px;">
    <col style="width: 189px;">
    <col style="width: 189px;"></colgroup>
    <tbody valign="top">
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">属性名称</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">类型</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">含义</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">Identity</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">string</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">登录请求标志符，该标志符会发送给服务端，服务端在发送登录答复的时候会回传该标志，联盟站点会根据此标志来验证请求是否是伪造的。</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">TimeStamp</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">DateTime</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">请求的时间戳</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<h2>7.2功能 </h2>
<p style="margin-left: 22pt;">该接口在联盟站点，用于记录和描述联盟站点的登录请求，这些信息在发出登录请求的时候创建，在收到登录答复的时候销毁。用于确保登录答复的不可复用性。7.3
默认实现 </p>
<h2>7.3 默认实现 </h2>
<p style="margin-left: 22pt;">在SSO组件中，已经实现了一个默认的ILoginRequest对象。为DefaultServer/
LoginRequest.cs。 </p>
<p style="margin-left: 22pt;">&nbsp;</p>
<h1>8 ILoginRequestContainer接口设计说明 </h1>
<h2>8.1接口描述 </h2>
<p style="margin-left: 22pt;">ILoginRequestContainer接口包括3个方法，用于在联盟站点中记录和维护登录请求
</p>
<p style="margin-left: 22pt;"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/jillzhang/013108_1233_SSO8.png" />
</p>
<p>&nbsp;</p>
<div style="margin-left: 26pt;">
<table style="border-collapse: collapse;" border="0">
    <colgroup>
    <col style="width: 248px;">
    <col style="width: 284px;"></colgroup>
    <tbody valign="top">
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">方法名</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">含义和作用</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">Add</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">添加登录请求信息</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">Check</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">检查登录请求是否存在</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">Remove</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">销毁存在的登录请求</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<h2>8.2功能 </h2>
<p style="margin-left: 22pt;">该接口在联盟站点，用于在联盟站点中记录和维护登录请求 </p>
<h2>8.3 默认实现 </h2>
<p style="margin-left: 22pt;">在SSO组件中，已经实现了一个默认的ILoginRequestContainer对象。为DefaultServer/
LoginRequestContainer.cs。 </p>
<p style="margin-left: 22pt;">&nbsp;</p>
<h1>9 IUserStateContainer接口设计说明 </h1>
<h2>9.1接口描述 </h2>
<p style="margin-left: 22pt;">IUserStateContainer接口包括5个方法，用于在联盟站点中记录和维护在线联盟用户信息
</p>
<p style="margin-left: 22pt;"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/jillzhang/013108_1233_SSO9.png" />
</p>
<p>&nbsp;</p>
<div style="margin-left: 26pt;">
<table style="border-collapse: collapse;" border="0">
    <colgroup>
    <col style="width: 248px;">
    <col style="width: 284px;"></colgroup>
    <tbody valign="top">
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">方法名</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">含义和作用</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">Add</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">添加登录用户</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">GetList</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">获取在线用户清单</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">Check</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">检查某个用户是否已经在线</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">Remove</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">移除某个在线用户。</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">GetUserCount</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">获取在线用户个数</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<h2>9.2功能 </h2>
<p style="margin-left: 22pt;">该接口在联盟站点，用于在联盟站点中记录和维护在线联盟用户信息 </p>
<h2>9.3 默认实现 </h2>
<p style="margin-left: 22pt;">在SSO组件中，已经实现了一个默认的IUserStateContainer对象。为DefaultServer/
UserState.cs。 <br />
</p>
<h1>&nbsp;</h1>
<h1>&nbsp;</h1>
<h1>10 IClient接口设计说明 </h1>
<h2>10.1接口描述 </h2>
<p style="margin-left: 22pt;">IClient接口包括6个属性和2个方法，用于发出登录请求和登出请求 </p>
<p style="margin-left: 22pt;"><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/jillzhang/013108_1233_SSO10.png" />
</p>
<p>8个属性为： </p>
<div style="margin-left: 26pt;">
<table style="border-collapse: collapse;" border="0">
    <colgroup>
    <col style="width: 154px;">
    <col style="width: 189px;">
    <col style="width: 189px;"></colgroup>
    <tbody valign="top">
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">属性名称</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">类型</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">含义</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">SiteID</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">string</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">站点编号</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">PrivateKey</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">string</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">数据交换时加密或者签名用的公钥</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">LoginAddress</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">string</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">认证中心登录地址</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">LogoutAddress</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">string</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">认证中心登出地址</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">Uid</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">string</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">登录的用户编号</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">TimeOut</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">int</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">登录答复的超时时间，单位s</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">UidField</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">string</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">登录登出请求中的用户信息的存储位置</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">FromUrlField</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">string</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">登录请求中的来源网址存储位置</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p>2个方法为 </p>
<div style="margin-left: 26pt;">
<table style="border-collapse: collapse;" border="0">
    <colgroup>
    <col style="width: 248px;">
    <col style="width: 284px;"></colgroup>
    <tbody valign="top">
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">方法名</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">含义和作用</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">Login</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">发出登录请求，并处理登录答复</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">LogOut</span></p>
            </td>
            <td style="padding-right: 7px; padding-left: 7px;">
            <p><span style="font-size: 10pt;">登出</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<h2>10.2功能 </h2>
<p style="margin-left: 22pt;">该接口在联盟站点，用于发出登录请求和登出请求 </p>
<h2>10.3 默认实现 </h2>
<p style="margin-left: 22pt;">在SSO组件中，已经实现了一个默认的IClient对象。为DefaultServer/
DefaultClient.cs </p>
<p style="margin-left: 22pt;">&nbsp;</p>
<h1>11 本系统的安全性 </h1>
<h2>11.1 登录请求的格式 </h2>
<p>联盟站点向认证中心发送的登录请求格式如下： </p>
<p>站点信息+登录请求编号+时间戳+空用户信息+对站点信息和登录清秋号的签名信息。<br />
除了签名信息之外的全部信息均为明文传送，但因为重要的数据均经过数字签名，结果是站点信息和登录请求编号是不能被篡改的，保证了认证中心收到的登录请求的真实性。
</p>
<h2>11.2 登录答复的格式 </h2>
<p>认证中心发给联盟站点的登录答复格式如下 </p>
<p>登录用户信息+登录请求编号+时间戳+对用户信息和登录请求号和时间戳的签名信息<br />
其中登录用户信息是经过非对称加密的。请求号和时间戳因为经过签名，故也不能篡改，这样就可以保证联盟站点收到的登录答复的真实性和完整性。并且非正常联盟站点无法解密用户信息，也无法从中获取好处。&nbsp;&nbsp;</p>
<p><strong>篇幅太大，下面还有很长的内容要说，先发布以下，感兴趣的朋友可以先下载程序尝试使用。以后，我会逐渐添加Sql 和
Oracle的实现。您也可以根据接口规范，开发符合自己系统需求的SSO系统，今天先到这吧<br />
<br />
程序文件：<a href="/Files/jillzhang/SSO.rar">/Files/jillzhang/SSO.rar</a><br />
</strong></p>
<p><br />
<span style="color: red;"><strong style="font-size: 18pt; font-family: 微软雅黑;">更新：新增登录流程图：<br />
<br />
</strong></span><a class="postTitle2" id="AjaxHolder_ctl01_TitleUrl" href="http://www.cnblogs.com/jillzhang/archive/2008/02/01/1061212.html">[原创]单点登陆(SSO)组件的设计与实现二-登录流程图</a>&nbsp;<br />
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/jillzhang/sso_login2.jpg" border="0" height="150" width="160" /></p>
<br />
<p><br />
</p>
<br />
<p><br />
</p>
<br />
<p><br />
</p>
<p><br />
<span style="color: red;">新增登出流程图 2008-02-02</span><br />
<br />
<img alt="" src="http://www.blogjava.net/images/cnblogs_com/jillzhang/sso_login2.jpg" border="0" height="796" width="781" /><br />
<br />
上面是整体流程图，这个SSO组件在安全上有了很充分的考虑，可以说是非常安全，那么下面看看登录请求数据的格式，和为何它能保证真实性和完整性<br />
<br />
<img alt="" src="http://www.blogjava.net/images/cnblogs_com/jillzhang/sso_loginrequest4.jpg" border="0" height="812" width="730" /><br />
<br />
这样，当数据在传输过程中，如果站点编号，用户编号，请求号任意一项做任何的修改，当认证中心接收到数据之后，均无法与签名信息进行匹配。凡是认证中心能验证通过的请求均为合法的，真实的，完整的请求信息。<br />
<br />
登录答复的格式如下图所示<br />
<img alt="" src="http://www.blogjava.net/images/cnblogs_com/jillzhang/sso_loginresponse3.jpg" border="0" height="861" width="726" /><br />
因为登录号，时间戳，用户信息均加入数字签名信息，所以这些数据在传输中不能被伪造和篡改，而用户信息经过非对称性加密，也防止非真正请求发送者能解析出用户信息，这样在接受和发送请求和响应的时候，就实现了绝对的安全。<br />
当然不是没有破绽，破绽在于当请求答复未到达联盟站点之前，有人截获并先于正常用户登录了联盟站点，此时我们可以将用户的ip信息作为答复数据的一部分，加入签名，以此实现很高的安全保证<br />
<br />
登出流程图<br />
<img alt="" src="http://www.blogjava.net/images/cnblogs_com/jillzhang/sso_logout.jpg" border="0" height="820" width="720" /> <br />
</p>
<br />
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/184540.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2008-03-07 16:36 <a href="http://www.blogjava.net/jinfeng_wang/archive/2008/03/07/184540.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>大嘴日语的破解</title><link>http://www.blogjava.net/jinfeng_wang/archive/2007/04/10/109767.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Tue, 10 Apr 2007 14:58:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2007/04/10/109767.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/109767.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2007/04/10/109767.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/109767.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/109767.html</trackback:ping><description><![CDATA[<p>&nbsp;<br>最近想要一个背单词的软件<br><br>自己做一个容易，词库比较麻烦。<br><br>在网上找啊找，都没啥特别好用的<br><br>后来就盯上了《大嘴日语》<br><br>从大嘴2.0开始，就没有破解版可以下载<br>（自己也是做软件的，还想破解别人的免费用，sigh）<br><br>下了个最新的6.0 和可以破解的2.0<br><br>来回把词库拷贝，居然发现大嘴用的的DBISAM文件数据库<br><br>不厚道的找东西，破解<br><br>不厚道的来回倒腾数据，现在词库已经在我的Access中了。<br><br>对于我来说，数据才是重要的。<br>TTS，其他功能，都是可以做出来的。<br><br>软件的漏洞到底在哪儿？<br><br>怎么确保软件没有漏洞？<br><br>大嘴从2.0到7.0，做足了加密功夫，一直没有破解版流出，<br><br>竟然还有这么大的一个后门。<br><br>不得不值得好好的思量一番周边软件的质量。<br><br>参见：<a href="http://www.blogjava.net/jinfeng_wang/archive/2007/02/14/99819.html">http://www.blogjava.net/jinfeng_wang/archive/2007/02/14/99819.html</a><br><br>btw: 个人研究，不算盗版吧 ^_^<br></p>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/109767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2007-04-10 22:58 <a href="http://www.blogjava.net/jinfeng_wang/archive/2007/04/10/109767.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>人员、资源、操作及这三者构成的权限控制</title><link>http://www.blogjava.net/jinfeng_wang/archive/2007/02/14/99819.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Wed, 14 Feb 2007 06:53:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2007/02/14/99819.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/99819.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2007/02/14/99819.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/99819.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/99819.html</trackback:ping><description><![CDATA[Web系统因为是面向Internet/Intranet的，所以其安全性比常规的应用程序系统更难以保证。<br /><br />在谈到其安全性的时候，很多的都是从“网络安全”的角度去看待问题，殊不知，堡垒<br />的内部是最最不安全的。对付“黑客攻击”是系统管理员所要面对的问题，而如何更好的<br />加强堡垒内部自身的安全，是在Web程序的设计中就需要考虑的问题。<br /><br />系统管理员所要面对的网络攻击、操作系统 安全不是我所考虑的问题，如何加强Web系统<br />自身的健康是我所最最关心的事情。 <br /><br />从“构造URL”攻击到“注入SQL文”攻击，都是属于过分信任用户输入，而造成的安全问题。<br />这恰恰应该是由应用程序自身加以重视、解决的问题。<br /><br />基于角色的安全控制已经逐渐的被大家逐渐的接受，每个用户被分配为不同的角色，不同的角色<br />具有不同的操作权限。 但是如何划分角色、用户、操作权限，则是需要认真对待的问题。<br /><br />举例：<br />一个MIS系统中，员工有查询工资的权限，但是某个员工是否具有查询其他员工的权限呢？<br /><br />不能深入的追问问题，详细的分辨清楚系统中到底有多少角色、每个用户所在的角色，是不能完成安全控制的。<br /><br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000"><br /><font color="#0000ff" size="5"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />btw: 以上的问题，大家不妨在自己的类似系统中自己去检查一下，有此问题的占绝大多数吧。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />看过此文的，愿意回答“是”“否”的，可以留言， 也当作一个调查吧。</font><br /></span></div><br /><br />上面的这个例子，就是一个很成熟的办公系统中存在的问题。使用客户端script脚本，控制了用户的界面操作，殊不知maxthon就可以解除这个限制。此系统中，用户的请求都被整理为URL（get方式提交），虽然URL中的键值含义并不是很明显，但是还是可以尝试着去攻击，获取秘密。<br /><br />认真的核查用户的输入，利用AOP部署，细密的对用户的输入进行核查，是很有必要的事情。<br /><br />某个人、某个资源、某个操作，这三个要素组织在一起则是：某个人对某个资源进行某项操作<br />实际情况下，许多人、许多资源、对每个资源冰存在着多个操作。<br /><br />将人、资源、操作进行划分，可以得到：<br />具体的某一类人，可以对某些资源，进行某些的操作＝》 这就是具体的某项权限限制。<br />    某一类人，则可以归纳为角色。<br />    对某些资源的某些操作，则可以归纳为工作任务。<br />也就是说，整个系统是“某个角色去完成某些工作任务，而具体的一个帐户属于某个角色，某项工作则具体的是指对某个资源进行某个操作”。<br /><br />相对来说，系统中的人员是最容易辨认的，系统中的资源也是可以在系统的功能调查时分清楚的，系统中的操作则是最复杂、最难分清晰，甚至在系统完成时都会变化的。<br /><br />只有分辨清楚了系统中的人、资源、操作，才能辨别清楚系统中的具体的权限限制。<br /><br />“基于角色的安全控制”这样的提法，只提及了人，未能强调将资源、操作进行规类，这是很不充分的一种提法。<br /><br />在Web系统中，系统在设计的过程中，就分清楚资源，分清楚操作，极大缩小每个页面的功能、提高页面功能的原子性，这也是权限控制对系统设计提出的一项要求。<br /><br />前面提及使用AOP进行权限控制，现在简述一下各部件的功能：<br />   业务模块－－完成具体的对某个资源的操作；<br />   前台页面模块－－ 完成整体页面的整合；<br />   安全控制模块－－实现安全控制功能，完成人员、角色、工作的逻辑判断；<br />   AOP配置整合模块－－粘合安全控制模块和业务模块；<br /><br /><br />在于如何去解决，而是如何去发现。隐藏起来的问题更是危险。<br /><br />而如何发现问题，则完全是一个素质、能力的事情，也许这是下一个话题。<br /><img src ="http://www.blogjava.net/jinfeng_wang/aggbug/99819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2007-02-14 14:53 <a href="http://www.blogjava.net/jinfeng_wang/archive/2007/02/14/99819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>buying  notbook</title><link>http://www.blogjava.net/jinfeng_wang/archive/2007/02/02/97420.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Fri, 02 Feb 2007 01:21:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2007/02/02/97420.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/97420.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2007/02/02/97420.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/97420.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/97420.html</trackback:ping><description><![CDATA[标  题: 中海购T40手记<br />发信站: 水木社区 (Fri Feb  2 00:30:29 2007), 站内<br /><br />本来看中的是nc6000,觉得性价比不错，但是昨天mm转了一圈之后，就定在了T40上<br /><br />中午11点半从东门出发，骑车<br />先去北大南门吃饭，不表<br />到太平洋买了一块三星银盘+盘盒：470 + 50 = 520<br />将近1点了，：）<br /><br />中海小传一圈，回到580柜台，T40摆了好几台，分两种<br />一种就是迅驰1.5G/512M/40G/DVD/ATI 7500 32M/   3800<br />另外一种多了蓝牙、无线，光驱是DVD-CDRW  4000<br />同时问了nc6000的价格，高分才3500<br /><br />蓝牙没用，CDRW也没用，就是奇怪为什么迅驰还不带无线网卡<br />加网卡还要另收50，讲价未果，于是不要网卡了，反正暂时用不到<br /><br />开始挑机器，只摆了4台第一种机器<br />让老板再拿出几台，被告知只有这几台，感觉必然说谎阿<br />没办法，埋头挑<br /><br />先看屏幕，把亮度都调到最高，开始对比<br />有一台的屏幕很亮，但是用手按水波纹很严重<br />还有一台屏幕发黄，直接淘汰<br />最后选了一台水波纹不是很明显的，但是显示的颜色不是很鲜艳，没有第一台的颜色正，显得有点灰灰的<br /><br />键盘都不错，不油<br /><br />继续，因为赶时间回实验室有事，很多没很仔细测<br />ntest看屏，没看出什么问题，也许是自己太菜吧<br />erest看配置，符合<br />cpu-z看cpu和内存，发现两条内存牌子不一样，一个英飞铃，一个金士顿，让老板给换成一样的，于是老板把另外一个机器拆开，找到一条英飞铃，给我按上。在另外一台机器上看内存，发现竟然还有现代的。<br />super-pi计算100万，用了1分04秒，另外一台用了1分39秒。测了3200位的，初始化用了39秒，没继续，回来也没全测完，明天测一下<br />mentest测内存，测了200%多<br />hdtune测硬盘，没问题<br /><br />试了一下光驱，发现读CD的时候还很安静，但是读DVD（找了一个划的比较厉害的）的时候风扇就响的利害了，没办法，说风扇没法换，我也不懂，忍了<br /><br />看电池，只有两台机器有电池，于是到带蓝牙的机器上拿了一块用过25次的，可是健康状况显示差。不懂。那掉电源显示还能用1小时，另外一个用过118次，将看情况显示良好，但是显示只能用44分钟。拿了第一块<br /><br />这里发现一个问题，拔掉电源屏幕会闪，而且每个机器都是这样，不知道会有什么隐患。不爽的是我挑的这台屏幕黑的时间比别的长，大牛给分析一下。<br /><br />又看了看bios，对比了一下序列号，没啥问题。别的也不知道看啥了<br /><br />关机，换上80G的硬盘，把40G的换到移动硬盘盒里<br />看了一下机器外观，发现上盖上有条划痕，我忍<br />让老板给擦了擦机器<br />送一个包，好烂<br />一个IBM小鼠<br /><br />说声谢谢，然后走人，被叫回来，忘了给钱了，：）<br /><br />回来测了3DMARK，4004分<br />大牛说说，我还需要做些什么测试？机器可能有些什么问题？<br />争取3天内解决出现的问题。<br /><br />over<br />菜鸟第一次在中海买东西，多谢一勺等大牛的帖子指导<br />欢迎点评<br /><br /><br />＝＝＝＝＝＝＝＝＝＝<br />sp2004使劲跑一晚上<br /><br /><img src ="http://www.blogjava.net/jinfeng_wang/aggbug/97420.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2007-02-02 09:21 <a href="http://www.blogjava.net/jinfeng_wang/archive/2007/02/02/97420.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MindManager6使用体会</title><link>http://www.blogjava.net/jinfeng_wang/archive/2007/01/27/96267.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Sat, 27 Jan 2007 05:45:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2007/01/27/96267.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/96267.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2007/01/27/96267.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/96267.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/96267.html</trackback:ping><description><![CDATA[过年放假的一个好处就是，终于可以比较悠闲的靠在床上，随便想想该写些什么。
<p>　　在这篇<a href="http://herock.net/archives/000161.html">MindManager的免费阅读器</a>后面，<a href="http://blog.94smart.com/">94smart</a>等朋友热情怂恿我写一篇教程，今天准备试着写一点儿，不过不能算是教程，只是浮光掠影，介绍一下在使用中曾给我带来惊喜的几个亮点而已。</p><p>　　一直希望有一个电子化的工具能够方便、形象的整理头脑中漫无边际的杂乱想法，就像铅笔和白纸能够做到的那样，但是又能避免写满东西的白纸不易传播和保存的缺点。</p><p>　　最初通过一些<a href="http://www.outgo.cn/blogview.asp?logid=16">介绍文章</a>，看到了<a href="http://freemind.sourceforge.net/wiki/index.php/Main_Page">FreeMind</a>，著名的开源free思维管理工具，优势是明显的，比如： 
</p><ol><li>跨平台。除了Windows之外，也提供了Mac OS X、Linux等版本，实际上，它支持所有的操作系统。<br /></li><li>免费使用。不需要任何破解和注册码之类，可以心安理得的不花钱永远使用它。<br /></li><li>功能比较强大，基本的思维导图应该具备的功能都有，也可以发布到web上。<br /></li><li>轻便小巧，但是可定制程度依然很好，当然这是针对那些动手能力较高的用户而言，对我这样不会写代码的人，这个方面的特性并不在考虑之列。</li></ol><p></p><p>　　使用的时候需要先安装java的运行库，有点麻烦，而且关键是有一些操作方式，个人感觉不太顺手，导致思路频频被打断，被迫开始摸索使用的方法，这样对于一个普通的使用者来说，学习的时间成本便上升了，后来不得不尝试了商业软件－<a href="http://www.mindjet.com/">MindManager</a>，这款软件并不开源，也不能跨平台，只支持Windows这一家系统，但是由于很好的迎合了windows软件的操作方式，大大降低了熟稔windows软件用户的学习成本，更和office系列软件做到了紧密整合，数据在其中流动非常顺畅。</p><p>　　第一个令我激动的MindManager应用就是Web2.0周刊的制作，我当时的需要就是每天用最简单的方法收集相关信息，包含链接、笔记或评论、分类等信息，在周末的时候统一整理一下，直接输出相应的html页面，可以上传到服务器上供访问，MindManager刚好可以近乎完美的实现，（<a href="http://web2week.com/magazine/4-sep4-10/">这里</a>可以看到实际效果）我只需要自己写一下css，用来保证最终的html页面以我想要的样式呈现，其它的html代码，就无需我操心，全部由MindManager代劳了。想尝试一下这个功能的话，可以在"File"--"Export"--"Save as Webpages..."中找到。</p><p><img src="http://www.mindjet.com/images/eng/homepage_header.gif" /></p><p>　　实际上无需什么教程，安装完MindManager之后，“help”和"Learning Center"都是非常棒的使用教程，而且后者还是直观的视频模式，快速浏览一下，就可以对MindManager这款软件有大致的了解了。</p><p>　　在“Learn More”中的“提示和技巧”使用了MindManager的格式来展示，很有意思，在这里可以学到“生成图片格式”、“格式编排”、“浏览导图”、“编辑技巧”等方面的知识。</p><p>　　MindManager6分为基础版和专业版，两个版本共有的一些新特性包括： 
</p><ol><li>大纲编辑模式。"view"--"outline"<br /></li><li>制表制图。"topic"--"Spreadsheet"<br /></li><li>组织结构图布局，可用来展示团队和公司的组织结构。"format"--"topic..."之后选择"Subtopics Layout"的标签，然后选择"Org-Chart"<br /></li><li>输出到powerpoint。"format"--之后选择"Microsoft PowerPoint Slides..."<br /></li><li>从IE导入。如果使用IE的话，可以通过点击工具栏的按钮添加某个网页的标题和链接到MindManager中自动生成一个topic。<br /></li><li>支持掌上电脑手写笔记及大纲。"topic"--"notes"以及"view"--"outline"<br /></li><li>分类线，可以把同类的topics用一条线划到一起，以示区别。<br /></li><li>自动编号。"Format"--"Numberling..."<br /></li><li>自动平衡,可以重新摆放topic的位置，使其看起来更协调。"view"--"balance map"<br /></li><li>note中的拼写检查。"topic"--"notes"<br /></li><li>特别的粘贴。可以选择需要以何种格式粘贴剪贴板中的内容。"edit"--"paste special"</li></ol><p></p><p>　　而只在MindManager6专业版中才有的特性如下： 
</p><ol><li>导出到visio。"format"--"Microsoft Visio Stencils...","File"--"export"--"Microsoft Visio Export"<br /></li><li>链接到excel表格。"insert"--"Microsoft Excel Range..."<br /></li><li>插入附件。"file"--"Add Attachment..."<br /></li><li>超强过滤器。"edit"--"filter"-"power filter"<br /></li><li>超强选择。"edit"--"select"--"power edit"<br /></li><li>自定义属性。"topic"--"Custom Properties..."<br /></li><li>加入书签。"topic"--"bookmark"<br /></li><li>评论模式，可以区分别人所作的评论，并方便的拒绝或者接受。"tools"--"start review"<br /></li><li>闹钟提示。"topic"--"alert..."<br /></li><li>文本记号。希望和你进行对话的使用者可以在你制作到导图上使用文本记号（text marker），标记出他们的意见。"topic"--"test marker"<br /></li><li>记时器。"tools"--"timer"<br /></li><li>标签。"topic"--"label..."</li></ol><p></p><p>　　如果你主要使用Windows系统工作，而且office也始终在你的电脑中占有一席之地，最后，你也不在乎花一些美刀或者勇于想办法不花这些美刀，来得到一个真正强大、全能的思维导图工具的话，选择MindManager pro 6吧，应该不会后悔。</p><img src ="http://www.blogjava.net/jinfeng_wang/aggbug/96267.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2007-01-27 13:45 <a href="http://www.blogjava.net/jinfeng_wang/archive/2007/01/27/96267.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>测试的全路经覆盖</title><link>http://www.blogjava.net/jinfeng_wang/archive/2007/01/05/91877.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Thu, 04 Jan 2007 17:20:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2007/01/05/91877.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/91877.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2007/01/05/91877.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/91877.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/91877.html</trackback:ping><description><![CDATA[
		<p>
				<br />在Junit/Nunit测试出现之后，出现了一个工具Jcover/Ncover,此工具代码覆盖率分析工具，可以分析测试代码的测试范围的覆盖率。<br /><br />第一次知道此工具的时候，相当的兴奋，因为这样可以轻松的把握项目中的测试代码情况。在看到自己的每行代码都被测试之后，相当的幸福啊，再加上Maven等工具可以自动连跑，那是足够保证了单元测试的覆盖率了啊。<br /><br />正是因为不假思索的信任，导致了问题的出现：Cover工具的覆盖，是代码行的覆盖，而不是代码Step的覆盖。所谓的代码行，是指代码中可以被执行到的具体某物理行，但是Step则是指每一步逻辑。对于if (a==b||c==d||e==f)这样的判断，应该是有三个step在其中的。正是由于信任了Cover工具，导致代码覆盖率不够，未能测试到e==f的判断，导致了一个bug在最后才被发现。问题发现的越迟，付出的代价越大。</p>
		<p>上面已经说明了全路径覆盖的含义（目前Cover工具无法达到的功能），那么全路径覆盖是不是很有必要且一定要的呢？答案是“YES”.做到全路径覆盖的测试是很痛苦的一件事情，但是，当你从全路径覆盖中找到重大问题时，才会回头来看“如果我做了全副该测试，这段路径的错误逻辑就不会出现的”。</p>
		<p>就拿上篇"CheckedException VS UncheckedException"中的例子，当代码结构逐渐演化为多出入口调用C模块时，“C处不能决定具体的出错信息”。但是在代码中，如果恰恰就是在"C处误认为可以决定错误消息"时，对于这个“误操作”，就可以通过全路径覆盖发现这个问题。if(a==b||c==d||e==f) {throw new MyException("error msg.")}，这样的一行代码，需要面对三种问题去报出错信息，其负担太重，情况复杂（然后有了错误代码）。</p>
		<p>如果做了全路径覆盖，可以走到（e==f）的判断，此时即可发现错误消息不正确的问题。</p>
		<p>如何才能保证完成全路径覆盖呢？<br />1）手工debug跟踪，保证每一步都走到，对于最后的(e==f)，跟踪的好辛苦阿，创造这样的条件（走到e==f）就好累的。<br />2）利用Ncover的功能，对于这样的复杂逻辑，手工进行debug跟踪。<br />3)拆开代码，为三行（每个step为单独的一行），利用NCover自动分析。 哈，老师教过的"，不允许出现过于复杂的代码"这个原则被发挥到极致了。</p>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/91877.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2007-01-05 01:20 <a href="http://www.blogjava.net/jinfeng_wang/archive/2007/01/05/91877.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>错误处理的恢复</title><link>http://www.blogjava.net/jinfeng_wang/archive/2006/07/10/57571.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Mon, 10 Jul 2006 14:52:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2006/07/10/57571.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/57571.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2006/07/10/57571.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/57571.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/57571.html</trackback:ping><description><![CDATA[错误处理的恢复一直是容易被恢复的问题，<br />一个状态机中，出现错误的时候，一定要及时地修正状态机的状态。<br />上面的一句话可能是很容易理解的一句话，<br />但是在实际运用中，如何去真的体会到状态机的存在，及时进行错误恢复<br />却不是一件很容易能够做到的事情。<br /><br />之所以在“.NET C#中使用Unchecked Exception”，很大的一个原因--“很多时候是用户是没法去做错误修复的”，这真的是很奇怪的一个理由，而且这个理由竟然被很多人相信了。<br /><br />今天才意识到错误处理的恢复是自己没有遇到的一个重要的问题，胆战心惊！<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/57571.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2006-07-10 22:52 <a href="http://www.blogjava.net/jinfeng_wang/archive/2006/07/10/57571.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ADO.NET Connection Status Map</title><link>http://www.blogjava.net/jinfeng_wang/archive/2006/06/03/50173.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Sat, 03 Jun 2006 13:35:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2006/06/03/50173.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/50173.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2006/06/03/50173.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/50173.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/50173.html</trackback:ping><description><![CDATA[
		<img src="http://www.blogjava.net/images/blogjava_net/jinfeng_wang/6626/r_ConnectionStatus.JPG" />
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/50173.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2006-06-03 21:35 <a href="http://www.blogjava.net/jinfeng_wang/archive/2006/06/03/50173.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Checked Exception VS UnChecked Excetion (续2)</title><link>http://www.blogjava.net/jinfeng_wang/archive/2006/06/03/50170.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Sat, 03 Jun 2006 13:22:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2006/06/03/50170.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/50170.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2006/06/03/50170.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/50170.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/50170.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal">
				<span style="font-family: &quot;ＭＳ 明朝&quot;;" lang="ZH-CN">　　</span>
				<span style="font-family: SimSun;" lang="ZH-CN">假设我的团队正在开发一个库程序，由于某种原因，现在希望能够得到所有最外层</span>
				<span style="" lang="EN-US">API</span>
				<span style="font-family: SimSun;" lang="ZH-CN">所抛出的所有异常的类型、各自的信息、并且能够附上各种异常所出现的原因和解决办法。如果开发过程中内部使用的是</span>
				<span style="" lang="EN-US">Unchecked
Exception</span>
				<span style="font-family: SimSun;" lang="ZH-CN">，那么对于这个任务简直就麻烦了。没办法，开发人员一个个的自我进行检查然后统计吧，但是往往这样的统计总会有漏网之鱼。现在的</span>
				<span style="" lang="EN-US">MSDN</span>
				<span style="font-family: SimSun;" lang="ZH-CN">中的异常信息糟糕的很，最底层的公有库的异常信息内容可能完整一点，但是上层的库的异常信息糟糕的不行，根本不能完整的报全所有出错的可能性。</span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-indent: 21pt;">
				<span style="font-family: SimSun;" lang="ZH-CN">你可以想象的出，一个库函数的异常信息不完整，对于他的用户来说，是多么不友好的事情。假设</span>
				<span style="" lang="EN-US">MSDN</span>
				<span style="font-family: SimSun;" lang="ZH-CN">中</span>
				<span style="" lang="EN-US">File.Open()</span>
				<span style="font-family: SimSun;" lang="ZH-CN">会抛出</span>
				<span style="" lang="EN-US">IOException</span>
				<span style="font-family: SimSun;" lang="ZH-CN">，你的程序就很难想到很规矩的对</span>
				<span style="" lang="EN-US">IOException</span>
				<span style="font-family: SimSun;" lang="ZH-CN">做了</span>
				<span style="" lang="EN-US">catch</span>
				<span style="font-family: SimSun;" lang="ZH-CN">，然后提示用户检查相应位置的文件是否存在</span>
				<span style="" lang="EN-US">/</span>
				<span style="font-family: SimSun;" lang="ZH-CN">被打开等。别指望</span>
				<span style="" lang="EN-US">MSDN</span>
				<span style="font-family: SimSun;" lang="ZH-CN">的那些信息能够对终端用户有多大的帮助，太多不懂计算机的人在傻呆呆的握着鼠标了。再加上</span>
				<span style="" lang="EN-US">MicroSoft</span>
				<span style="font-family: SimSun;" lang="ZH-CN">的提示信息本身就存在着“答非所问”，“莫名其妙”的事情，用户看到这些情况就更不知道怎么解决问题了。再加上自己的应用程序中会弹出一个个“蹩脚”的运行时错误的错误框，真的不是一个很如意的创作。</span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal">
				<span style="" lang="EN-US">
						<span style=""> </span>
						<span style=""> </span>
						<span style=""> </span>
						<span style=""> </span>
				</span>
				<span style="font-family: SimSun;" lang="ZH-CN">但是，如果使用的是</span>
				<span style="" lang="EN-US">Checked Exception</span>
				<span style="font-family: SimSun;" lang="ZH-CN">，这时候编译器会强迫你的外部接口的异常相当的完整，最起码可以做到比</span>
				<span style="" lang="EN-US">MSDN</span>
				<span style="font-family: SimSun;" lang="ZH-CN">的异常类型齐整。</span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal">
				<span style="" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal">
				<span style="" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal">
				<span style="" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal">
				<span style="" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/50170.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2006-06-03 21:22 <a href="http://www.blogjava.net/jinfeng_wang/archive/2006/06/03/50170.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库驱动程序的测试需要注意的问题</title><link>http://www.blogjava.net/jinfeng_wang/archive/2006/05/28/48597.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Sun, 28 May 2006 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2006/05/28/48597.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/48597.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2006/05/28/48597.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/48597.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/48597.html</trackback:ping><description><![CDATA[
		<div>
				<font face="MS UI Gothic" size="2">
						<font color="#ff0000">1. 不要用TestCase的构造函数初始化Fixture，而要用<br />setUp()和tearDown()方法。</font>
				</font>
		</div>
		<div>
				<font face="MS UI Gothic" size="2">
						<font color="#ff0000">
								<br />
						</font>2. 不要依赖或假定测试运行的顺序，因为JUnit利用<br />Vector保存测试方法。所以不同的平台会按不同的<br />顺序从Vector中取出测试方法。 <br /><br /><font color="#ff0000"></font></font>
		</div>
		<div>
				<font face="MS UI Gothic" size="2">
						<font color="#ff0000">3. 避免编写有副作用的TestCase。例如：如果随后的<br />测试依赖于某些特定的交易数据，就不要提交交易数<br />据。简单的会滚就可以了。</font>
						<br />
				</font>
		</div>
		<div>
				<font face="MS UI Gothic" size="2">
						<font color="#ff0000">
								<br />  对于我们来说，有时是必须要提交，以至于有副作用的。</font>
				</font>
		</div>
		<div>
				<font face="MS UI Gothic" color="#ff0000" size="2">  例如：在执行“插入“后，数据库显然会多出一条数<br />据来。那么必须在随后每个测试自己消除自己的副<br />作用。</font>
		</div>
		<div>
				<font face="MS UI Gothic" color="#ff0000" size="2">  在这里，就是自己“再删除刚插入的数据”。（这时候<br />需要考虑到这个善后的工作不能自己就不能有副作用，</font>
		</div>
		<div>
				<font face="MS UI Gothic" color="#ff0000" size="2">  删除多了其他的数据）。</font>
		</div>
		<div>
				<font face="MS UI Gothic" color="#ff0000" size="2">
				</font> </div>
		<div>
				<font face="MS UI Gothic" color="#ff0000" size="2">  这里的副作用还指“影响到周围环境”，因为我们现<br />在工作的人比较多，所以最好大家的测试服务器能够<br />分开来，</font>
		</div>
		<div>
				<font face="MS UI Gothic" color="#ff0000" size="2"> 例如一个人一个Database实例（可以建得稍微小一<br />点）或者一个人一个数据库，</font>
				<font face="MS UI Gothic" color="#ff0000" size="2">  注意将这些个人之间<br />有区别的内容用常量在每个人自己的所有程序中公<br />用。而不是分布在各个位置。</font>
				<font face="MS UI Gothic" color="#ff0000" size="2">  否则以后要改换测试<br />服务器，所有的程序都需要改动。</font>
		</div>
		<div>
				<font face="MS UI Gothic" color="#ff0000" size="2">
				</font> </div>
		<div>
				<font face="MS UI Gothic" color="#ff0000" size="2">  为了保证测试程序能够很容易的到处执行，请保证<br />大家的数据库服务器的测试数据全部一致。</font>
				<font face="MS UI Gothic" color="#ff0000" size="2"> 否则，<br />就不能做到很容易得拿到FJ也可以很容易的运行，<br />所以需要准备“测试数据集“。</font>
				<font face="MS UI Gothic" color="#ff0000" size="2">包括：Schema ,table ，<br />stored procedure等数据库对象的结构一致，</font>
				<font face="MS UI Gothic" color="#ff0000" size="2"> 还包<br />括数据库的数据内容保持一致。</font>
		</div>
		<font face="MS UI Gothic" size="2">
				<div>
						<br />4. 当继承一个测试类时，记得调用父类的setUp()和<br />tearDown()方法。 </div>
				<div>
						<br />5. 将测试代码和工作代码放在一起，一边同步编译<br />和更新。（使用Ant中有支持junit的task.） </div>
				<div>
						<br />6. 测试类和测试方法应该有一致的命名方案。如在<br />工作类名前加上test从而形成测试类名。 </div>
				<div>
						<font color="#ff0000">可能这里我们需要改动，将函数名和我们的测试用<br />例的编号一致起来。</font>
				</div>
				<div>
						<br />7. 确保测试与时间无关，不要依赖使用过期的数据<br />进行测试。导致在随后的维护过程中很难重现测试。 </div>
				<div>
						<br />8. 如果你编写的软件面向国际市场，编写测试时要<br />考虑国际化的因素。不要仅用母语的Locale进行测试。 </div>
				<div>
						<br />9. 尽可能地利用JUnit提供地assert/fail方法以及<br />异常处理的方法，可以使代码更为简洁。 </div>
				<div> </div>
				<div>
						<font color="#ff0000">这个内容有其关键，assert语句的好坏直接影响<br />到测试的正确性。</font>
						<font color="#ff0000">因为assert就是用于当前测试<br />项的正确性的。</font>
				</div>
				<div>
						<br />10.测试要尽可能地小，执行速度快。 <br /><br /><br />==========<br />1）将所有的数据库的测试数据用ODBC程序自动<br />生成的。 <font face="MS UI Gothic" size="2">用户可以简单的</font><font face="MS UI Gothic" size="2">修改ConnectionString，<br />然后运行程序，就可以创建生成数</font><font face="MS UI Gothic" size="2">据库/数据库<br />表/存储结构</font><font face="MS UI Gothic" size="2">，并且自动插入数据。<br /></font><div><font face="MS UI Gothic" size="2"></font> </div><div><font face="MS UI Gothic" size="2">   2）为了保证多个测试人员的不干扰，建议分别<br />各自单独使用自己的数据</font><font face="MS UI Gothic" size="2">库。否则会因为一个自<br />己的错误，影响别人的工作。</font></div><div><font face="MS UI Gothic" size="2"></font> </div><div><font face="MS UI Gothic" size="2">   3）在自己的程序中，所有涉及环境的内容都用<br />单独放到一个类中，用static</font><font face="MS UI Gothic" size="2">常量共享使用（这样<br />就便于很容易的更换环境再进行测试，做到很容<br />易的移植</font><font face="MS UI Gothic" size="2">测试环境）。</font></div><div><font face="MS UI Gothic" size="2"></font> </div><div><font face="MS UI Gothic" size="2">   4）关于数据库表结构，我建议测试表中含有一<br />个主键，我们在插入数据的时</font><font face="MS UI Gothic" size="2">候，保证测试用例，<br />测试用例程序，测试用例程序中的数据，这三者<br />的编号一</font><font face="MS UI Gothic" size="2">致起来。便于出现问题时，可以排除数据。</font></div></div>
		</font>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/48597.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2006-05-28 15:52 <a href="http://www.blogjava.net/jinfeng_wang/archive/2006/05/28/48597.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Checked Exception VS UnChecked Excetion (续)</title><link>http://www.blogjava.net/jinfeng_wang/archive/2006/05/12/45911.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Fri, 12 May 2006 12:21:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2006/05/12/45911.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/45911.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2006/05/12/45911.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/45911.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/45911.html</trackback:ping><description><![CDATA[
		<p>上篇：<a href="/jinfeng_wang/archive/2006/05/11/45726.html">http://www.blogjava.net/jinfeng_wang/archive/2006/05/11/45726.html</a><br /><br />先来回复两个回帖：<br />"你可以把IO等异常转化成你类库中中定义的异常。当然你定义的异常是Checked Exception 还是 UnChecked Excetion 那你自己定了。 "<br /><br />假设我按照这条建议去做了，那么我可以抛出XXXLibException。假设我的异常采用的是CheckedException，那么客户程序员可以捕捉它。但是对于不同的出错原因（例如不同的原因，包括无权限、硬盘满、U盘被拔了等等，导致无法正常写日志文件），程序都是捕捉XXXLibException，那么客户程序员就无法根据不同的异常去做相应的处理（例如提示用户修改权限、直接启用备用目录，直接退出程序）。总之，如果异常类型不同，客户程序可以根据“异常类型”做不同的工作（编译器＋工具可以实现自动代码生成）；但是如果全部合并为一个异常，那么客户程序只能根据“ExceptionMessage”尝试着做不同的工作（恰恰目前没有办法完成自动编码）。<br /><br /><br /><br />"要知道 JDK 的 FileWriter 是可以抛出 IOException 的子类的，只要文档足够详细，Java代码中也可以只去捕捉更明细的异常， 也可以就捕捉并重新抛出包装过的异常（甚至是RuntimException），除非呆板地去捕获每个异常，不然代码怎么会丑陋呢？"<br /><br />RuntiomeException，也就是UncheckedException（类于.NET的Exception），它不会要求客户代码强行捕捉异常，据此我写了下面的一个程序：<br />private void button1_Click(object sender, System.EventArgs e)<br />  {<br />   throw new Exception("s");<br />  }<br />     我只试了.NET的程序，出现的界面大家自己试 。因为UncheckedException没有要求客户程序去捕捉（客户程序员不能自觉的发现库中抛出的各种异常），让最终用户直接面对这样的异常，是一个道德的事情么？<br /></p>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/45911.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2006-05-12 20:21 <a href="http://www.blogjava.net/jinfeng_wang/archive/2006/05/12/45911.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Checked Exception  VS UnChecked  Excetion</title><link>http://www.blogjava.net/jinfeng_wang/archive/2006/05/11/45726.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Thu, 11 May 2006 13:18:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2006/05/11/45726.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/45726.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2006/05/11/45726.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/45726.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/45726.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b>
						<span lang="EN-US">1</span>
				</b>
				<b>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span>
						<span lang="EN-US">.NET Framework IO Interface<span style="mso-spacerun: yes">  </span>and<span style="mso-spacerun: yes">  </span>JDK IO Interface<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b>
						<span lang="EN-US">1.1</span>
				</b>
				<b>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">．</span>
						<span lang="EN-US">.NET Framework 1.1<o:p></o:p></span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">   </span>public StreamWriter(<span style="mso-spacerun: yes">    </span>string path<span style="mso-spacerun: yes">  </span>);</span>
		</p>
		<h4 style="MARGIN: 12pt 0cm 4.8pt -13.5pt">
				<span style="FONT-SIZE: 8pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">异常</span>
				<span lang="EN-US" style="FONT-SIZE: 8pt">
						<o:p>
						</o:p>
				</span>
		</h4>
		<p>
		</p>
		<table style="BORDER-RIGHT: #999999 0.75pt solid; BORDER-TOP: #999999 0.75pt solid; BACKGROUND: #999999; BORDER-LEFT: #999999 0.25pt solid; WIDTH: 105.8%; BORDER-BOTTOM: #999999 0.25pt solid; mso-cellspacing: 0cm" cellspacing="0" cellpadding="0" width="105%" bgcolor="#999999" border="1">
				<tbody>
						<tr style="HEIGHT: 19.3pt">
								<td style="BORDER-RIGHT: #999999; PADDING-RIGHT: 0.75pt; BORDER-TOP: #999999; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #999999; WIDTH: 38.9%; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #999999; HEIGHT: 19.3pt; BACKGROUND-COLOR: transparent" valign="top" width="38%">
										<p class="MsoNormal" style="MARGIN: 7.2pt 0cm 3.6pt; TEXT-ALIGN: center" align="center">
												<b>
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">异常类型</span>
												</b>
												<b>
														<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana">
																<o:p>
																</o:p>
														</span>
												</b>
										</p>
								</td>
								<td style="BORDER-RIGHT: #999999; PADDING-RIGHT: 0.75pt; BORDER-TOP: #999999; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #999999; WIDTH: 61.1%; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #999999; HEIGHT: 19.3pt; BACKGROUND-COLOR: transparent" valign="top" width="61%">
										<p class="MsoNormal" style="MARGIN: 7.2pt 0cm 3.6pt; TEXT-ALIGN: center" align="center">
												<b>
														<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">条件</span>
												</b>
												<b>
														<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana">
																<o:p>
																</o:p>
														</span>
												</b>
										</p>
								</td>
						</tr>
						<tr style="HEIGHT: 13.35pt">
								<td style="BORDER-RIGHT: #999999; PADDING-RIGHT: 0.75pt; BORDER-TOP: #999999; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #999999; WIDTH: 38.9%; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #999999; HEIGHT: 13.35pt; BACKGROUND-COLOR: transparent" valign="top" width="38%">
										<p class="MsoNormal" style="MARGIN: 7.2pt 0cm 3.6pt">
												<span lang="EN-US" style="FONT-FAMILY: Verdana">
														<a href="http://msdn.microsoft.com/library/CHS/cpref/html/frlrfsystemunauthorizedaccessexceptionclasstopic.asp">UnauthorizedAccessException</a>
												</span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: #999999; PADDING-RIGHT: 0.75pt; BORDER-TOP: #999999; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #999999; WIDTH: 61.1%; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #999999; HEIGHT: 13.35pt; BACKGROUND-COLOR: transparent" valign="top" width="61%">
										<p class="MsoNormal" style="MARGIN: 7.2pt 0cm 3.6pt">
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">访问被拒绝。</span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
						</tr>
						<tr style="HEIGHT: 15.15pt">
								<td style="BORDER-RIGHT: #999999; PADDING-RIGHT: 0.75pt; BORDER-TOP: #999999; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #999999; WIDTH: 38.9%; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #999999; HEIGHT: 15.15pt; BACKGROUND-COLOR: transparent" valign="top" width="38%">
										<p class="MsoNormal" style="MARGIN: 7.2pt 0cm 3.6pt">
												<span lang="EN-US" style="FONT-FAMILY: Verdana">
														<a href="http://msdn.microsoft.com/library/CHS/cpref/html/frlrfsystemargumentexceptionclasstopic.asp">ArgumentException</a>
												</span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: #999999; PADDING-RIGHT: 0.75pt; BORDER-TOP: #999999; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #999999; WIDTH: 61.1%; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #999999; HEIGHT: 15.15pt; BACKGROUND-COLOR: transparent" valign="top" width="61%">
										<p class="MsoNormal" style="MARGIN: 7.2pt 0cm 3.6pt">
												<i>
														<span lang="EN-US" style="FONT-FAMILY: Verdana">path</span>
												</i>
												<span lang="EN-US" style="FONT-FAMILY: Verdana">
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">为空字符串</span>
												<span lang="EN-US" style="FONT-FAMILY: Verdana">("")</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">。</span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="BORDER-RIGHT: #999999; PADDING-RIGHT: 0.75pt; BORDER-TOP: #999999; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #999999; WIDTH: 38.9%; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #999999; BACKGROUND-COLOR: transparent" valign="top" width="38%">
										<p class="MsoNormal" style="MARGIN: 7.2pt 0cm 3.6pt">
												<span lang="EN-US" style="FONT-FAMILY: Verdana">
														<a href="http://msdn.microsoft.com/library/CHS/cpref/html/frlrfsystemargumentnullexceptionclasstopic.asp">ArgumentNullException</a>
												</span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: #999999; PADDING-RIGHT: 0.75pt; BORDER-TOP: #999999; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #999999; WIDTH: 61.1%; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #999999; BACKGROUND-COLOR: transparent" valign="top" width="61%">
										<p class="MsoNormal" style="MARGIN: 7.2pt 0cm 3.6pt">
												<i>
														<span lang="EN-US" style="FONT-FAMILY: Verdana">path</span>
												</i>
												<span lang="EN-US" style="FONT-FAMILY: Verdana">
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">为空引用（</span>
												<span lang="EN-US" style="FONT-FAMILY: Verdana">Visual Basic </span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">中为</span>
												<span style="FONT-FAMILY: Verdana">
														<b>
																<span lang="EN-US">Nothing</span>
														</b>
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">）。</span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="BORDER-RIGHT: #999999; PADDING-RIGHT: 0.75pt; BORDER-TOP: #999999; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #999999; WIDTH: 38.9%; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #999999; BACKGROUND-COLOR: transparent" valign="top" width="38%">
										<p class="MsoNormal" style="MARGIN: 7.2pt 0cm 3.6pt">
												<span lang="EN-US" style="FONT-FAMILY: Verdana">
														<a href="http://msdn.microsoft.com/library/CHS/cpref/html/frlrfsystemiodirectorynotfoundexceptionclasstopic.asp">DirectoryNotFoundException</a>
												</span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: #999999; PADDING-RIGHT: 0.75pt; BORDER-TOP: #999999; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #999999; WIDTH: 61.1%; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #999999; BACKGROUND-COLOR: transparent" valign="top" width="61%">
										<p class="MsoNormal" style="MARGIN: 7.2pt 0cm 3.6pt">
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">指定的路径无效，比如在未映射的驱动器上。</span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="BORDER-RIGHT: #999999; PADDING-RIGHT: 0.75pt; BORDER-TOP: #999999; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #999999; WIDTH: 38.9%; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #999999; BACKGROUND-COLOR: transparent" valign="top" width="38%">
										<p class="MsoNormal" style="MARGIN: 7.2pt 0cm 3.6pt">
												<span lang="EN-US" style="FONT-FAMILY: Verdana">
														<a href="http://msdn.microsoft.com/library/CHS/cpref/html/frlrfsystemiopathtoolongexceptionclasstopic.asp">PathTooLongException</a>
												</span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: #999999; PADDING-RIGHT: 0.75pt; BORDER-TOP: #999999; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #999999; WIDTH: 61.1%; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #999999; BACKGROUND-COLOR: transparent" valign="top" width="61%">
										<p class="MsoNormal" style="MARGIN: 7.2pt 0cm 3.6pt">
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">指定的路径、文件名或者两者都超出了系统定义的最大长度。例如，在基于</span>
												<span lang="EN-US" style="FONT-FAMILY: Verdana">Windows </span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">的平台上，路径必须小于</span>
												<span lang="EN-US" style="FONT-FAMILY: Verdana">248 </span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">个字符，文件名必须小于</span>
												<span lang="EN-US" style="FONT-FAMILY: Verdana">260 </span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">个字符。</span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="BORDER-RIGHT: #999999; PADDING-RIGHT: 0.75pt; BORDER-TOP: #999999; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #999999; WIDTH: 38.9%; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #999999; BACKGROUND-COLOR: transparent" valign="top" width="38%">
										<p class="MsoNormal" style="MARGIN: 7.2pt 0cm 3.6pt">
												<span lang="EN-US" style="FONT-FAMILY: Verdana">
														<a href="http://msdn.microsoft.com/library/CHS/cpref/html/frlrfsystemioioexceptionclasstopic.asp">IOException</a>
												</span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: #999999; PADDING-RIGHT: 0.75pt; BORDER-TOP: #999999; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #999999; WIDTH: 61.1%; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #999999; BACKGROUND-COLOR: transparent" valign="top" width="61%">
										<p class="MsoNormal" style="MARGIN: 7.2pt 0cm 3.6pt">
												<i>
														<span lang="EN-US" style="FONT-FAMILY: Verdana">path</span>
												</i>
												<span lang="EN-US" style="FONT-FAMILY: Verdana">
												</span>
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">包含不正确或无效的文件名、目录名或卷标的语法。</span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="BORDER-RIGHT: #999999; PADDING-RIGHT: 0.75pt; BORDER-TOP: #999999; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #999999; WIDTH: 38.9%; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #999999; BACKGROUND-COLOR: transparent" valign="top" width="38%">
										<p class="MsoNormal" style="MARGIN: 7.2pt 0cm 3.6pt">
												<span lang="EN-US" style="FONT-FAMILY: Verdana">
														<a href="http://msdn.microsoft.com/library/CHS/cpref/html/frlrfsystemsecuritysecurityexceptionclasstopic.asp">SecurityException</a>
												</span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
								<td style="BORDER-RIGHT: #999999; PADDING-RIGHT: 0.75pt; BORDER-TOP: #999999; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; BORDER-LEFT: #999999; WIDTH: 61.1%; PADDING-TOP: 0.75pt; BORDER-BOTTOM: #999999; BACKGROUND-COLOR: transparent" valign="top" width="61%">
										<p class="MsoNormal" style="MARGIN: 7.2pt 0cm 3.6pt">
												<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">调用方没有所要求的权限。</span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b>
						<span lang="EN-US">1.2 JDK 1.4.2 :<o:p></o:p></span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">public FileWriter(String fileName)<span style="mso-spacerun: yes">  </span>throws IOException</span>
		</p>
		<pre>
				<span lang="EN-US">Constructs a FileWriter object given a file name. </span>
		</pre>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b>
						<span lang="EN-US">Parameters:</span>
				</b>
				<span lang="EN-US">
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 36pt">
				<code>
						<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 黑体">fileName</span>
				</code>
				<span lang="EN-US">- String The system-dependent filename. </span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b>
						<span lang="EN-US">Throws:</span>
				</b>
				<span lang="EN-US">
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 36pt">
				<code>
						<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 黑体">
								<a title="class in java.io" href="file:///D:JDK_DOC%25201.4docsapijavaioIOException.html">IOException</a>
						</span>
				</code>
				<span lang="EN-US">- if the named file exists but is a directory rather than a regular file, does not exist but cannot be created, or cannot be opened for any other reason</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b>
						<span lang="EN-US">2</span>
				</b>
				<b>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、解析</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US">.NET</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span>
				<span lang="EN-US">Excetpion</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</span>
				<span lang="EN-US">Unchecked</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">异常，客户端不要求去</span>
				<span lang="EN-US">Check</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码，但是</span>
				<span lang="EN-US">JAVA</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的绝大部分</span>
				<span lang="EN-US">Checked</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">异常，它要求客户端的代码检测异常。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; mso-char-indent-count: 2.07; mso-char-indent-size: 10.5pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">假设一个这样的场景，方法</span>
				<span lang="EN-US">OutMethod</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">调用</span>
				<span lang="EN-US">InnerMethod</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，而内部方法</span>
				<span lang="EN-US">InnerMethod</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">抛出的异常</span>
				<span lang="EN-US">InnerException</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; mso-char-indent-count: 2.07; mso-char-indent-size: 10.5pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对于</span>
				<span lang="EN-US">Java</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span>
				<span lang="EN-US">CheckedException</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，或者</span>
				<span lang="EN-US">OutMethod</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">去抛出</span>
				<span lang="EN-US">InnerException</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，或者</span>
				<span lang="EN-US">OutMethod</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">捕捉</span>
				<span lang="EN-US">InnerException</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（然后做处理）。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">再来观察一下</span>
				<span lang="EN-US">JDK</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span>
				<span lang="EN-US">FileWriter</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的异常声明，我没有详细测试其在各种可能出错情况下抛出的</span>
				<span lang="EN-US">IOException</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的消息，但是其分类远远不如</span>
				<span lang="EN-US">.NET</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span>
				<span lang="EN-US">StreamWriter</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。假设</span>
				<span lang="EN-US">Java</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">想照抄</span>
				<span lang="EN-US">.NET</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span>
				<span lang="EN-US">StreamWriter</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，对于</span>
				<span lang="EN-US">Java</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的使用者来说，无异于恶梦。外部的代码需要捕获如此多的异常消息（不捕捉就会在</span>
				<span lang="EN-US">OutMethod</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">抛出一大堆的异常，问题继续传播下去，这是</span>
				<span lang="EN-US">CheckException</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的一个弱点）。也许正是出于这样的问题，所以此处</span>
				<span lang="EN-US">Java</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口的异常声明比较简单。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">那么假设我是一个库设计者，正在用到了</span>
				<span lang="EN-US">IO</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。如果我使用</span>
				<span lang="EN-US">.NET</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行开发，对于</span>
				<span lang="EN-US">IOException</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来说，我是否有必要捕捉呢？捕捉的目的是为了“处理”，那么对于库设计者，显然这时候需要通知其“客户程序员”出错的原因，所以这里的库设计者的行为最好就是“不处理”。如果处理，那只能是“</span>
				<span lang="EN-US">catch</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、再</span>
				<span lang="EN-US">throw</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”。那么这样的处理显然是无意义的，因为原始异常已经足以提醒客户程序员出错的原因了。如果捕捉，那代码会特别的丑陋（直接</span>
				<span lang="EN-US">catch Exception</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的行为是不可取的）。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US">CheckedException</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的另外一个缺点就是“将</span>
				<span lang="EN-US">Exceotion</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">加入了</span>
				<span lang="EN-US">Interface</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的规格声明“。假设</span>
				<span lang="EN-US">OutMethod</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">调用了</span>
				<span lang="EN-US">InnerMethod</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，此时</span>
				<span lang="EN-US">InnerMethod</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的设计者需要增加一个异常，那么会直接影响到</span>
				<span lang="EN-US">OutMethod</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。当然这里的</span>
				<span lang="EN-US">InnerMethod</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的设计者此时已经做了“修改接口声明“的行为。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> </span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"> </p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US">
						<br />   随后待续...... <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p> </p>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/45726.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2006-05-11 21:18 <a href="http://www.blogjava.net/jinfeng_wang/archive/2006/05/11/45726.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>测试、构建和重构(zz)</title><link>http://www.blogjava.net/jinfeng_wang/archive/2006/04/26/43358.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Wed, 26 Apr 2006 08:52:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2006/04/26/43358.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/43358.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2006/04/26/43358.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/43358.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/43358.html</trackback:ping><description><![CDATA[
		<div class="entrylistTitle">测试、构建和重构</div>
		<div class="entrylistDescription">
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl00_TitleUrl" href="http://www.cnblogs.com/confach/archive/2005/06/20/177817.html" target="_blank">NUnit2.0详细使用方法</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl01_TitleUrl" href="http://www.cnblogs.com/excel/archive/2005/06/17/176100.html" target="_blank">重构啊重构</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl02_TitleUrl" href="http://www.cnblogs.com/snowwolf/archive/2004/06/18/16644.html" target="_blank">.Net Code Cover</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl03_TitleUrl" href="http://www.cnblogs.com/william_fire/archive/2004/11/15/63867.html" target="_blank">让代码更具有可测试性</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl04_TitleUrl" href="http://www.cnblogs.com/anf/archive/2005/03/20/122342.html" target="_blank">NMock --- 从零开始</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl05_TitleUrl" href="http://www.cnblogs.com/jiezhi/archive/2005/04/28/146779.html" target="_blank">Unit Test : rules,design and strategy</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl06_TitleUrl" href="http://blog.joycode.com/musicland/archive/2005/04/16/48690.aspx" target="_blank">Concurrent connection limit</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl07_TitleUrl" href="http://www.cnblogs.com/iaxes/articles/121158.html" target="_blank">Log4Net Appender 之 ADONetAppender</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl08_TitleUrl" href="http://www.cnblogs.com/dahuzizyd/archive/2005/03/04/112566.html" target="_blank">Bug管理的流程和几个重点</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl09_TitleUrl" href="http://blog.joycode.com/ghj/articles/44720.aspx" target="_blank">把单元测试代码跟项目代码放在一个工程中</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl10_TitleUrl" href="http://www.cnblogs.com/java_aix/archive/2005/02/10/103717.html" target="_blank">Subversion配置安装教程（三） </a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl11_TitleUrl" href="http://www.cnblogs.com/java_aix/archive/2005/02/09/103500.html" target="_blank">Subversion配置安装教程（二） </a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl12_TitleUrl" href="http://www.cnblogs.com/java_aix/archive/2005/02/08/103399.html" target="_blank">Subversion配置安装教程（一）</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl13_TitleUrl" href="http://www.cnblogs.com/william_fire/articles/102245.html" target="_blank">敏捷（AM）：TDD(Test Driven Development）实践与变化--&gt;TAD（Test Assist Development)</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl14_TitleUrl" href="http://blog.joycode.com/uestc95/archive/2005/01/14/43057.aspx" target="_blank">如何在*.CS文件中加入版本跟踪信息？</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl15_TitleUrl" href="http://www.cnblogs.com/xchunyu/archive/2005/01/12/90425.html" target="_blank">推荐一个关于"架构"的演示文稿(PPT)</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl16_TitleUrl" href="http://blog.joycode.com/oldsidney/archive/2005/01/06/42468.aspx" target="_blank">什麼是 LoadRunner？ </a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl17_TitleUrl" href="http://www.cnblogs.com/dudu/archive/2004/12/18/78838.html" target="_blank">推荐一个不错的VS.NET集成单元测试工具TestDriven.NET</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl18_TitleUrl" href="http://www.cnblogs.com/bigtall/archive/2004/11/24/68126.html" target="_blank">实战dailybuild-cc.net的配置</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl19_TitleUrl" href="http://www.cnblogs.com/netcobra/archive/2004/11/24/68204.html" target="_blank">[翻译] NMock 两分钟教程</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl20_TitleUrl" href="http://www.cnblogs.com/netcobra/archive/2004/11/24/68199.html" target="_blank">[翻译] NMock 简介</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl21_TitleUrl" href="http://www.cnblogs.com/william_fire/archive/2004/11/15/64111.html" target="_blank">测试驱动开的的实例</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl22_TitleUrl" href="http://www.cnblogs.com/William_Fire/archive/2004/11/15/63867.html" target="_blank">让代码更具有可测试性</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl23_TitleUrl" href="http://www.cnblogs.com/rickie/archive/2004/11/08/61311.html" target="_blank">重构（Refactoring）技巧读书笔记 之三 </a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl24_TitleUrl" href="http://pfzhou.cnblogs.com/pvistely/archive/2004/11/11/62600.html" target="_blank">第一次用CVS后的流程小结（其实VSS也一样）</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl25_TitleUrl" href="http://pfzhou.cnblogs.com/airforce1st/archive/2004/10/22/55303.html" target="_blank">我也再补充一个NANT使用注意事项</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl26_TitleUrl" href="http://pfzhou.cnblogs.com/rickie/archive/2004/10/04/48859.aspx" target="_blank">重构（Refactoring）技巧读书笔记 之二</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl27_TitleUrl" href="http://pfzhou.cnblogs.com/rickie/archive/2004/09/25/46577.aspx" target="_blank">重构（Refactoring）技巧读书笔记 之一</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl28_TitleUrl" href="http://blog.csdn.net/ycw/archive/2004/09/05/95076.aspx" target="_blank">Bugzilla简明使用手则</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl29_TitleUrl" href="http://pfzhou.cnblogs.com/ccBoy/archive/2004/08/31/38140.aspx" target="_blank">Daily Build 的链接</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl30_TitleUrl" href="http://pfzhou.cnblogs.com/muddle/archive/2004/04/20/6673.aspx" target="_self">Test-Driven Development In .NET 部分译文</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl31_TitleUrl" href="http://pfzhou.cnblogs.com/feidao/archive/2004/06/19/17050.aspx" target="_blank">有关于Refactor(重构)与Source(源)的比较</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl32_TitleUrl" href="http://pfzhou.cnblogs.com/coolbug/archive/2004/07/26/27367.aspx" target="_blank">终于完成了DailyBuild</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl33_TitleUrl" href="http://pfzhou.cnblogs.com/ccBoy/archive/2004/07/26/27363.aspx" target="_blank">用MSBuild.... DailyBuild和软件开发流程的东东</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl34_TitleUrl" href="http://pfzhou.cnblogs.com/coolbug/archive/2004/07/27/27735.aspx" target="_blank">DailyBuild全攻略</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl35_TitleUrl" href="http://pfzhou.cnblogs.com/unruledboy/archive/2004/08/13/33227.aspx" target="_blank">关于Peer Review、代码评审和测试驱动等</a>
				</h5>
		</div>
		<div class="post">
				<h5>
						<a id="FavoriteList1_Favorites_ctl36_TitleUrl" href="http://pfzhou.cnblogs.com/jobs/archive/2004/08/13/33065.aspx" target="_blank">测试开发驱动实践</a>
				</h5>
		</div>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/43358.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2006-04-26 16:52 <a href="http://www.blogjava.net/jinfeng_wang/archive/2006/04/26/43358.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>追求代码质量: 不要被覆盖报告所迷惑(zz)</title><link>http://www.blogjava.net/jinfeng_wang/archive/2006/04/26/43340.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Wed, 26 Apr 2006 08:24:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2006/04/26/43340.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/43340.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2006/04/26/43340.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/43340.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/43340.html</trackback:ping><description><![CDATA[
		<blockquote>测试覆盖工具对单元测试具有重要的意义，但是经常被误用。这个月，Andrew Glover 会在他的新系列 —— <i>追求代码质量</i> 中向您介绍值得参考的专家意见。第一部分深入地介绍覆盖报告中数字的真实含义。然后他会提出您可以尽早并经常地利用覆盖来确保代码质量的三个方法。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE 