﻿<?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-agun 阿甘 ---分享,共同进步-随笔分类-其他</title><link>http://www.blogjava.net/agun/category/30013.html</link><description>激情成就梦想，努力创造未来</description><language>zh-cn</language><lastBuildDate>Wed, 29 Feb 2012 10:21:04 GMT</lastBuildDate><pubDate>Wed, 29 Feb 2012 10:21:04 GMT</pubDate><ttl>60</ttl><item><title>vb控件开发随笔</title><link>http://www.blogjava.net/agun/archive/2012/02/29/370953.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Wed, 29 Feb 2012 01:03:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2012/02/29/370953.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/370953.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2012/02/29/370953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/370953.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/370953.html</trackback:ping><description><![CDATA[<p>项目需要使用一些本地控件，所以这几天又折腾把以前的vb拿出来，做一个空间的例子。vb制作控件很简单，这里也不再多说，我开发的控件名称叫做test.ocx发布好，会生成相应的test.cab和test.hmtl测试页面。</p>
<p>&nbsp;</p>
<p>我要把这个控件发布的web工程中</p>
<p>&nbsp;</p>
<p>1，首先复制cab到web目录下，然后再页面中添加控件信息，如下图，</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Html代码 <a title="复制代码" href="http://agun.iteye.com/admin/blogs/1431227#"><img alt="复制代码" src="http://agun.iteye.com/images/icon_copy.gif" /></a></div></div>
<ol class="dp-xml"><li><span>&lt;!--&nbsp;如果这页上的任何控件需要授权，您必须 &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;创建一个授权包文件。&nbsp;运行&nbsp;LPK_TOOL.EXE&nbsp;来创建 &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;要求的&nbsp;LPK&nbsp;文件。&nbsp;LPK_TOOL.EXE&nbsp;将从&nbsp;ActiveX&nbsp;SDK&nbsp;中找到， &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;http://www.microsoft.com/intdev/sdk/sdk.htm.&nbsp;如果您有&nbsp;Visual &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;Basic&nbsp;6.0&nbsp;CD,&nbsp;您可以在\Tools\LPK_TOOL&nbsp;目录下找到它。 &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;下面是对象标记的例子： &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">OBJECT</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">CLASSID</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"clsid:5220cb21-c88d-11cf-b347-00aa00a28331"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">PARAM</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">NAME</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"LPKPath"</font></span><span>&nbsp;</span><span class="attribute"><font color="#ff0000">VALUE</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"LPKfilename.LPK"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">OBJECT</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span></span></li><li><span>--</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">OBJECT</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">ID</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"test"</font></span><span>&nbsp;&nbsp;</span></span></li><li><span></span><span class="attribute"><font color="#ff0000">CLASSID</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"CLSID:7E0ED402-E1D4-4E40-95C2-FEA17B4FA60E"</font></span><span>&nbsp;&nbsp;</span></span></li><li><span></span><span class="attribute"><font color="#ff0000">CODEBASE</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"test.CAB#version=1,0,0,1"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">OBJECT</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none" class="html" name="code">&lt;!--	如果这页上的任何控件需要授权，您必须
	创建一个授权包文件。 运行 LPK_TOOL.EXE 来创建
	要求的 LPK 文件。 LPK_TOOL.EXE 将从 ActiveX SDK 中找到，
	http://www.microsoft.com/intdev/sdk/sdk.htm. 如果您有 Visual
	Basic 6.0 CD, 您可以在\Tools\LPK_TOOL 目录下找到它。

	下面是对象标记的例子：

&lt;OBJECT CLASSID="clsid:5220cb21-c88d-11cf-b347-00aa00a28331"&gt;
	&lt;PARAM NAME="LPKPath" VALUE="LPKfilename.LPK"&gt;
&lt;/OBJECT&gt;
--&gt;

&lt;OBJECT ID="test"
CLASSID="CLSID:7E0ED402-E1D4-4E40-95C2-FEA17B4FA60E"
CODEBASE="test.CAB#version=1,0,0,1"&gt;
&lt;/OBJECT&gt;</pre>
<p>&nbsp;其中上面注释掉的lpk这段根据他的描述生成了相应的lpk文件，将代码放到jsp页面中，部署。</p>
<p>&nbsp;</p>
<p>2，部署后查看测试效果，但是效果不尽如人意，提示&#8220;非安全控件&#8221;而且也无法安装，这是由于控件没有认证，认证还是需要花钱的，自然不行。</p>
<p>&nbsp;</p>
<p>3，只能通过本地注册控件的方式，这样就不需要ie的认证，但是控件提示的信息也是&#8220;无法识别的控件&#8221;。</p>
<p>4，使用installshield9来制作客户端注册包，具体的不说了只要注意一个个问题。注册控件的脚步</p>
<p>&nbsp;</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">C代码 <a title="复制代码" href="http://agun.iteye.com/admin/blogs/1431227#"><img alt="复制代码" src="http://agun.iteye.com/images/icon_copy.gif" /></a></div></div>
<ol class="dp-cpp"><li><span>function&nbsp;OnEnd()&nbsp;&nbsp; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;szDLL,&nbsp;szReg,&nbsp;szCmd;&nbsp; &nbsp;&nbsp;</span></li><li><span>begin&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;szReg&nbsp;=&nbsp;WINSYSDIR&nbsp;^&nbsp;</span><span class="string">"regsvr32.exe"</span><span>; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;szDLL&nbsp;=&nbsp;TARGETDIR&nbsp;^&nbsp;</span><span class="string">"test.ocx"</span><span>;&nbsp;</span><span class="comment">//如果是MSI工程，可以用INSTALLDIR代替TARGETDIR </span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;szCmd&nbsp;=&nbsp;</span><span class="string">"/s&nbsp;\""</span><span>&nbsp;+&nbsp;szDLL&nbsp;+&nbsp;</span><span class="string">"\""</span><span>;&nbsp;</span><span class="comment">//增加静默参数s,&nbsp;增加&nbsp;\&#8221;&nbsp;防止目录路径含空格的情况。&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(!REMOVEONLY)&nbsp;then&nbsp; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LaunchAppAndWait(szReg,&nbsp;szCmd,&nbsp;WAIT);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;endif;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li><li><span>end;&nbsp;&nbsp;</span></li></ol></div><pre style="display: none" class="c" name="code">function OnEnd()  
    string szDLL, szReg, szCmd; 
begin   
    szReg = WINSYSDIR ^ "regsvr32.exe";
    szDLL = TARGETDIR ^ "test.ocx"; //如果是MSI工程，可以用INSTALLDIR代替TARGETDIR
    szCmd = "/s \"" + szDLL + "\""; //增加静默参数s, 增加 \&#8221; 防止目录路径含空格的情况。  
    
    if (!REMOVEONLY) then 
        LaunchAppAndWait(szReg, szCmd, WAIT);     
    endif;    
end;</pre>
<p>&nbsp;</p>
<p>这样注册后，客户端使用就不会有提示，我上面提到了，我自己生成了lpk文件，我也加到页面中了。</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Html代码 <a title="复制代码" href="http://agun.iteye.com/admin/blogs/1431227#"><img alt="复制代码" src="http://agun.iteye.com/images/icon_copy.gif" /></a></div></div>
<ol class="dp-xml"><li><span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">OBJECT</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">CLASSID</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"clsid:5220cb21-c88d-11cf-b347-00aa00a28331"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">PARAM</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">NAME</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"LPKPath"</font></span><span>&nbsp;</span><span class="attribute"><font color="#ff0000">VALUE</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"LPKfilename.LPK"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li><span></span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">OBJECT</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none" class="html" name="code">&lt;OBJECT CLASSID="clsid:5220cb21-c88d-11cf-b347-00aa00a28331"&gt;
	&lt;PARAM NAME="LPKPath" VALUE="LPKfilename.LPK"&gt;
&lt;/OBJECT&gt;
</pre>
<p>&nbsp;</p>
<p>但是如果加这句虽然控件可以使用，但是总会有安全提示，很影响使用效果。所以暂时把它去掉了。</p><img src ="http://www.blogjava.net/agun/aggbug/370953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2012-02-29 09:03 <a href="http://www.blogjava.net/agun/archive/2012/02/29/370953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数字签名流程</title><link>http://www.blogjava.net/agun/archive/2011/04/24/348921.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Sun, 24 Apr 2011 08:27:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2011/04/24/348921.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/348921.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2011/04/24/348921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/348921.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/348921.html</trackback:ping><description><![CDATA[<img height="361" alt="" src="http://dl.iteye.com/upload/attachment/469822/bc2d7cac-5717-3356-bfb3-62cbed24214f.jpg" width="609" border="0" /><br />
<p>数字签名流程个图</p>
<p>&nbsp;</p>
<p>上面的图描述了用户A和用户B间通讯流程。</p>
<p>1，用户A将明文通过hash运算（散列）生成<span style="color: #ff0000">数字摘要1</span>，用户A用自己的私钥对摘要进行加密生成<span style="color: #ff0000">数字签名1.</span></p>
<p><span style="color: #000000">2，用户A将明文+<span style="color: #ff0000">数字签名1</span>+A用户的公钥（证书），准备将这些信息发到B用户，但是这个过程中，用户A明文是不安全的是可见的，我们需要对这三个文件进行加密。</span></p>
<p>3，用户A通过一个&#8220;对称加密&#8221;（对称加密速度很快，知道密钥就可以解密）对其进行加密将其生成<span style="color: #ff0000">秘文1</span>，要想这次加密成功关键就是要保护这个<span style="color: #ff0000">对称加密的密钥1</span>。</p>
<p>4，为了保证上面的加密安全，使用用户B的公钥对&#8220;<span style="color: #ff0000">对称加密的密钥1</span>&#8221;进行了一次加密处理，生成一个<span style="color: #ff0000">数字信封1</span>，此时这个<span style="color: #ff0000">数字信封1</span>+<span style="color: #ff0000">秘文1</span><span style="color: #000000">打包装入就可以发送给用B了。</span></p>
<p>5，用户B接收到信，看到<span style="color: #ff0000">数字信封1<span style="color: #000000">+</span><span style="color: #ff0000">秘文1</span></span><span style="color: #000000">，用户B用私钥解密</span><span style="color: #ff0000">数字信封1</span><span style="color: #000000">，得到了&#8220;<span style="color: #ff0000">对称加密的密钥1</span>&#8221;，通过这个对称加密密钥对<span style="color: #ff0000">秘文1</span>解密，就可以解开密文。</span></p>
<p>6，解开<span style="color: #ff0000">秘文1</span><span style="color: #000000">解则看到了A将明文+<span style="color: #ff0000">数字签名1</span>+A用户的公钥（证书），这三个文件，这个时候已经可以确认是用户A发的信息了，但是还要验证文件在传输过程中是否被篡改。</span></p>
<p>7，用户B将明文通过hash运算（散列）生成<span style="color: #ff0000">数字摘要2</span><span style="color: #000000">，同时用得到的A用户的公钥（证书）对</span><span style="color: #ff0000">数字签名1</span><span style="color: #000000">进行解密生成原来的</span><span style="color: #ff0000">数字摘要1</span><span style="color: #000000">，如果此时的</span><span style="color: #ff0000">数字摘要1<span style="color: #000000">同</span>数字摘要2</span><span style="color: #000000">相同那么说明整个过程是安全而有效的。</span></p>
<p>&nbsp;</p>
 <img src ="http://www.blogjava.net/agun/aggbug/348921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2011-04-24 16:27 <a href="http://www.blogjava.net/agun/archive/2011/04/24/348921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数字签名</title><link>http://www.blogjava.net/agun/archive/2011/04/24/348918.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Sun, 24 Apr 2011 06:40:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2011/04/24/348918.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/348918.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2011/04/24/348918.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/348918.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/348918.html</trackback:ping><description><![CDATA[<div class="blog_content">
<p>好的文章 <a href="http://www.ibm.com/developerworks/cn/java/l-security/">http://www.ibm.com/developerworks/cn/java/l-security/</a></p>
<p>&nbsp;</p>
<p>数字签名以电子形式存在于数据信息之中的，或作为其附件的或逻辑上与之有联系的数据，可用于辨别数据签署人的身份，并表明签署人对数据信息中包含的信息的认可。（摘自百度）</p>
<p>&nbsp;</p>
<p>数字签名（又称<a href="http://agun.iteye.com/view/355291.htm" target="_blank">公钥</a>数字签名、电子签章）是一种类似写在纸上的普通的物理签名，但是使用了公钥加密领域的技术实现，用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算，一个用于签名，另一个用于验证</p>
<p>&nbsp;</p>
<p><span class="headline-content">基本介绍</span>　　数字签名不是指将你的签名扫描成数字图像，或者用<a href="http://agun.iteye.com/view/741084.htm" target="_blank">触摸板</a>获取的签名，更不是你的<a href="http://agun.iteye.com/view/704241.htm" target="_blank">落款</a>。 </p>
<p>　　数字签名了的文件的完整性是很容易验证的（不需要骑缝章，骑缝签名，也不需要笔迹专家），而且数字签名具有<a href="http://agun.iteye.com/view/992756.htm" target="_blank">不可抵赖性</a>（不需要笔迹专家来验证）。 </p>
<p>　　简单地说,所谓数字签名就是附加在<a href="http://agun.iteye.com/view/2191734.htm" target="_blank">数据单元</a>上的一些数据,或是对数据单元所作的<a href="http://agun.iteye.com/view/7411.htm" target="_blank">密码</a>变换。这种数据或变换允许数据单元的接收者用以确认数据单元的来源和数据单元的完整性并保护数据,防止被人(例如接收者)进行伪造。它是对电子形式的消息进行签名的一种方法,一个签名消息能在一个<a href="http://agun.iteye.com/view/71985.htm" target="_blank">通信网络</a>中传输。基于公钥密码体制和<a href="http://agun.iteye.com/view/493846.htm" target="_blank">私钥</a>密码体制都可以获得数字签名,目前主要是基于公钥密码体制的数字签名。包括普通数字签名和特殊数字签名。普通数字签名<a href="http://agun.iteye.com/view/7420.htm" target="_blank">算法</a>有RSA、ElGamal、Fiat-Shamir、Guillou- Quisquarter、Schnorr、Ong-Schnorr-Shamir数字签名算法、Des/DSA,椭圆曲线数字签名算法和有限自动机数字签名算法等。特殊数字签名有<a href="http://agun.iteye.com/view/1344005.htm" target="_blank">盲签名</a>、代理签名、<a href="http://agun.iteye.com/view/3080709.htm" target="_blank">群签名</a>、不可否认签名、公平盲签名、门限签名、具有消息恢复功能的签名等,它与具体应用环境密切相关。显然,数字签名的应用涉及到法律问题,<a href="http://agun.iteye.com/view/2645643.htm" target="_blank">美国联邦政府</a>基于有限域上的离散对数问题制定了自己的<a href="http://agun.iteye.com/view/4444449.htm" target="_blank">数字签名标准</a>(DSS)。 </p>
<p>　　数字签名（Digital Signature）技术是<a href="http://agun.iteye.com/view/7595.htm" target="_blank">不对称加密算法</a>的典型应用。数字签名的应用过程是，数据源发送方使用自己的私钥对数据校验和或其他与数据内容有关的变量进行加密处理，完成对数据的合法&#8220;签名&#8221;，数据接收方则利用对方的<a href="http://agun.iteye.com/view/355291.htm" target="_blank">公钥</a>来解读收到的&#8220;数字签名&#8221;，并将解读结果用于对<a href="http://agun.iteye.com/view/702953.htm" target="_blank">数据完整性</a>的检验，以确认签名的合法性。<a href="http://agun.iteye.com/view/297231.htm" target="_blank">数字签名技术</a>是在网络系统虚拟环境中确认<a href="http://agun.iteye.com/view/1034208.htm" target="_blank">身份</a>的重要技术，完全可以代替现实过程中的&#8220;亲笔签字&#8221;，在技术和法律上有保证。在数字签名应用中，发送者的公钥可以很方便地得到，但他的私钥则需要严格保密。 </p>
<h2 class="headline-1 bk-sidecatalog-title"><span class="headline-content">主要功能</span></h2>
<p>　　保证信息传输的完整性、发送者的<a href="http://agun.iteye.com/view/1014826.htm" target="_blank">身份认证</a>、防止交易中的抵赖发生。 </p>
<p>　　数字签名技术是将摘要信息用发送者的私钥加密，与<a href="http://agun.iteye.com/view/1455951.htm" target="_blank">原文</a>一起传送给接收者。接收者只有用发送的公钥才能解密被加密的摘要信息，然后用HASH函数对收到的原文产生一个摘要信息，与解密的摘要信息对比。如果相同，则说明收到的信息是完整的，在传输过程中没有被修改，否则说明信息被修改过，因此数字签名能够验证信息的完整性。 </p>
<p>　　数字签名是个加密的过程，数字签名验证是个解密的过程。 </p>
<h2 class="headline-1 bk-sidecatalog-title"><span class="headline-content">签名过程</span></h2>
<p>　　报文的发送方用一个哈希函数从报文文本中生成报文摘要（散列值）。发送方用自己的私人密钥对这个散列值进行加密。然后，这个加密后的散列值将作为报文的附件和报文一起发送给报文的接收方。报文的接收方首先用与发送方一样的哈希函数从接收到的原始报文中计算出报文摘要，接着再用发送方的公用密钥来对报文附加的数字签名进行解密。如果两个散列值相同、那么接收方就能确认该数字签名是发送方的。通过数字签名能够实现对原始报文的鉴别。 </p>
<p>　　数字签名有两种功效：一是能确定消息确实是由发送方签名并发出来的，因为别人假冒不了发送方的签名。二是数字签名能确定消息的完整性。因为数字签名的特点是它代表了文件的特征，文件如果发生改变，数字签名的值也将发生变化。不同的文件将得到不同的数字签名。 一次数字签名涉及到一个哈希函数、发送者的公钥、发送者的私钥。 </p>
<h2 class="headline-1 bk-sidecatalog-title"><span class="headline-content">个人安全邮件证书</span></h2>
<p>　　具有数字签名功能的个人安全邮件证书是用户证书的一种，是指单位用户收发电子邮件时采用证书机制保证安全所必须具备的证书。个人安全<a href="http://agun.iteye.com/view/1545813.htm" target="_blank">电子邮件证书</a>是符合x.509标准的数字安全证书，结合<a href="http://agun.iteye.com/view/16501.htm" target="_blank">数字证书</a>和<a href="http://agun.iteye.com/view/487770.htm" target="_blank">S/MIME</a>技术对普通电子邮件做加密和数字签名处理，确保电子邮件内容的<a href="http://agun.iteye.com/view/421194.htm" target="_blank">安全性</a>、机密性、发件人身份确认性和不可抵赖性。 具有数字签名功能的 个人安全邮件证书中包含证书持有人的<a href="http://agun.iteye.com/view/126647.htm" target="_blank">电子邮件地址</a>、证书持有人的公钥、颁发者(CA)以及颁发者对该证书的签名。个人安全邮件证书功能的实现决定于用户使用的邮件系统是否支持相应功能。目前， MS Outlook 、Outlook Express、Foxmail及CA安全<a href="http://agun.iteye.com/view/2296101.htm" target="_blank">电子邮件系统</a>均支持相应功能。使用个人安全邮件证书可以收发加密和数字签名邮件，保证电子邮件传输中的机密性、完整性和不可否认性，确保电子邮件通信各方身份的真实性。 </p>
<h2 class="headline-1 bk-sidecatalog-title"><span class="headline-content">用数字签名识别病毒</span></h2>
<p>　　<sup>[1]</sup><a name="ref_%5B1%5D"></a><sup>[2]</sup><a name="ref_%5B2%5D"></a>如何区分数字签名攻击呢？有两个方法： </p>
<p>　　1.查看数字签名的详细信息，我们应该查看该数字签名的详细信息，点击&#8220;详细信息&#8221;按钮即可。 </p>
<p>　　我们会发现正常EXE和感染（或捆绑<a href="http://agun.iteye.com/view/931.htm" target="_blank">木马</a>）后的EXE数字签名的区别 </p>
<p>　　正常EXE的数字签名详细信息 </p>
<p>　　被篡改后的EXE数字签名信息无效 </p>
<p>　　方法2，使用数字签名验证<a href="http://agun.iteye.com/view/17674.htm" target="_blank">程序</a>sigcheck.exe （可以百度一下找这个工具，著名系统工具包Sysinternals Suite的组件之一。） </p>
<p>　　数字签名异常的结果为： </p>
<p>　　C:\Documents and Settings\litiejun\??\modify.exe: </p>
<p>　　Verified: Unsigned </p>
<p>　　File date: 15:46 2008-5-23 </p>
<p>　　Publisher: n/a </p>
<p>　　Description: n/a </p>
<p>　　Product: n/a </p>
<p>　　Version: n/a </p>
<p>　　File version: n/a </p>
<p>　　数字签名正常的结果为： </p>
<p>　　C:\Documents and Settings\litiejun\??\che.exe: </p>
<p>　　Verified: Signed </p>
<p>　　Signing date: 16:28 2008-4-29 </p>
<p>　　Publisher: n/a </p>
<p>　　Description: n/a </p>
<p>　　Product: n/a </p>
<p>　　Version: n/a </p>
<p>　　File version: n/a </p>
<h2 class="headline-1 bk-sidecatalog-title"><span class="headline-content">原因分析</span></h2>
<p>　　1，精心设计的感染 </p>
<p>　　当EXE被感染时，是很容易破坏文件的数字签名信息的，如果攻击者感染或破坏文件时，有意不去破坏EXE中有关数字签名的部分，就可能出现感染后，数字签名看上去正常的<a href="http://agun.iteye.com/view/780206.htm" target="_blank">情况</a>。但认真查看<a href="http://agun.iteye.com/view/1229816.htm" target="_blank">文件属性</a>或校验文件的HASH值，你会发现该EXE程序已经不是最原始的版本了。 </p>
<p>　　2.该<a href="http://agun.iteye.com/view/37.htm" target="_blank">软件</a>发行商的数字签名文件被盗，攻击者可以把捆绑木马或感染病毒后的EXE程序，也打包上数字签名，这种情况下就更严重了。企业如果申请了数字签名证书，一定要妥善保管，否则后患无穷。 </p>
<h2 class="headline-1 bk-sidecatalog-title"><span class="headline-content">使用方法</span></h2>
<p>　　你可以对你发出的每一封电子邮件进行数字签名。这不是指落款，普遍把落款讹误成签名。 </p>
<p>　　在我国大陆，数字签名是具<a href="http://agun.iteye.com/view/21562.htm" target="_blank">法律效力</a>的，正在被普遍使用。2000年，中华人民共和国的新《<a href="http://agun.iteye.com/view/1552.htm" target="_blank">合同法</a>》首次确认了<a href="http://agun.iteye.com/view/1139813.htm" target="_blank">电子合同</a>、<a href="http://agun.iteye.com/view/15288.htm" target="_blank">电子签名</a>的法律效力。2005年4月1日起，中华人民共和国首部《<a href="http://agun.iteye.com/view/732139.htm" target="_blank">电子签名法</a>》正式实施。 </p>
<h2 class="headline-1 bk-sidecatalog-title"><span class="headline-content">原理特点</span></h2>
<p>　　每个人都有一对&#8220;钥匙&#8221;（数字身份），其中一个只有她/他本人知道（<a href="http://agun.iteye.com/view/934.htm" target="_blank">密钥</a>），另一个公开的（公钥）。签名的时候用密钥，验证签名的时候用公钥。又因为任何人都可以落款申称她/他就是你，因此公钥必须向接受者信任的人（身份<a href="http://agun.iteye.com/view/124043.htm" target="_blank">认证机构</a>）来注册。注册后身份认证机构给你发一数字证书。对<a href="http://agun.iteye.com/view/1365311.htm" target="_blank">文件签名</a>后，你把此数字证书连同文件及签名一起发给接受者，接受者向身份认证机构求证是否真地是用你的密钥签发的文件。 </p>
<p>　　在通讯中使用数字签名一般基于以下原因： </p>
<h3 class="headline-2 bk-sidecatalog-title"><a name="8_1"></a><span class="headline-content">鉴权</span> </h3>
<p>　　公钥加密系统允许任何人在发送信息时使用公钥进行加密，数字签名能够让信息接收者确认发送者的身份。当然，接收者不可能百分之百确信发送者的真实身份，而只能在<a href="http://agun.iteye.com/view/3114489.htm" target="_blank">密码系统</a>未被破译的情况下才有理由确信。 </p>
<p>　　鉴权的重要性在财务数据上表现得尤为突出。举个例子，假设一家<a href="http://agun.iteye.com/view/20233.htm" target="_blank">银行</a>将指令由它的分行传输到它的中央管理系统，指令的格式是(a,b)，其中a是账户的账号，而b是账户的现有金额。这时一位远程<a href="http://agun.iteye.com/view/88584.htm" target="_blank">客户</a>可以先存入100元，观察传输的结果，然后接二连三的发送格式为(a,b)的指令。这种方法被称作<a href="http://agun.iteye.com/view/1569933.htm" target="_blank">重放攻击</a>。 </p>
<h3 class="headline-2 bk-sidecatalog-title"><a name="8_2"></a><span class="headline-content">完整性</span> </h3>
<p>　　传输数据的双方都总希望确认消息未在传输的过程中被修改。加密使得第三方想要读取数据十分困难，然而第三方仍然能采取可行的方法在传输的过程中修改数据。一个通俗的例子就是同形攻击：回想一下，还是上面的那家银行从它的分行向它的中央管理系统发送格式为(a,b)的指令，其中a是账号，而b是账户中的金额。一个远程客户可以先存100元，然后拦截传输结果，再传输(a,b3)，这样他就立刻变成百万富翁了。 </p>
<h3 class="headline-2 bk-sidecatalog-title"><a name="8_3"></a><span class="headline-content">不可抵赖</span> </h3>
<p>　　在密文背景下，抵赖这个词指的是不承认与消息有关的举动（即声称消息来自第三方）。消息的接收方可以通过数字签名来防止所有后续的抵赖行为，因为接收方可以出示签名给别人看来证明信息的来源。 </p>
<h2 class="headline-1 bk-sidecatalog-title"><span class="headline-content">如何实现</span></h2>
<p>　　数字签名算法依靠<a href="http://agun.iteye.com/view/344309.htm" target="_blank">公钥加密</a>技术来实现的。在公钥加密技术里，每一个使用者有一对密钥：一把公钥和一把私钥。公钥可以自由发布，但私钥则秘密保存；还有一个要求就是要让通过公钥推算出私钥的做法不可能实现。 </p>
<p>　　普通的数字签名算法包括三种算法： </p>
<p>　　1.密码生成算法 ； </p>
<p>　　2.标记算法 ； </p>
<p>　　3.验证算法 。 </p>
<h2 class="headline-1 bk-sidecatalog-title"><span class="headline-content">Java数字签名步骤</span></h2>
<p>　　1、将applet的<a href="http://agun.iteye.com/view/3922213.htm" target="_blank">class文件</a>打包成*.jar（不会的可以在命令行中输入jar查看帮助） <sup>[3]</sup><a name="ref_%5B3%5D"></a> </p>
<p>　　2 首先我们要生成一个keystore 否则在签名的时候报如下错误 </p>
<p>　　jarsigner 错误： java.lang.RuntimeException: 密钥库装入： C:\Documents and Settings\ij2ee\.keystore (系统找不到指定的文件。). (这边的ij2ee 是我当前系统<a href="http://agun.iteye.com/view/398306.htm" target="_blank">用户名</a>) </p>
<p>　　生成keystore的语句:keytool -genkey -alias 别名你可以自己写 -keyalg RSA -keystore .keystore </p>
<p>　　比如我的就是 keytool -genkey -alias ij2ee -keyalg RSA -keystore .keystore </p>
<p>　　下面是会出现的数字签名的一些步骤操作: </p>
<p>　　输入keystore密码： </p>
<p>　　再次输入新密码: </p>
<p>　　您的<a href="http://agun.iteye.com/view/20683.htm" target="_blank">名字</a>与姓氏是什么？ </p>
<p>　　[Unknown]： ij2ee </p>
<p>　　您的组织单位名称是什么？ </p>
<p>　　[Unknown]： mtk </p>
<p>　　您的组织名称是什么？ </p>
<p>　　[Unknown]： mtk </p>
<p>　　您所在的城市或区域名称是什么？ </p>
<p>　　[Unknown]： suzhou </p>
<p>　　您所在的州或省份名称是什么？ </p>
<p>　　[Unknown]： jiangsu </p>
<p>　　该单位的两<a href="http://agun.iteye.com/view/94782.htm" target="_blank">字母</a>国家代码是什么 </p>
<p>　　[Unknown]： cn </p>
<p>　　CN=jeson, OU=mtk, O=mtk, L=suzhou, ST=jiangsu, C=cn 正确吗？ </p>
<p>　　[否]： y </p>
<p>　　输入&lt;sfcs&gt;的主密码 </p>
<p>　　（如果和 keystore 密码相同，按回车）： </p>
<p>　　这时候会在jdk的bin<a href="http://agun.iteye.com/view/637.htm" target="_blank">目录</a>下生成 .keystore 。把这个.keystore文件移动到 C:\Documents and Settings\当前<a href="http://agun.iteye.com/view/1541135.htm" target="_blank">系统用户</a> 的目录下面。 </p>
<p>　　3、创建一个数字证书 </p>
<p>　　在命令行中输入如下指令，peakCA和peakCALib自己起名字好了，3650是有效天数，就是10年左右，在创建证书的的时候，需要填写证书的一些信息和证书对应的私钥密码。这些信息包括 CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx，都是中文，一看就懂的 </p>
<p>　　keytool -genkey -alias peakCA -keyalg RSA -keysize 1024 -keystore peakCALib -validity 3650 </p>
<p>　　4、将证书导出到证书文件中 </p>
<p>　　在命令行中输入如下指令，peakCA和peakCALib自己起名字好了，******是你输入的密码 </p>
<p>　　keytool -export -alias peakCA -file peakCA.cer -keystore peakCALib -storepass ****** -rfc </p>
<p>　　5、授权jar文件，在命令行中输入如下指令 </p>
<p>　　jarsigner -keystore peakCALib myapplet.jar peakCA</p>
</div>
 <img src ="http://www.blogjava.net/agun/aggbug/348918.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2011-04-24 14:40 <a href="http://www.blogjava.net/agun/archive/2011/04/24/348918.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>成功12级跳（转载）</title><link>http://www.blogjava.net/agun/archive/2008/09/09/227935.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Tue, 09 Sep 2008 06:12:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2008/09/09/227935.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/227935.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2008/09/09/227935.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/227935.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/227935.html</trackback:ping><description><![CDATA[<h2 style="margin: 0.25em 0px 0px">
<div>成功12级跳<a title="blocked::http://dhlmtzx.edudh.net/oblog/default.asp?id=2535" href="http://dhlmtzx.edudh.net/oblog/default.asp?id=2535" target="_blank"></a></div>
</h2>
<br />
　　<strong>第1跳:1个目标</strong><br />
<br />
　　一艘没有航行目标的船，任何方向的风都是逆风，请明确以下几点：<br />
　　1.你为什么是穷人——很多时候是因为你没有立下成为富人的目标。<br />
　　2.你的人生核心目标是什么——杰出人士与平庸之辈的根本差别，并不是天赋、机遇，而在于有无目标。<br />
　　3.起跑领先一步，人生领先一大步：成功从选定目标开始。<br />
　　4.贾金斯式的人永远不会成功——为什么大多数人没有成功？真正能完成自己计划的人只有5%，大多数人不是将自己的目标舍弃，就是沦为缺乏行动的空想。<br />
　　5.如果你想在35岁以前成功，你一定得在25～30岁之间确立好你的人生目标。<br />
　　6.每日、每月、每年都要问自己：我是否达到了自己定下的目标？<br />
<br />
　　<strong>第2跳：2个成功基点</strong><br />
<br />
　　站好位置，调正心态，努力冲刺，35岁以前成功。<br />
　　（一）人生定位<br />
　　1.人怕入错行：你的核心竞争力是什么？<br />
　　2.成功者找方法，失败者找借口。<br />
　　3.从三百六十行中选择你的最爱：很多时候兴趣所在是成功的动力。人人都可以创业，但却不是人人都能创业成功。<br />
　　4.寻找自己的黄金宝地。<br />
<br />
　　（二）永恒的真理：心态决定命运，35岁以前的心态将决定你一生的命运。<br />
　　1.不满现状的人才能成为富翁——能追不尽景，始是不凡人。<br />
　　2.敢于梦想，勇于梦想——这个世界永远属于追梦的人。<br />
　　3.35岁以前不要怕，35岁以后不要悔。<br />
　　4.出身贫民，并非一辈子是贫民，只要你永远保持一颗进取的心——举目远望，中国成功人士很多来自小地方。<br />
　　5.做一个积极的思维者。<br />
　　6.不要败给悲观的自己。<br />
　　有的人比你富有一千倍，他们也会比你聪明一千倍么？不会，他们只是年轻时心气比你高一千倍。人生的好多次失败，最后并不是败给别人，而是败给了悲观的自己。<br />
　　7.成功者不过是爬起来比倒下去多一次<br />
　　8.宁可去碰壁，也不要在家里面壁.克服你的失败、消极的心态——找个地方喝点酒，或找个迪厅跳跳舞，或找帮朋友侃侃而谈，然后，积极行动起来。<br />
<br />
　　<strong>第3跳：3大技巧</strong><br />
<br />
　　1.管理时间：你的时间在哪里，你的成就就在哪里。<br />
　　一个把1小时看成60分钟的人，比一个将之看作一小时的人的时间，要多60倍。<br />
　　2.你不理财，财不理你。<br />
　　3.自我管理，游刃有余——创业不怕本小，脑子一定要好；可以考虑开家特色店；做别人不愿做的生意。<br />
<br />
　　<strong>第4跳：4项安身立命的理念</strong><br />
<br />
　　35岁以前一定要形成个人风格，正如小天后蔡依林所唱：要有属于你自己的招牌动作。<br />
　　1.做人优于做事。<br />
　　做事失败可以重来，做人失败却不能重来：做人要讲义气；做事永不气馁。<br />
　　2.豁达的男人有财运，所以，35岁前请搞定你的婚姻生活——找个豁达的男人做老公吧！<br />
　　3.忠诚的原则：35岁前你还没有建立起忠诚美誉，这一缺点将要困扰你一生。<br />
　　4.把小事做细，但不要耍小聪明——中国人想做大事的人太多，而愿把小事做完美的人太少。<br />
<br />
　　<strong>第5跳：5分运气</strong><br />
<br />
　　比尔?盖茨说：人生是不公平的，习惯去接受它吧！<br />
　　1.人生的确有很多运气的成分：谋事在人，成事在天。<br />
　　2.机会时常意外地降临，但常常属于那些决不放弃的人。<br />
　　3.抓住人生的每一次机会——机会就像一只小鸟，如果你不抓住，它就会飞得无影无踪。<br />
　　4.智者早一步，愚者晚一步。<br />
<br />
　　<strong>第6跳：6项要求</strong><br />
<br />
　　1.智慧：别人可你以拿走你的一切，但拿不走你的智慧；巧妙运用自己的智慧。<br />
　　2.勇气：勇气的力量有时会让你成为"超人"；敢于放弃，敢于"舍得"。<br />
　　3.培养自己的"领导才能、领袖气质"——有机会一定要登顶"振臂一呼，应者云集"的境地。<br />
　　4.创造性：不要做循规蹈矩的人。25～35岁是人生最有创造性的阶段，很多成功人士也都产生在这一阶段。<br />
　　5.明智：知道自己的长处、短处，定向聚焦；尽量在自己的熟悉的领域努力。<br />
　　6.持之以恒的行动力：在你选定的行业坚持十年，你一定会有机会笑到最后。<br />
<br />
　　<strong>第7跳：7分学习</strong><br />
<br />
　　1.知识改变命运。<br />
　　2.35岁前学会你行业中必要的一切知识——每天淘汰你自己；在商言商；太相信书本的人，只能成为打工仔。<br />
　　3.思考、实践，再思考、再实践。<br />
<br />
　　<strong>第8跳：8分交际</strong><br />
<br />
　　朋友多了路好走：<br />
　　1.智商很重要，情商更重要：35岁前请务必建立起人际关系网。<br />
　　2.人脉即财脉。<br />
　　3.交友有原则。<br />
　　4.善于沟通：35岁前一定要锻炼出自己的演讲才能，很多成功人士首先是个出色的演说家。<br />
<br />
　　<strong>第9跳：9分习惯</strong><br />
<br />
　　习惯的力量是惊人的，35岁前养成的习惯决定着你的成功的大小。<br />
　　1.积极思维的好习惯。<br />
　　2.养成高效工作的好习惯——学会喜欢并习惯你的办公室；生活可以不拘小节，但工作一定要谨小慎微；学习聆听，不打断别人说话。<br />
　　3.养成锻炼身体的好习惯。<br />
　　4.广泛爱好的好习惯。<br />
　　5.快速行动的好习惯。<br />
<br />
　　<strong>第10跳：10分自信</strong><br />
<br />
　　1.自信是成功的精神支柱。<br />
　　2.自信方能赢得别人的信任。<br />
　　3.把自信建立在创造价值的基础上。<br />
　　4.如何建立自信——为自己确立目标；发挥自己的长处；做事有计划、不拖拉、不轻言放弃；学会自我激励；坚持做你自己。<br />
<br />
　　<strong>第11跳11个需要避开的成功陷阱</strong><br />
<br />
　　1.只有功劳，没有苦劳；<br />
　　2.不要"怀才不遇"，而要寻找机遇；<br />
　　3.不要想发横财；<br />
　　4.不要为钱而工作，而让钱为你工作；<br />
　　5.盲目跟风，人云亦云，人做我也做；<br />
　　6.小富即安，不思进取，知足常乐；<br />
　　7.承认错误而非掩饰错误；<br />
　　8.脚踏实地而非想入非非；<br />
　　9.野心太大而不是信心十足；<br />
　　10.反复跳槽不可取；<br />
　　11.眼高手低；不择手段。<br />
<br />
　　<strong>第12跳12分努力</strong><br />
<br />
　　没有人能随随便便成功：<br />
　　1.小不是成功，大不是成功，由小变大才是成功；<br />
　　2.中国社会进入微利时代：巧干+敢干+实干=成功；<br />
　　3.努力尝试就有成功的可能；<br />
　　4.做任何事情，尽最大努力；<br />
　　5.把事情当成事业来做；<br />
　　6.争取早日掘到人生的第一桶金<br />
<img src ="http://www.blogjava.net/agun/aggbug/227935.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2008-09-09 14:12 <a href="http://www.blogjava.net/agun/archive/2008/09/09/227935.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaScript面向对象编程 </title><link>http://www.blogjava.net/agun/archive/2008/07/09/213822.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Wed, 09 Jul 2008 15:00:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2008/07/09/213822.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/213822.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2008/07/09/213822.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/213822.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/213822.html</trackback:ping><description><![CDATA[<div class="post">
<div class="posthead">
<h2><a class="singleposttitle" id="AjaxHolder_ctl01_TitleUrl" href=""  href_cetemp>JavaScript面向对象编程</a> (转载)</h2>
</div>
<div class="postbody">
<p><font face="Courier New"><strong>一、引言</strong><br />
&nbsp; 长久以来，JavaScript在Web开发中一直处于被忽视的地位，甚至有相当一部分开发人员对它产生了误解，认为JavaScript只不过是用来完成一些花哨功能的雕虫小技。网络上广为流传的低质量的JavaScript代码对此也起到了推波助澜的作用...很多应用中JavaScript都采用了面向过程的编程方式，代码的可扩展性不好，复制粘贴的代码比比皆是...<br />
&nbsp; 随着Ajax等技术的广泛使用，YUI、Prototype等对JavaScript的应用可谓是淋漓尽致、出神入化。人们才发现原来JavaScript可以实现如此强大的功能，具备如此优雅的架构...<br />
<br />
<strong>二、准备</strong><br />
<span style="color: red">1、概念</span><br />
JavaScript是一种弱类型语言。包括：<br />
基本类型：数字Number，字符串String，布尔值Boolean；<br />
复合类型：对象Object，数组Array；<br />
工具类型：全局对象Global，日期Date，数学对象Math，正则表达式RegExp，错误对象Error；<br />
特殊类型：函数Function。<br />
<br />
这里我只想说两点：<br />
1）基本数据类型的包装对象<br />
每一个基本数据类型都有一个对应的对象类。可以灵活地实现类型转换。简单地说，JavaScript不仅支持数字、字符串和布尔值这些数据类型，还支持Number、String、Boolean类，这些类是基本数据类型的包装(wrapper)。<br />
例子：<br />
var s="some string";<br />
var len=s.length;<br />
这里，s保存了一个字符串，原始的字符串值是不会改变的。一个新的String对象被创建了，实现了对长度属性的访问，之后它就被销毁了。<br />
其它例子：<br />
var a="some string";<br />
var b=new String("some string");<br />
var c=["a","b","c"];<br />
var d=new Array("a","b","c");</font></p>
<p><font face="Courier New">alert(typeof a);//string<br />
alert(a instanceof String);//false<br />
alert(a instanceof Object);//false</font></p>
<p><font face="Courier New">alert(typeof b);//object<br />
alert(b instanceof String);//true<br />
alert(b instanceof Object);//true</font></p>
<p><font face="Courier New">alert(typeof c);//object<br />
alert(c instanceof Array);//true<br />
alert(c instanceof Object);//true</font></p>
<p><font face="Courier New">alert(typeof d);//object<br />
alert(d instanceof Array);//true<br />
alert(d instanceof Object);//true<br />
<br />
2）Function类型<br />
做为JavaScript的一种特殊类型，我们将看到函数在面向对象编程中起到了非常关键的作用。<br />
<br />
<span style="color: red">2.值和引用</span><br />
<table style="width: 533px; height: 174px" cellspacing="2" cellpadding="2" width="533" border="0">
    <tbody>
        <tr>
            <td><strong>类型</strong></td>
            <td><strong>复制</strong></td>
            <td><strong>传递</strong></td>
            <td><strong>比较</strong></td>
        </tr>
        <tr>
            <td><strong>数字</strong></td>
            <td>值</td>
            <td>值</td>
            <td>值</td>
        </tr>
        <tr>
            <td><strong>布尔值</strong></td>
            <td>值</td>
            <td>值</td>
            <td>值</td>
        </tr>
        <tr>
            <td><strong>字符串</strong></td>
            <td>不可变的</td>
            <td>不可变的</td>
            <td>值</td>
        </tr>
        <tr>
            <td><strong>对象</strong></td>
            <td>引用</td>
            <td>引用</td>
            <td>引用</td>
        </tr>
        <tr>
            <td><strong>函数</strong></td>
            <td>引用</td>
            <td>引用</td>
            <td>引用</td>
        </tr>
        <tr>
            <td><strong>数组</strong></td>
            <td>引用</td>
            <td>引用</td>
            <td>引用</td>
        </tr>
    </tbody>
</table>
<br />
</font><font face="Courier New">例子：<br />
var s1="hello";<br />
var s2="hell"+"o";<br />
alert(s1==s2);//true</font></p>
<p><font face="Courier New">var d1=new Date();<br />
var d2=new Date();<br />
alert(d1==d2);//false</font></p>
<p><font face="Courier New"><span style="color: red"><font face="Courier New">3.this</font></span><br />
在构造函数中，指代新创建的对象实例；<br />
在对象的方法被调用时，指代调用该方法的对象实例。<br />
<br />
<span style="color: red">4.arguments</span><br />
arguments属性由解释器创建，用于访问函数对象的每一个参数。<br />
<br />
<span style="color: red">5.callee,caller<br />
</span>arguments的callee属性获取对正在执行的Function对象的引用；<br />
Function对象的caller属性获取正在调用当前函数的父函数对象。<br />
<br />
<span style="color: red">6.apply,call</span><br />
两者都是将函数绑定到其它对象上执行的，区别在于调用方式：<br />
apply([thisObj[,argArray]])<br />
call([thisObj[,arg1[,arg2[,[,.argN]]]]])<br />
<br />
<span style="color: red">7.匿名函数</span><br />
(function(a,b){<br />
&nbsp;return a+b;<br />
&nbsp;})(1,1);<br />
等价于：<br />
function f(a,b){<br />
&nbsp;return a+b;<br />
}<br />
f(1,1);<br />
<br />
<span style="color: red">8.null,undefined</span><br />
null是JavaScript的关键字，表示空值。可以看作Object类型的一个特殊值。<br />
undefined不是关键字，它是一个全局变量，使用了未定义变量、变量未赋值、void运算符，都会返回&#8220;undefined&#8221;。<br />
<br />
<span style="color: red">9.constructor</span><br />
从JavaScript1.1开始，每个对象都具有一个constructor属性，它引用的是用来初始化该对象的构造函数。<br />
<br />
<span style="color: red">10.prototype</span><br />
JavaScript1.1引入了原型对象的概念，每一个对象都有一个原型对象，对象可以继承它的原型对象的所有属性和方法。<br />
要为一个对象的类制定原型对象，需要将构造函数的prototype属性设置为指定的对象。之后，如果用构造函数初始化对象时，会自动将指定的对象作为新创建对象的原型对象。<br />
<br />
注意：<br />
1）使用原型对象可以减少每个继承对象的内存需求量；<br />
2）即使属性是在对象被创建后才加到它的原型对象中的，对象也能够继承这些后定义的属性。<br />
3）当调用一个对象的一个属性时，先在该对象定义内查找该属性，如果没有该属性才到该对象的原型对象中查找，依此类推。<br />
<br />
<strong>三、实现</strong><br />
在面向对象编程中，我们可以把过程编程中的一个个function看作一个个独立定义的类，函数名即为类名。<br />
<span style="color: red">1.例子：Circle类</span><br />
function Circle(radius){<br />
&nbsp;//实例变量<br />
&nbsp;this.r=radius;<br />
}</font></p>
<p><font face="Courier New">//静态变量<br />
Circle.PI=3.14159;</font></p>
<p><font face="Courier New">//实例方法<br />
Circle.prototype.area=function(){<br />
&nbsp;return Circle.PI*this.r*this.r;<br />
}</font></p>
<p><font face="Courier New">//静态方法<br />
Circle.max=function(a,b){<br />
&nbsp;if(a.r&gt;=b.r){<br />
&nbsp;&nbsp;return a;<br />
&nbsp;}<br />
&nbsp;else{<br />
&nbsp;&nbsp;return b;<br />
&nbsp;}<br />
}</font></p>
<p><font face="Courier New">//调用<br />
var a=new Circle(2);<br />
var b=new Circle(3);<br />
var c=a.area();<br />
var d=Circle.max(a,b);</font></p>
<p><font face="Courier New"><span style="color: red"><font face="Courier New">2.继承</font></span><br />
1）一种继承方式<br />
//这里我们将CircleMore类的prototype指向了一个Circle类实例，<br />
//并增加了circumference方法。<br />
function CircleMore(radius){<br />
&nbsp;this.r=radius;<br />
}</font></p>
<p><font face="Courier New">CircleMore.prototype=new Circle(0);</font></p>
<p><font face="Courier New">CircleMore.prototype.circumference=function(){<br />
&nbsp;return 2*Circle.PI*this.r;<br />
}</font></p>
<p><font face="Courier New">这样能够实现对Circle的继承，但是这里存在一点问题：我们直接把CircleMore类的prototype指向了一个Circle类实例，这样就覆盖了JavaScript提供的原型对象，而且抛弃了给定的constructor属性，这样CircleMore的constructor属性就指向了父类Circle的constructor属性。而且这种方式总是使人感觉怪怪的。<br />
<br />
2)Ajax架构Prototype（区别前面提到的prototype哦）的继承方式</font></p>
<p><font face="Courier New">//Prototype框架为Object对象定义了extend方法，<br />
//将source的属性和方法复制到了destination。<br />
Object.extend = function(destination, source) {<br />
&nbsp; for (var property in source)<br />
&nbsp;&nbsp;&nbsp; destination[property] = source[property];<br />
&nbsp; return destination;<br />
};</font></p>
<p><font face="Courier New">//调用<br />
function ParentClass(){...}<br />
function SubClass(){}<br />
SubClass.prototype=Object.extend({<br />
&nbsp;newMethod:function(){<br />
&nbsp;&nbsp;alert("newMethod");<br />
&nbsp;}<br />
},<br />
ParentClass.prototype<br />
);</font></p>
<p><font face="Courier New">3）如果这里对两个参数交换位置，则是对原对象的开展。<br />
例子：通过extend方法对String对象进行了扩展</font></p>
<p><font face="Courier New">Object.extend(String.prototype,{<br />
&nbsp;newMethod:function(){<br />
&nbsp;&nbsp;alert("newMethod");<br />
&nbsp;}<br />
});</font></p>
<p><font style="color: red" face="Courier New">3.多态</font></p>
<p><font face="Courier New">Object.extend = function(destination, source) {<br />
&nbsp; for (var property in source)<br />
&nbsp;&nbsp;&nbsp; destination[property] = source[property];<br />
&nbsp; return destination;<br />
}</font></p>
<p><font face="Courier New">//基类<br />
function base(){}<br />
base.prototype={<br />
&nbsp;initialize:function(){<br />
&nbsp;&nbsp;this.oninit();//调用了一个虚方法<br />
&nbsp;}<br />
}</font></p>
<p><font face="Courier New">//子类SubClassA<br />
function SubClassA(){}<br />
SubClassA.prototype=Object.extend({<br />
&nbsp;//...其它属性方法<br />
&nbsp;prop:"SubClassA",<br />
&nbsp;oninit:function(){<br />
&nbsp;&nbsp;alert(this.prop);<br />
&nbsp;}},<br />
&nbsp;base.prototype<br />
}</font></p>
<p><font face="Courier New">//子类SubClassB<br />
function SubClassB(){}<br />
SubClassB.prototype=Object.extend({<br />
&nbsp;//...其它属性方法<br />
&nbsp;prop:"SubClassB",<br />
&nbsp;oninit:function(){<br />
&nbsp;&nbsp;alert(this.prop);<br />
&nbsp;}},<br />
&nbsp;base.prototype<br />
}</font></p>
<p><font face="Courier New">//调用<br />
var a=new SubClassA();<br />
var b=new SubClassB();</font></p>
<p><font face="Courier New">a.initialize();//输出"SubClassA"<br />
b.initialize();//输出"SubClassB"</font></p>
<p><font face="Courier New"><strong>四、JavaScript与设计模式</strong></font></p>
<p><font style="color: red" face="Courier New">1.Singleton</font></p>
<p><font face="Courier New">function Singleton(){<br />
&nbsp;if(Singleton.caller!=Singleton.getInstance){<br />
&nbsp;&nbsp;throw new Error("Can not new Singleton instance!");<br />
&nbsp;}<br />
&nbsp;this.prop="some string";<br />
&nbsp;//...<br />
}</font></p>
<p><font face="Courier New">Singleton._instance=null;</font></p>
<p><font face="Courier New">Singleton.getInstance=function(){<br />
&nbsp;if(this._instance==null){<br />
&nbsp;&nbsp;this._instance=new Singleton();<br />
&nbsp;}<br />
&nbsp;return this._instance;<br />
}</font></p>
<p><font face="Courier New">var a=Singleton.getInstance();<br />
var b=Singleton.getInstance();<br />
b.prop="another string";<br />
alert(a.prop);//"another string"<br />
alert(b.prop);//"another string"</font></p>
<p><font style="color: red" face="Courier New">2.Factory</font></p>
<p><font face="Courier New">function XMLHttpFactory(){}</font></p>
<p><font face="Courier New">XMLHttpFactory.createXMLHttp=function(){<br />
&nbsp;if(...){<br />
&nbsp;&nbsp;return new XMLHttpRequest();<br />
&nbsp;}<br />
&nbsp;else if(...){<br />
&nbsp;&nbsp;return new ActiveXObject("MSXML2.XMLHttp");<br />
&nbsp;}<br />
&nbsp;...<br />
}</font></p>
<p><font face="Courier New">var xmlhttp=XMLHttpFactory.createXMLHttp();</font></p>
<p><font face="Courier New"><strong>五、备注</strong></font></p>
<p><font face="Courier New">参考资料：<br />
《JavaScript权威指南(第三版)》 中国电力出版社<br />
《JavaScript高级程序设计与应用实例》 人民邮电出版社<br />
&nbsp;Prototype 1.6.0<br />
&nbsp;YUI 2.3.1</font><!-- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:Description rdf:about="http://www.cnblogs.com/charming/archive/2007/11/25/972110.html" dc:identifier="http://www.cnblogs.com/charming/archive/2007/11/25/972110.html" dc:title="JavaScript面向对象编程" trackback:ping="http://www.cnblogs.com/charming/services/trackbacks/972110.aspx"  />
</rdf:RDF>
--></p>
<br />
<br />
注：原文(<font style="background-color: #c7edcc">http://www.cnblogs.com/charming/archive/2007/11/25/972110.html</font>)</div>
</div>
<div id="AjaxHolder_UpdatePanel1">&nbsp;</div>
<img src ="http://www.blogjava.net/agun/aggbug/213822.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2008-07-09 23:00 <a href="http://www.blogjava.net/agun/archive/2008/07/09/213822.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>很好的文章收藏</title><link>http://www.blogjava.net/agun/archive/2008/07/08/213304.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Tue, 08 Jul 2008 05:23:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2008/07/08/213304.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/213304.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2008/07/08/213304.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/213304.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/213304.html</trackback:ping><description><![CDATA[<font style="background-color: #c7edcc">注：原文出处 <font style="background-color: #c7edcc">http://blog.csdn.net/duhongchao/archive/2008/07/07/2620908.aspx<br />
</font><br />
创业路上之领头羊十二条<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 有人说，这是一个网络创富的乱世。充满机会，也充满了风险。<br />
&nbsp;&nbsp;&nbsp; 有人说，这是一块充满悬念的富矿。蕴含黄金，也会遭遇塌方。<br />
&nbsp;&nbsp;&nbsp; 有人说，这是一个竞争激烈的丛林。容易收获，也很容易迷失。<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我都相信。<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 十余年来，互联网成就了一支支让人敬慕的团队。毋庸总结，大成者何故总是结队存在---道理很简单，个人的力量是有限的。乱世中，结队可以增加视野，分担风险；淘金时，结队有效分工，发现和防范风险；竞争丛林中，结伴可以发挥众人智慧，防止迷失。<br />
让人深思的是，在逆境和利益面前， 怎样避免团队瓦解。换言之，如何与团队真正同甘共苦、不离不弃。仅从企业领头人自身，从四个角度，想了个概要，留此存照、备忘。<br />
&nbsp;<br />
一、道德品质<br />
1.做个好人。搞阳谋不搞阴谋。小事情可以玩点技巧，大事情必须能拿到台面上。搞阴谋的大哥最终会被学会了阴谋的兄弟推翻。<br />
2.与团队成员之间可以有个人交情，但不可以有除了团队共同利益之间的见不得人的其它私利。不拿团队利益与某成员做交易。以不道德为核心的团队文化，只会培养不道德的团队，结果无法预见。<br />
3.戒贪婪，戒懒惰，戒奢侈，戒独享，戒怯懦，勤&#8220;看天&#8221;，勤自省，勤学习，勤动手，勤分享。求生存，需洞悉人性弱点，带团队，身教胜过言传。<br />
&nbsp;<br />
二、方向感<br />
1.认准方向。跑错了，跑的越快，死的越早。<br />
2.犹豫时，要看，要听，要想，要试，但更要立即决断。多练决断力，当断不断，必受其乱。<br />
3.感觉不错时，要三省，君子慎独。<br />
&nbsp;<br />
三、志向及结交<br />
1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 做一个人生的攀登者。<br />
2.坚守信仰。成为金钱的主人，而不是奴隶。<br />
3.慎用厚黑术，不与小人谋。不跟消极的人结密友，不跟臭棋篓子下棋。对敬仰的人，学习程门立雪。对同道中人，不惜十顾茅庐。<br />
&nbsp;<br />
四、柔韧度<br />
1.善于发现每个人的长处，总结自己的不足，互补、包容、和谐。雷军说，创业更是发现长板的过程。<br />
2.不绝对，多换位。<br />
3.坚持，坚强，专注、简易。</font>
<img src ="http://www.blogjava.net/agun/aggbug/213304.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2008-07-08 13:23 <a href="http://www.blogjava.net/agun/archive/2008/07/08/213304.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTTP 简介</title><link>http://www.blogjava.net/agun/archive/2008/06/30/211787.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Mon, 30 Jun 2008 15:38:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2008/06/30/211787.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/211787.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2008/06/30/211787.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/211787.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/211787.html</trackback:ping><description><![CDATA[<p align="center"><font style="background-color: #c7edcc"><strong>http 简介（学习笔记）<br />
<br />
</strong></font></p>
<p><font style="background-color: #c7edcc"><strong>简介</strong><br />
<br />
http(Hypertext Transfer Protocol) 超文本传输协议，从1990年开始就在www上广泛应用，是现今www</font><font style="background-color: #c7edcc">上应用最多的协议，目前版本1.1<br />
http是应用层协议，当你上网浏览网页的时候，浏览和web服务器之间就会通过http在internet上进行数</font><font style="background-color: #c7edcc">据的发送和接收。</font><font style="background-color: #c7edcc">http是一个基于请求/响应模式的、无状态的协议。</font></p>
<font style="background-color: #c7edcc">
<p><span style="color: red"><em>http是应用层协议，他要使用下层协议提供的服务，http的连接建立，就是利用传输层的 tcp协议来完成的。</em></span>我们知道tcp是面向连接的协议。一方等待一方发起连接，web服务其连接就是等待的一方，浏览器是发起的一方。默认情况下浏览器与在web服务器80端口上的监听程序建立连接，在internet 上http协议基本上都是基于tcp协议的，但是在internet上不排除 http基于其他协议和网络的http实现方式传输。http只是假定传输是可靠的。因而任何能够提供这种保证都是可以使用的。</p>
<p><strong>持续连接(Persistent Connections)</strong></p>
<p>http1.0中，当连接建立后，浏览器发送一个请求，服务器回应一个消息，之后，连接就被关闭。当浏览器下次请求的时候，需要重新建立连接，很显然这种需要不断建立连接的通信方式造成的开销比较大。早期的web页面通常只包含html文本，因此即使建立连接的开销较大，不会有太大的影响，而现在web页面往往包含多种资源(图片，动画，声音等)，每获取一种资源就建立一次连接这样就增加了http服务器的开销，造成了internet上的信息阻塞。因此在http1.1版中，给出了持续连接的机制，并将其作为http1.1中建立连接的缺省行为。通过这种连接，浏览器可以建立一个连接之后 ，发送请求并得到回应，然后继续发送请求再次得到回应，而其，客户端还可以发送流水线请求，也就是说，客户端可以连续发送多个请求，而不用等待每一个响应的到来。<br />
<br />
</p>
<p><strong>HTTP URL<br />
</strong></p>
<p>http url的格式 如下：<a href="http://host[%22:%22port][abs_path/">http://host[":"port][abs_path</a>]</p>
<p>其中http表示要通过http协议来定位网络资源。host表示合法的internet主机域名或ip地址（以点分十进制的格式表示）。port用于指定一个端口号，拥有被请求资源的服务器主机监听该端口的tcp连接，如果port是空，或者没有给出，则使用缺省的端口80。abs_path指定请求资源的url，如果url中没有给出abs_path那么当它作为请求url时，必须以&#8220;/&#8221;的形式给出。通常，这个工作浏览器就帮我们完成了。我们在浏览器的地址栏中输入<a href="http://www.xx.com/">www.xx.com</a>然后回车，浏览器会默认转换为http://www.xx.com/.<br />
<br />
<span style="color: red"><em>注: URI区别URL<br />
</em><span style="color: red"><em>URI(Uniform Resource Identifier,统一资源标识符)纯粹是一个符号结构,用于指定构成web资源的字符串的各个不同部分.<br />
URL是一种特殊的URI,它包含了用于查找某个资源的足够信息.其它的URI, </em><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#122;&#104;&#97;&#111;&#64;&#115;&#105;&#110;&#97;&#46;&#99;&#111;&#109;"><em>mailto:zhao@sina.com</em></a><em>则不属于URL,因为它里面不存在 根据该标识符来查找的任何数据.这种URI称为URN(通用资源名).<br />
<br />
</em></span></span></p>
<p><strong>HTTP 请求</strong></p>
<p>客户端通过发送HTTP请求向服务器请求资源的访问.</p>
<p><em style="color: red">HTTP 请求由三部分组成 分别是请求行,消息报头,请求正文 .</em></p>
<p>请求行以一个方法符号开头,后面跟着请求URI 和协议的版本,以CRLF作为结尾,请求行以空格分隔,除了作为结尾的CRLF外,不允许出现单独的CR或者LF字符.格式如下: </p>
<p>Method Request-URI HTTP-Version CRLF<br />
Method 表示请求的方法,Request-URI是一个统一资源标识符,标识了要请求的资源,HTTP-Version表示请</p>
<p>求的HTTP协议的版本,如：<br />
<span style="color: red"><em>GET /form.html HTTP/1.1(CRLF).</em></span></p>
<p><strong>HTTP请求</strong><br />
<br />
<br />
<table style="width: 796px; height: 278px; background-color: #ccffcc" cellspacing="2" cellpadding="2" width="796" border="0">
    <tbody>
        <tr>
            <td>方法</td>
            <td>作用</td>
        </tr>
        <tr>
            <td>GET</td>
            <td>请求获取由Request-URI所标识的资源</td>
        </tr>
        <tr>
            <td style="width: 245px; height: 25px">POST</td>
            <td>在Request-URI所标识的资源后附加新的数据 </td>
        </tr>
        <tr>
            <td>HEAD&nbsp;</td>
            <td>请求Request-URI所标识的资源响应消息报头</td>
        </tr>
        <tr>
            <td>PUT</td>
            <td>请求服务器存储一个资源，并用Request-URI作为其标识</td>
        </tr>
        <tr>
            <td>DELETE&nbsp;</td>
            <td>请求服务器删除由Request-URI所标识的资源</td>
        </tr>
        <tr>
            <td>TRACE&nbsp;</td>
            <td>请求服务器回送收到的请求信息，主要用于测试或诊断</td>
        </tr>
        <tr>
            <td>CONNECT</td>
            <td>保留将来使用。</td>
        </tr>
        <tr>
            <td>OPTIONS</td>
            <td>请求查询服务器的性能，或者查询与资源相关的选项和需求。</td>
        </tr>
    </tbody>
</table>
<em><span style="color: red">注：HTTP协议是区分大小写的，但是form表单中的get/post是不区分大小写的。目前http协议中的方法</span><span style="color: red">都是大写的。</span></em></p>
<p>GET 方法用于获取由Request-URI所标识的资源的信息，常见格式：<br />
<span style="color: red"><em>GET Request-URI HTTP/1.1</em></span><br />
当我们通过在浏览器的地址栏中直接输入网址的方式访问网页的时候，浏览器采用的就是 GET 方法向服务器获取资源</p>
<p>POST 方法用于向目的服务器发出请求，要求服务器接受附在请求后面的数据。POST方法在表单提交的时候用的较多。<br />
采用POST方法提交表单的例子：<br />
<em><span style="color: red"><em>POST/reg.jsp HTTP/1.1(CRLF)<br />
Accept:image/gif,image/x-xbit...........(CRLF)<br />
Host:www.xx.com(CRLF)<br />
Content-Length:22(CRLF)<br />
Connection:Keep-Alive(CRLF)<br />
Cache-Control:no-cache(CRLF)<br />
(CRLF)-----到上面的为消息报头<br />
username=sss@password=wwww<br />
上面再两个回车之后就是正文的内容<br />
<br />
</em></span></em>HEAD方法与GET方法几乎是一样的,他们的区别在于HEAD方法只是请求消息报头,而不是完整的内容.对于HEAD请求的回应部分来说,他的HTTP头部分中包含的信息与通过GET请求所得到的信息是相同的,利用这个方法,不必传输这个资源内容,就可以得到Request-URI所标识的资源信息.这个方法通常被用于测试超连接的有效性,是否可以访问,以及最近是否更新.</p>
<p><strong>HTTP响应</strong></p>
<p>在接受和解释请求信息后,服务器会返回一个HTTP响应消息.<br />
<span style="color: red"><em>与HTTP请求类似,HTTP响应也是由三个部分组成,分别是: 状态行，消息报头,响应正文.</em></span></p>
<p>状态行由协议版本,数字形式的状态代码,及相应的状态描述组成,各元素之间一空格分隔,除了结尾的CRLF(回车换行)序列外,不允许出现CR或LF字符.格式如下: <br />
<span style="color: red"><em>HTTP-Version Status-Code Reason-Phrase CRLF</em></span></p>
<p>HTTP-Version 表示服务器HTTP协议的版本,Status-Code表示服务器发回的响应代码,Reason-Phrase表示状态代码的文本描述,CRLF表示回车换行<br />
<span style="color: red"><em>如 : HTTP/1.1 200 OK (CRLF)</em></span></p>
<p>状态代码由3位数字组成，表示请求是否被理解或被满足，状态描述了给出状态码的简短的文本描述。</p>
<p>状态代码的第一个数字定义了响应的类别，后面两位数字没有具体的分类。第一个数字有五种可能的取值：</p>
<p>-1XX：指示信息-表示请求已经接收，继续处理 。<br />
-2XX：成功- 表示请求已经被成功接收、理解、接受。<br />
-3XX：重定向 - 要完成请求必须进行更进一步的操作 。<br />
-4XX：客户端错误 - 请求有语法错误或请求无法实现。<br />
-5XX：服务端粗五 - 服务器未能实现合法的请求。</p>
<p><br />
<strong>HTTP响应-状态代码与状态描述</strong></p>
<p>状态代码&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;状态描述&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 说明</p>
<p>200&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; ok&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;客户端请求成功。<br />
400&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;bad request&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由于客户端请求有语法错误，不能被服务器所理解。<br />
401&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;unauthorized&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;请求未经授权。这个状态代码必须和www-authenticate报头域一起使用。<br />
403&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;forbidden&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;服务器收到请求，但是拒绝提供服务。服务器通常会在响应中文中给出不提供服务的原因。<br />
404&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; not found&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 请求的资源不存在，例如，输入了错误的URL</p>
<p><br />
<strong>HTTP 消息</strong></p>
<p>HTTP 消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行，</p>
<p><span style="color: red"><em>消息报头（可选的），空行（只有CRLF的行），消息正文（可选的）组成。</em></span></p>
<p>对于请求消息，开始行就是请求行，对于响应消息，开始行就是状态行。<br />
<br />
<strong>消息报头</strong></p>
<p><span style="color: red"><em>HTTP 消息报头包括普通报头，请求报头，响应报头，实体报头。<br />
</em></span>每一个报头域都是由名字+":"+空格+值组成，消息报头域的名字是大小写无关的。</p>
<p>普通报头：在普通报头中，有少数报头域应用于所有的请求和响应消息，但并不用于被传输的实体，这些报头域只用于传输的消息。</p>
<p><span style="color: red"><em>cache-Control</em></span></p>
<p>Cache-Control 普通报头域用于指定缓存指令，该指令将被请求/响应链中所有的缓存机制所遵循。这些指令将覆盖缺省的缓存规则。缓存指令是单向的，在请求出现缓存指令，并不意味着在响应中也会出现。此外，在一个消息（请求或响应消息）中指定的缓存指令，并不影响另一个消息的缓冲机制。<br />
<span style="color: red"><em>注意：Cache-Control普通报头是在http1.1中新加的，HTTP1.0 使用的类似报头域为pragma</em></span><br />
缓存指令分为<u>请求时的缓存指令</u>和<u>响应时的缓存指令</u>。<br />
请求时的缓存指令包括no-cache,no-store,max-age,max-stale,min-fresh,only-if-cached;<br />
响应时的缓存指令包括public ,private ,no-cache ,no-store,no-transform,must-revalidate,proxy-revalidate,max-age,s-maxage.<br />
其中最常用的是<span style="color: red"><em>no-cache</em></span>,用于指示请求或响应消息不能缓存。</p>
<p>例如：为了指示ie浏览器（客户端）不要缓存页面，服务器端的jsp程序可以编写下面的代码：<br />
<span style="color: red"><em>response.setHeader("Cache-Control","no-cache");</em></span><br />
这句代码将在发送的响应消息中设置普通报头域：Cache-Control: no-cache</p>
<p><strong>Date</strong></p>
<p>&nbsp;&nbsp;&nbsp; Date普通报头域表示消息产生的日期和时间，可以用于HTTP响应中，也可以用于HTTP请求中，作为</p>
<p>服务器端，应该总是在所有的响应中包含Date报头域。作为客户端只有在发送的消息中包含了消息的正</p>
<p>文的时候，才应该发送Date报头域，例如：在ＰＯＳＴ请求的时候。</p>
<p><strong>Connection</strong></p>
<p>&nbsp;&nbsp;&nbsp; Connection普通报头域允许发送者指定连接的选项。例如指定连接是持续的，或者指定&#8220;close&#8221;选项，通知服务器，在响应完成后，关闭连接。</p>
<p><strong>Accept<br />
</strong><br />
&nbsp;&nbsp; Accept请求报头域用于指定客户端接受哪些类型的信息。例如：Accept:image/gis,表明客户端希望</p>
<p>接受gif图像格式的资源;Accept:text/html,表明客户端希望接受html文本.</p>
<p><strong>Accept-Charset<br />
</strong><br />
&nbsp;&nbsp;&nbsp; Accept-Charset请求报头域用于指定客户端接受的字符串.如:&nbsp; Accept-Charset:iso-8859-1,gb2312.如果在请求消息中没有设置这个域，缺省是任何字符集都可以接受。</p>
<p><strong>Accept-Encoding</strong></p>
<p>&nbsp;&nbsp; Accept-Encoding请求报头域类似于Accept，但是它是用于指定可以接受的内容编码。例如：Accept-Encoding:gzip,deflate.如果请求消息中没有设置这个域，服务器假定客户端对各种内容编码都可以接受。<br />
<br />
<strong>Accept-Language</strong><br />
&nbsp;&nbsp; Accept-Language请求报头域类似于Accept，但是它是用于指定一种自然语言。例如：Accept-Language:zh-ch.如果请求消息中没有设置这个域，服务器假定客户端对各种语言都可以接受。</p>
<p><strong>Authorization</strong><br />
&nbsp;&nbsp; Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时，如果收到服务器响应代码为401（未授权），可以发送一个包含Authorization请求报头域的请求，要求服务器对其进行验证。</p>
<p><strong>Host</strong><br />
&nbsp;&nbsp; Host请求报头域主要用于指定被请求资源的internet主机和端口号，它通常是HTTP URL中提取出来的</p>
<p>例如：<a href="http://www.xx.com/index.html">http://www.xx.com/index.html</a>浏览器发送的请求消息中，就会包含Host请求报头域，如下：<br />
Host:www.xx.com<br />
后面没有跟端口号，表明使用的是缺省端口号80，如果端口号不是80，那么就要在主机后面加上一个冒号（：），然后接上端口号，例如：<br />
Host:www.xx.com:8080<br />
<span style="color: red"><em>注意: 在发送HTTP请求的时候这个报头域是必须的.</em></span></p>
<p><br />
<strong>User-Agent</strong></p>
<p>&nbsp;&nbsp;&nbsp; User-Agent请求报头域允许客户端将他的操作系统，浏览器和其他属性告诉服务器，不过这个报头域不是必须的，如果我们自己编写一个浏览器，不使用User-Agent请求报头域，那么服务器端就无法识别User-Agent中包含的操作系统等信息。</p>
<p>响应报头允许服务器传递不能放在状态行中的附加响应信息，以及关于服务器的信息和Request-URI所标</p>
<p>识的资源进行下一步访问的信息。</p>
<p><strong>Location<br />
</strong><br />
&nbsp;&nbsp;&nbsp; Location响应报头域用于重定向接受者到一个新的位置。例如：客户端所请求的页面已不存在原先的位置，为了让客户端重定向到这个页面新的位置，服务器端可以发回Location响应报头域。这种情况还经常发生在更换域名的时候 ，在旧的域名所对应的服务器上保留一个文件，然后使用重定向语句，让客户端去访问新的域名所对应的服务器上的资源。<br />
Location：http://www.xx.com</p>
<p><strong>Server<br />
</strong><br />
&nbsp;&nbsp; Server响应报头域包了服务器用来处理请求的软件信息。他和User-Agent请求报头域是相对应的，前者发送服务器软件的信息，后者发送客户端软件的信息（浏览器）和操作系统的信息。<br />
<span style="color: red"><em>Server：Apache-Coyote/1.1</em></span></p>
<p><strong>消息报头-实体报头</strong></p>
<p>请求和响应消息都可以传送一个实体，一个实体由实体报头域和实体正文组成，在大多数情况下，实体正文就是请求消息中的请求正文或者响应消息中的响应正文。但是在发送时，并不是说实体报头域和实体正文要在一起发送，例如：有些响应可以包含实体报头域。实体就好像我们写的书信，而在信中，我们可以写上标题，加上页号等，这部分就相当于 是实体报头域，而我们所写的书信的内容，就相当于是实体正文。前面所讲的普通报头，请求报头和响应报头我们可以看成写在信封上的邮编，接收者，发送者等内容。<br />
实体报头定义了关于实体正文（例如：有无实体正文）和请求所标识的资源的元信息。</p>
<p>常用的实体报头</p>
<p><strong>Content-Encoding</strong></p>
<p>&nbsp;&nbsp;&nbsp; Content-Encoding实体报头域被用作媒体类型的修饰符，它的值指示了已经被应用到实体正文的附加内容编码，因而要获得Content-Type报头域中所有引用的媒体类型，必须采用相应的解码机制。</p>
<p>Content-Encoding主要用于记录文档的压缩方法，下面是它的一个例子：<br />
Content-Encoding：gzip<br />
<span style="color: red"><em>&nbsp;如果是一个实体正文采用了编码方式存储，在使用之前就必须进行解码。</em></span></p>
<p><strong>Content-Language<br />
</strong><br />
&nbsp;&nbsp; Content-Languag实体报头域描述了资源所用的自然语言。Content-Language允许用户遵照自身的首选语言来识别和区分实体。如果这个实体内容仅仅打算提供给丹麦的阅读者，那么可以按照如下的方式设置这个实体报头域：<br />
Content-Language：da<br />
<span style="color: red"><em>如果没有指定Content-Language报头域，那么实体内容提供给所有语言的阅读者。</em></span></p>
<p><strong>Content-Length</strong></p>
<p>&nbsp;&nbsp; Content-Length实体报头域用于指名实体正文的长度，以字节方式存储的十进制数据来表示，也就是一个数字字符占一个字节，用其对应的ASCCII码存储传输。</p>
<p><span style="color: red"><em>&nbsp;要注意的是：这个长度仅仅是表示实体正文的长度，没有包括实体报头的长度。</em></span></p>
<p><strong>Content-Type<br />
</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;Content-Type实体报头域用于指明发送给接收者的实体正文的媒体类型。例如：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Content-Type: text/html;charset=iso-8859-1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Content-Type: text/html;charset=gbk<br />
<br />
<strong>Last-Modified<br />
</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp; Last-Modified实体报头域用于指示资源最后的修改日期及时间。</p>
<p><strong>Expires<br />
</strong><br />
&nbsp;&nbsp;&nbsp; Expires实体报头域给出响应过期的日期和时间。通常，代理服务器或浏览器会缓存一些页面，当用户在次访问这些页面时，直接从缓存中加载并显示给用户，这样缩短了响应的时间，减少了服务器的负载。为了让代理服务器或浏览器在一段时间后更新页面，我们可以使用Expires实体报头域指定页面过期的时间。当用户又一次访问页面时，如果Expires报头给出的时间和时间比Date普通报头域给出的日期和时间早（或者相同），那么代理服务器或浏览器就不会再使用缓存的页面，而是从服务器上请求新的页面。不过要注意，即使页面过期了，也并不意味着服务器上的原始资源在此时间之前或者之后发生了改变。<br />
Expires实体报头使用的日期和时间必须是RFC 1123中的日期格式，如<br />
Expires:Thu,15 Sep 2008 16:00:00 GMT<br />
<span style="color: red"><em>HTTP1.1的客户端和缓存必须将其他非法的日期格式（也包括0）看作已经过期。例如，为了让浏览器不要缓存页面，我们也可以利用Expires实体报头域，设置它的值为0，如下：<br />
response.setDateHeader("Expires",0);</em></span></p>
<p><br />
&nbsp;&nbsp; </font></p>
<img src ="http://www.blogjava.net/agun/aggbug/211787.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2008-06-30 23:38 <a href="http://www.blogjava.net/agun/archive/2008/06/30/211787.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>替换技巧</title><link>http://www.blogjava.net/agun/archive/2008/03/03/183358.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Mon, 03 Mar 2008 01:24:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2008/03/03/183358.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/183358.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2008/03/03/183358.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/183358.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/183358.html</trackback:ping><description><![CDATA[<p>一，editplus 正则表达式</p>
<p>^[ \t]*\n 替换所有空白行</p>
<p>[0-9][0-9][0-9][0-9][0-9] 替换数字</p>
<p>二，使用excel去掉重复数据</p>
<p>1、假定要根据A列内容来判断是否有重复,请在其后插入两个空列(即B列和C列)。 <br />
2、在B1单元格输入1,按Ctrl+鼠标左键往下拉到相应行,即形成一个与行号相同的系列数。 <br />
3、选定全表,按A列排序,在C2单元格输入公式: <br />
=IF(A2=A1,"重复","") <br />
将公式用填充柄向下复制到相应行。 <br />
4、选定全表,按C列排序,含有"重复"内容的行将集中在后面,可以一次删除。 （这里不可以排序，因为这里有公式，在进行排序就出现了错误。可以将其复制出来到文本中，然后再复制回去在进行排序这样就可以排序了，把又重复字段的数据一起删除掉）<br />
</p>
 <img src ="http://www.blogjava.net/agun/aggbug/183358.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2008-03-03 09:24 <a href="http://www.blogjava.net/agun/archive/2008/03/03/183358.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>