Web-拾贝

JavaScript MVC框架PK:Angular、Backbone、CanJS与Ember

http://www.csdn.net/article/2013-04-25/2815032-A-Comparison-of-Angular-Backbone-CanJS-and-Emberjavascript

一个好的js method 方法查询的网站, 有browser兼容的介绍

http://help.dottoro.com/ljvtddtm.php
php

HTML转义字符

转义字符串(Escape Sequence)也称字符实体(Character Entity)。在HTML中,定义转义字符串的缘由有两个:css

第一个缘由是像“<”和“>”这类符号已经用来表示HTML标签,所以就不能直接看成文本中的符号来使用。为了在HTML文档中使用这些符号,就须要定义它的转义字符串。当解释程序遇到这类字符串时就把它解释为真实的字符。在输入转义字符串时,要严格遵照字母大小写的规则。html

第二个缘由是,有些字符在ASCII字符集中没有定义,所以须要使用转义字符串来表示。
前端

Browser兼容

 table  的 td 的width 为0 的话, padding(left, right) 的设置了值的话,
在IE 和Chrome 下的显示效果是不同的。
在Chrome中的可能会有一个宽度。




在jsp 中 使用request.getHeader("User-Agent");
IE:
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; CIBA; .NET4.0C; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)


Chrome:
Mozilla/5.0 (Windows NT 5.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36 


Firefox
Mozilla/5.0 (Windows NT 5.2; rv:23.0) Gecko/20100101 Firefox/23.0






window 没有 console 对象




IE 與 FIREFOX 的相容性問題        
由 Kiang 發佈於 08月23日 (23963 次瀏覽)
如下以 IE 代替 Internet Explorer,以 MF 代替 Mozzila Firefox


1. document.form.item 問題
(1)現有問題:
現有程式碼中存在許多 document.formName.item("itemName") 這樣的語法,不能在 MF 下執行
(2)解決方法:
改用 document.formName.elements["elementName"]
(3)其它
參見 2


2. 集合類項目問題
(1)現有問題:
現有程式碼中許多集合類項目取用時使用 (),IE 能接受,MF 不能。
(2)解決方法:
改用 [] 做為下標運算。如:document.forms("formName") 改為 document.forms["formName"]。
又如:document.getElementsByName("inputName")(1) 改為 document.getElementsByName("inputName")[1]
(3)其它


3. window.event
(1)現有問題:
使用 window.event 無法在 MF 上執行
(2)解決方法:
MF 的 event 只能在事件發生的現場使用,此問題暫無法解決。能够這樣變通:
原程式碼(可在IE中執行):
<input type="button" name="someButton" value="提交" οnclick="javascript:gotoSubmit()"/>
...
<script language="javascript">
function gotoSubmit() {
...
alert(window.event); // use window.event
...
}
</script>


新程式碼(可在IE和MF中執行):
<input type="button" name="someButton" value="提交" οnclick="javascript:gotoSubmit(event)"/>
...
<script language="javascript">
function gotoSubmit(evt) {
evt = evt ? evt : (window.event ? window.event : null);
...
alert(evt); // use evt
...
}
</script>
此外,若是新程式碼中第一行不改,與舊程式碼一樣的話(即 gotoSubmit 調用沒有給參數),則仍然只能在IE中執行,但不會出錯。因此,這種方案 tpl 部分仍與舊程式碼兼容。


4. HTML 項目的 id 做為項目名稱的問題
(1)現有問題
在 IE 中,HTML 項目的 ID 能够做為 document 的下屬項目變數名稱直接使用。在 MF 中不能。
(2)解決方法
用 getElementById("idName") 代替 idName 做為項目變數使用。


5. 用idName字串取得項目的問題
(1)現有問題
在IE中,利用 eval(idName) 能够取得 id 為 idName 的 HTML 項目,在MF 中不能。
(2)解決方法
用 getElementById(idName) 代替 eval(idName)。


6. 變數名稱與某 HTML 項目 id 相同的問題
(1)現有問題
在 MF 中,因為項目 id 不做為 HTML 項目的名稱,因此能够使用與 HTML 項目 id 相同的變數名稱,IE 中不能。
(2)解決方法
在宣告變數時,一概加上 var ,以免歧義,這樣在 IE 中亦可正常執行。
此外,最好不要取與 HTML 項目 id 相同的變數名稱,以減少錯誤。
(3)其它
參見 問題4


7. event.x 與 event.y 問題
(1)現有問題
在IE 中,event 項目有 x, y 屬性,MF中沒有。
(2)解決方法
在MF中,與event.x 等效的是 event.pageX。但event.pageX IE中沒有。
故採用 event.clientX 代替 event.x。在IE 中也有這個變數。
event.clientX 與 event.pageX 有微妙的差別(當整個頁面有滾動條的時候),不過大多數時候是等效的。


若是要彻底一樣,能够稍麻煩些:
mX = event.x ? event.x : event.pageX;
然後用 mX 代替 event.x
(3)其它
event.layerX 在 IE 與 MF 中都有,具體意義有無差別还没有試驗。




8. 關於frame
(1)現有問題
在 IE中 能够用window.testFrame取得該frame,mf中不行
(2)解決方法
在frame的使用方面mf和ie的最主要的區別是:
若是在frame標籤中書寫了如下屬性:
<frame src="xx.htm" id="frameId" name="frameName" />
那麼ie能够通過id或者name訪問這個frame對應的window項目
而mf只能够通過name來訪問這個frame對應的window項目
例如若是上述frame標籤寫在最上層的window裡面的htm裡面,那麼能够這樣訪問
ie: window.top.frameId或者window.top.frameName來訪問這個window項目
mf: 只能這樣window.top.frameName來訪問這個window項目


另外,在mf和ie中均可以使用window.top.document.getElementById("frameId")來訪問frame標籤
並且能够通過window.top.document.getElementById("testFrame").src = 'xx.htm'來切換frame的內容
也均可以通過window.top.frameName.location = 'xx.htm'來切換frame的內容
關於frame和window的描述能够參見bbs的『window與frame』文章
以及/test/js/test_frame/目錄下面的測試
----adun 2004.12.09修改


9. 在mf中,本身定義的屬性必須getAttribute()取得
10.在mf中沒有 parentElement parement.children 而用
parentNode parentNode.childNodes
childNodes的下標的含義在IE和MF中不一样,MF使用DOM規範,childNodes中會插入空白文本節點。
通常能够通過node.getElementsByTagName()來迴避這個問題。
當html中節點缺失時,IE和MF對parentNode的解釋不一样,例如
<form>
<table>
<input/>
</table>
</form>
MF中input.parentNode的值為form, 而IE中input.parentNode的值為空節點


MF中節點沒有removeNode方法,必須使用以下方法 node.parentNode.removeChild(node)


11.const 問題
(1)現有問題:
在 IE 中不能使用 const 關鍵字。如 const constVar = 32; 在IE中這是語法錯誤。
(2)解決方法:
不使用 const ,以 var 代替。


12. body 項目
MF的body在body標籤沒有被瀏覽器彻底讀入以前就存在,而IE則必須在body彻底被讀入之後才存在


13. url encoding
在js中若是書寫url就直接寫&不要寫&例如var url = 'xx.jsp?objectName=xx&objectEvent=xxx';
frm.action = url那麼颇有可能url不會被正常顯示以致於參數沒有正確的傳到服務器
通常會服務器報錯參數沒有找到
當然若是是在tpl中例外,因為tpl中符合xml規範,要求&書寫為&
通常MF無法識別js中的&




14. nodeName 和 tagName 問題
(1)現有問題:
在MF中,全部節點均有 nodeName 值,但 textNode 沒有 tagName 值。在 IE 中,nodeName 的使用好像
有問題(具體情況沒有測試,但个人IE已經死了好幾次)。
(2)解決方法:
使用 tagName,但應檢測其是否為空。


15. 元素屬性
IE下 input.type屬性為只讀,可是MF下能够修改




16. document.getElementsByName() 和 document.all[name] 的問題
(1)現有問題:
在 IE 中,getElementsByName()、document.all[name] 均不能用來取得 div 元素(是否還有其它不能取的元素還不知道)。
來源: webjx.com 整理 (責任編輯:webjx)






 1. document.form.item 问题
(1)现有问题:
现有代码中存在许多 document.formName.item("itemName") 这样的语句,不能在Firefox(火狐)下运行
(2)解决方法:
改用 document.formName.elements["elementName"]
(3)其它
参见 2


2. 集合类对象问题
(1)现有问题:
现有代码中许多集合类对象取用时使用 (),IE 能接受,Firefox(火狐)不能。
(2)解决方法:
改用 [] 做为下标运算。如:document.forms("formName") 改成 document.forms["formName"]。
又如:document.getElementsByName("inputName")(1) 改成 document.getElementsByName("inputName")[1]
(3)其它


3. window.event
(1)现有问题:
使用 window.event 没法在火狐浏览器上运行
(2)解决方法:
火狐 的 event 只能在事件发生的现场使用,此问题暂没法解决。能够这样变通:
原代码(可在IE中运行): <br /><input type="button" name="someButton" value="提交" οnclick="javascript:gotoSubmit()"/><br />...<br /><script language="javascript"><br />function gotoSubmit() {<br />...<br />alert(window.event); // use window.event<br />...<br />}<br /></script>


新代码(可在IE和火狐中运行): <input type="button" name="someButton" value="提交" οnclick="javascript:gotoSubmit(event)"/><br />...<br /><script language="javascript"><br />function gotoSubmit(evt) {<br />evt = evt ? evt : (window.event ? window.event : null);<br />...<br />alert(evt); // use evt<br />...<br />}<br /></script>
此外,若是新代码中第一行不改,与老代码同样的话(即 gotoSubmit 调用没有给参数),则仍然只能在IE中运行,但不会出错。因此,这种方案 tpl 部分仍与老代码兼容。


4. HTML 对象的 id 做为对象名的问题
(1)现有问题
在 IE 中,HTML 对象的 ID 能够做为 document 的下属对象变量名直接使用。在火狐中不能。
(2)解决方法
用 getElementById("idName") 代替 idName 做为对象变量使用。


5. 用idName字符串取得对象的问题
(1)现有问题
在IE中,利用 eval(idName) 能够取得 id 为 idName 的 HTML 对象,在火狐中不能。
(2)解决方法
用 getElementById(idName) 代替 eval(idName)。


6. 变量名与某 HTML 对象 id 相同的问题
(1)现有问题
在 火狐 中,由于对象 id 不做为 HTML 对象的名称,因此能够使用与 HTML 对象 id 相同的变量名,IE中能。
(2)解决方法
在声明变量时,一概加上 var ,以免歧义,这样在 IE 中亦可正常运行。
此外,最好不要取与 HTML 对象 id 相同的变量名,以减小错误。
(3)其它
参见 问题4


7. event.x 与 event.y 问题
(1)现有问题
在IE 中,event 对象有 x, y 属性,火狐中没有。
(2)解决方法
在火狐中,与event.x 等效的是 event.pageX。但event.pageX IE中没有。
故采用 event.clientX 代替 event.x。在IE 中也有这个变量。
event.clientX 与 event.pageX 有微妙的差异(当整个页面有滚动条的时候),不过大多数时候是等效的。


若是要彻底同样,能够稍麻烦些:
mX = event.x ? event.x : event.pageX;
而后用 mX 代替 event.x
(3)其它
event.layerX 在IE与火狐中都有,具体意义有无差异还没有试验。


8. 关于frame
(1)现有问题
在 IE中 能够用window.testFrame取得该frame,火狐中不行
(2)解决方法
在frame的使用方面火狐和ie的最主要的区别是:
若是在frame标签中书写了如下属性:
<frame src="xx.htm" id="frameId" name="frameName" />
那么ie能够经过id或者name访问这个frame对应的window对象
而火狐只能够经过name来访问这个frame对应的window对象
例如若是上述frame标签写在最上层的window里面的htm里面,那么能够这样访问
ie: window.top.frameId或者window.top.frameName来访问这个window对象
火狐: 只能这样window.top.frameName来访问这个window对象


另外,在火狐和ie中均可以使用window.top.document.getElementById("frameId")来访问frame标签
而且能够经过window.top.document.getElementById("testFrame").src = 'xx.htm'来切换frame的内容
也均可以经过window.top.frameName.location = 'xx.htm'来切换frame的内容
关于frame和window的描述能够参见bbs的‘window与frame’文章
以及/test/js/test_frame/目录下面的测试
----adun 2004.12.09修改


9. 在火狐中,本身定义的属性必须getAttribute()取得
10.在火狐中没有 parentElement parement.children 而用
parentNode parentNode.childNodes
childNodes的下标的含义在IE和火狐中不一样,火狐使用DOM规范,childNodes中会插入空白文本节点。
通常能够经过node.getElementsByTagName()来回避这个问题。
当html中节点缺失时,IE和火狐对parentNode的解释不一样,例如
<form>
<table>
<input/>
</table>
</form>
火狐中input.parentNode的值为form, 而IE中input.parentNode的值为空节点


火狐中节点没有removeNode方法,必须使用以下方法 node.parentNode.removeChild(node)


11.const 问题
(1)现有问题:
在 IE 中不能使用 const 关键字。如 const constVar = 32; 在IE中这是语法错误。
(2)解决方法:
不使用 const ,以 var 代替。


12. body 对象
火狐的body在body标签没有被浏览器彻底读入以前就存在,而IE则必须在body彻底被读入以后才存在


13. url encoding
在js中若是书写url就直接写&不要写&amp;例如var url = 'xx.jsp?objectName=xx&amp;objectEvent=xxx';
frm.action = url那么颇有可能url不会被正常显示以致于参数没有正确的传到服务器
通常会服务器报错参数没有找到
固然若是是在tpl中例外,由于tpl中符合xml规范,要求&书写为&amp;
通常火狐没法识别js中的&amp;


14. nodeName 和 tagName 问题
(1)现有问题:
在火狐中,全部节点均有 nodeName 值,但 textNode 没有 tagName 值。在 IE 中,nodeName 的使用好象
有问题(具体状况没有测试,但个人IE已经死了好几回)。
(2)解决方法:
使用 tagName,但应检测其是否为空。


15. 元素属性
IE下 input.type属性为只读,可是火狐下能够修改


16. document.getElementsByName() 和 document.all[name] 的问题
(1)现有问题:
在 IE 中,getElementsByName()、document.all[name] 均不能用来取得 div 元素(是否还有其它不能取的元素还不知道)。
分享到:






11. chrome不支持modalDiaolog
returnValue也获取不了值
需使用window.opener.returnValue


10.
Firefox 的JRE插件安装


9. safari  -- 苹果
   opera 是挪威欧普拉软件公司开发的


8. 判断用户浏览器类型
navigator.userAgent是描述用户代理信息


7.
java.security.cert.CertificateParsingException: no more data allowed for version 1 certificate
出现这个错误的缘由是数字证书的版本低了。
可能这个数字证书和当前运行的程序没有关系。 能够在IE--> Tools-->Internet Options里的证书里面去找
版本为V1 的, 删掉就能够了


6.
Apparently, in internet explorer 8, addToFavorites() MUST be called manually via user action, not onload or through other event. This is to prevent abuse, but it is very burdensome in certain instances. To get around this, on load, I trigger a pop-up that says "Are you sure you want to add this page to favorites?". When the end user clicks the "yes" button, this button triggers the addToFavorites() method. Which then triggers the real add to favorites popup. This is not a great solution, since it adds an extraneous pop-up, but it works.


Windows Internet Explorer 8 and later. For security reasons, the AddFavorite method must be called as a response to a user-initiated action, such a mouse click. If called from a different context, such as the onload event of the body element, the AddFavorite method fails silently.




5.    IE9如下直接能够使用window.external.AddFavorite(url,title)添加收藏
     firefox、safari等定义了 window.sidebar能够使用window.sidebar.addPanel(title,url,"") 
    opera 须要经过rel=sidebar的a标签(<a href="url" title="title" rel="sidebar">添加收藏</a> ) 点击来实现 可是动态建立这种a标签是不行的(document.createElement('a')) onclick 返回值为false是不行的(οnclick="return false;")
     chrome 等就只能用户本身来按Ctrl+D了


        
function AddFavorite(elem,url,title)
{
    if(window.sidebar){//Firefox
        window.sidebar.addPanel(title,url,"");
        return false;
    }else if(window.external && window.external.AddFavorite){//IE
        window.external.AddFavorite(url,title);
        return false;
    }else if(window.opera && window.print){//Opera Hotlist
        elem.setAttribute('href',url);
        elem.setAttribute('title',title);
        elem.setAttribute('rel','sidebar');
        elem.click();
        return true;
    }else{//Other browser,For example:opera chrome
        alert(title+"\n"+url+"\n请使用快捷键 Ctrl+D 来手动添加书签!");
        return false;
    }
}


Chrome官方解释,在设计时就决定了不容许经过js代码添加收藏。若是用户喜欢你的站点的话,他彻底能够本身来。经过Ctrl+D快捷键或者地址栏的chrome addfavorite star来添加书签收藏。


 


4.
IE8出于安全性的考虑,上传文件时屏蔽了真实的本地文件路径,而以“C:\fakepath\”取代之。
能够经过设置浏览器安全选项获得真实路径:
    Internet选项 -> 安全 -> 自定义级别 -> 将本地文件上载至服务器时包含本地目录路径 -> 选“启动” -> 肯定






=================================================================================================================


这是我总结多年的一个小文档,主要内容是Javascript和CSS浏览器兼容总结,最近看见有人咨询浏览器兼容的问题,就贡献出来。


并不必定全,有的也可能不许确,好比新出的IE八、Chrome等都没有太多涉及,虽然最近作的一些项目也兼容了IE八、Chrome等,但都没来的及总结进去,后来就忘了…汗。你们一块儿慢慢完善吧。




3. web开发调试利器
http://www.css88.com/archives/965


2. 不一样浏览器对JavaScript的Date对象的支持
http://www.sj33.cn/jc/wyjc/jsjc/200610/10226.html


javascript部分
1. document.form.item 问题
问题:
代码中存在 document.formName.item(“itemName”) 这样的语句,不能在FF下运行
解决方法:
改用 document.formName.elements["elementName"]


2. 集合类对象问题
问题:
代码中许多集合类对象取用时使用(),IE能接受,FF不能
解决方法:
改用 [] 做为下标运算,例:
document.getElementsByName(“inputName”)(1) 改成 document.getElementsByName(“inputName”)[1]


3. window.event
问题:
使用 window.event 没法在FF上运行
解决方法:
FF的 event 只能在事件发生的现场使用,此问题暂没法解决。能够把 event 传到函数里变通解决:
onMouseMove = “functionName(event)”
function functionName (e) {
  e = e || window.event;
  ……
}


4. HTML对象的 id 做为对象名的问题
问题:
在IE中,HTML对象的 ID 能够做为 document 的下属对象变量名直接使用,在FF中不能
解决方法:
使用对象变量时所有用标准的 getElementById(“idName”)


5. 用 idName 字符串取得对象的问题
问题:
在IE中,利用 eval(“idName”) 能够取得 id 为 idName 的HTML对象,在FF中不能
解决方法:
用 getElementById(“idName”) 代替 eval(“idName”)


6. 变量名与某HTML对象 id 相同的问题
问题:
在FF中,由于对象 id 不做为HTML对象的名称,因此能够使用与HTML对象 id 相同的变量名,IE中不能
解决方法:
在声明变量时,一概加上 var ,以免歧义,这样在IE中亦可正常运行
最好不要取与HTML对象 id 相同的变量名,以减小错误


7. event.x 与 event.y 问题
问题:
在IE中,event 对象有x,y属性,FF中没有
解决方法:
在FF中,与 event.x 等效的是 event.pageX ,但event.pageX IE中没有
故采用 event.clientX 代替 event.x ,在IE中也有这个变量
event.clientX 与 event.pageX 有微妙的差异,就是滚动条
要彻底同样,能够这样:
mX = event.x ? event.x : event.pageX;
而后用 mX 代替 event.x


8. 关于frame
问题:
在IE中能够用 window.testFrame 取得该frame,FF中不行
解决方法:
window.top.document.getElementById(“testFrame”).src = ‘xx.htm’
window.top.frameName.location = ‘xx.htm’


9. 取得元素的属性
在FF中,本身定义的属性必须 getAttribute() 取得


10. 在FF中没有 parentElement,parement.children 而用 parentNode,parentNode.childNodes
问题:
childNodes 的下标的含义在IE和FF中不一样,FF的 childNodes 中会插入空白文本节点
解决方法:
能够经过 node.getElementsByTagName() 来回避这个问题
问题:
当html中节点缺失时,IE和FF对 parentNode 的解释不一样,例如:
<form>
<table>
<input/>
</table>
</form>
FF中 input.parentNode 的值为form,而IE中 input.parentNode 的值为空节点
问题:
FF中节点本身没有 removeNode 方法
解决方法:
必须使用以下方法 node.parentNode.removeChild(node)


11. const 问题
问题:
在IE中不能使用 const 关键字
解决方法:
以 var 代替


12. body 对象
FF的 body 在 body 标签没有被浏览器彻底读入以前就存在,而IE则必须在 body 彻底被读入以后才存在
这会产生在IE下,文档没有载入完时,在body上appendChild会出现空白页面的问题
解决方法:
一切在body上插入节点的动做,所有在onload后进行


13. url encoding
问题:
通常FF没法识别js中的&
解决方法:
在js中若是书写url就直接写&不要写&


14. nodeName 和 tagName 问题
问题:
在FF中,全部节点均有 nodeName 值,但 textNode 没有 tagName 值,在IE中,nodeName 的使用有问题
解决方法:
使用 tagName,但应检测其是否为空


15. 元素属性
IE下 input.type 属性为只读,可是FF下能够修改


16. document.getElementsByName() 和 document.all[name] 的问题
问题:
在IE中,getElementsByName()、document.all[name] 均不能用来取得 div 元素
是否还有其它不能取的元素还不知道(这个问题还有争议,还在研究中)


17. 调用子框架或者其它框架中的元素的问题
框架问题繁体字网的前段设计师曾作过详细的讲解,简单来讲,在IE中,能够用以下方法来取得子元素中的值
document.getElementById(“frameName”).(document.)elementName
window.frames["frameName"].elementName
在FF中则须要改为以下形式来执行,与IE兼容:
window.frames["frameName"].contentWindow.document.elementName
window.frames["frameName"].document.elementName


18. 对象宽高赋值问题
问题:
FireFox中相似 obj.style.height = imgObj.height 的语句无效
解决方法:
统一使用 obj.style.height = imgObj.height + “px”;


19. innerText的问题
问题:
innerText 在IE中能正常工做,可是 innerText 在FireFox中却不行
解决方法:
在非IE浏览器中使用textContent代替innerText


20. event.srcElement和event.toElement问题
问题:
IE下,even对象有srcElement属性,可是没有target属性;Firefox下,even对象有target属性,可是没有srcElement属性
解决方法:
var source = e.target || e.srcElement;
var target = e.relatedTarget || e.toElement;


21. 禁止选取网页内容
问题:
FF须要用CSS禁止,IE用JS禁止
解决方法:
IE: obj.onselectstart = function() {return false;}
FF: -moz-user-select:none;


22. 捕获事件
问题:
FF没有setCapture()、releaseCapture()方法
解决方法:
IE:
obj.setCapture();
obj.releaseCapture();
FF:
window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP);
window.releaseEvents(Event.MOUSEMOVE|Event.MOUSEUP);
if (!window.captureEvents) {
  o.setCapture();
}else {
  window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP);
}
if (!window.captureEvents) {
  o.releaseCapture();
}else {
  window.releaseEvents(Event.MOUSEMOVE|Event.MOUSEUP);
}


CSS部分


div类


1. 居中问题
div里的内容,IE默认为居中,而FF默认为左对齐
能够尝试增长代码margin:auto


2. 高度问题
两上下排列或嵌套的div,上面的div设置高度(height),若是div里的实际内容大于所设高度,在FF中会出现两个div重叠的现象;但在IE中,下面的div会自动给上面的div让出空间
因此为避免出现层的重叠,高度必定要控制恰当,或者干脆不写高度,让他自动调节,比较好的方法是 height:100%;
但当这个div里面一级的元素都float了的时候,则须要在div块的最后,闭和前加一个沉底的空div,对应CSS是:
.float_bottom {clear:both;height:0px;font-size:0px;padding:0;margin:0;border:0;line-height:0px;overflow:hidden;}


3. clear:both;
不想受到float浮动的,就在div中写入clear:both;


4. IE浮动 margin 产生的双倍距离
#box {
float:left;
width:100px;
margin:0 0 0 100px; //这种状况之下IE会产生200px的距离
display:inline; //使浮动忽略
}


5. padding 问题
FF设置 padding 后,div会增长 height 和 width,但IE不会 (* 标准的 XHTML1.0 定义 dtd 好像一致了)
高度控制恰当,或尝试使用 height:100%;
宽度减小使用 padding
但根据实际经验,通常FF和IE的 padding 不会有太大区别,div 的实际宽 = width + padding ,因此div写全 width 和 padding,width 用实际想要的宽减去 padding 定义


6. div嵌套时 y 轴上 padding 和 marign 的问题
FF里 y 轴上 子div 到 父div 的距离为 父padding + 子marign
IE里 y 轴上 子div 到 父div 的距离为 父padding 和 子marign 里大的一个
FF里 y 轴上 父padding=0 且 border=0 时,子div 到 父div 的距离为0,子marign 做用到 父div 外面


7. padding,marign,height,width 的傻瓜式解决技巧
注意是技巧,不是方法:
写好标准头
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
高尽可能用padding,慎用margin,height尽可能补上100%,父级height有定值子级height不用100%,子级全为浮动时底部补个空clear:both的div
宽尽可能用margin,慎用padding,width算准实际要的减去padding


列表类


1. ul 标签在FF中默认是有 padding 值的,而在IE中只有margin有值
先定义 ul {margin:0;padding:0;}


2. ul和ol列表缩进问题
消除ul、ol等列表的缩进时,样式应写成: {list-style:none;margin:0px;padding:0px;}


显示类


1. display:block,inline 两个元素
display:block; //能够为内嵌元素模拟为块元素
display:inline; //实现同一行排列的的效果
display:table; //for FF,模拟table的效果
display:block 块元素,元素的特色是:
老是在新行上开始;
高度,行高以及顶和底边距均可控制;
宽度缺省是它的容器的100%,除非设定一个宽度
<div>,<p>,<h1>,<form>,<ul> 和 <li> 是块元素的例子
display:inline 就是将元素显示为行内元素,元素的特色是:
和其余元素都在一行上;
高,行高及顶和底边距不可改变;
宽度就是它的文字或图片的宽度,不可改变。
<span>,<a>,<label>,<input>,<img>,<strong> 和 <em> 是 inline 元素的例子


2. 鼠标手指状显示
所有用标准的写法 cursor: pointer;


背景、图片类


1. background 显示问题
所有注意补齐 width,height 属性


2. 背景透明问题
IE: filter: progid: DXImageTransform.Microsoft.Alpha(style=0,opacity=60);
IE: filter: alpha(opacity=10);
FF: opacity:0.6;
FF: -moz-opacity:0.10;
最好两个都写,并将opacity属性放在下面
java

认证

一.   BASIC认证概述


在HTTP协议进行通讯的过程当中,HTTP协议定义了基本认证过程以容许HTTP服务器对WEB浏览器进行用户身份证的方法,当一个客户端向HTTP服务 器进行数据请求时,若是客户端未被认证,则HTTP服务器将经过基本认证过程对客户端的用户名及密码进行验证,以决定用户是否合法。客户端在接收到HTTP服务器的身份认证要求后,会提示用户输入用户名及密码,而后将用户名及密码以BASE64加密,加密后的密文将附加于请求信息中, 如当用户名为anjuta,密码为:123456时,客户端将用户名和密码用“:”合并,并将合并后的字符串用BASE64加密为密文,并于每次请求数据 时,将密文附加于请求头(Request Header)中。HTTP服务器在每次收到请求包后,根据协议取得客户端附加的用户信息(BASE64加密的用户名和密码),解开请求包,对用户名及密码进行验证,若是用 户名及密码正确,则根据客户端请求,返回客户端所须要的数据;不然,返回错误代码或从新要求客户端提供用户名及密码。


二.   BASIC认证的过程


1.  客户端向服务器请求数据,请求的内容多是一个网页或者是一个其它的MIME类型,此时,假设客户端还没有被验证,则客户端提供以下请求至服务器:


Get /index.html HTTP/1.0
Host:www.google.com


2.  服务器向客户端发送验证请求代码401,服务器返回的数据大抵以下:


HTTP/1.0 401 Unauthorised
Server: SokEvo/1.0
WWW-Authenticate: Basic realm="google.com"
Content-Type: text/html
Content-Length: xxx


3.  当符合http1.0或1.1规范的客户端(如IE,FIREFOX)收到401返回值时,将自动弹出一个登陆窗口,要求用户输入用户名和密码。


4.  用户输入用户名和密码后,将用户名及密码以BASE64加密方式加密,并将密文放入前一条请求信息中,则客户端发送的第一条请求信息则变成以下内容:


Get /index.html HTTP/1.0
Host:www.google.com
Authorization: Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxx


注:xxxx....表示加密后的用户名及密码。


5.  服务器收到上述请求信息后,将Authorization字段后的用户信息取出、解密,将解密后的用户名及密码与用户数据库进行比较验证,如用户名及密码正确,服务器则根据请求,将所请求资源发送给客户端:


三.         BASIC认证的缺点


HTTP基本认证的目标是提供简单的用户验证功能,其认证过程简单明了,适合于对安全性要求不高的系统或设备中,如你们所用路由器的配置页面的认证,几乎 都采起了这种方式。其缺点是没有灵活可靠的认证策略,如没法提供域(domain或realm)认证功能,另外,BASE64的加密强度很是低,能够说仅 能防止sohu的搜索把它搜到了。固然,HTTP基本认证系统也能够与SSL或者Kerberos结合,实现安全性能较高(相对)的认证系统


四.         BASIC认证的JAVA实现代码


 


HttpSession session=request.getSession();


         String user=(String)session.getAttribute("user");


         String pass;


         if(user==null){


             try{


                response.setCharacterEncoding("GBK");


                PrintWriter ut=response.getWriter();


                String authorization=request.getHeader("authorization");


                if(authorization==null||authorization.equals("")){


                    response.setStatus(401);


                    response.setHeader("WWW-authenticate","Basic realm=\"请输入管理员密码\"");


                    out.print("对不起你没有权限!!");


                    return;


                }


                String userAndPass=new String(new BASE64Decoder().decodeBuffer(authorization.split(" ")[1]));


                if(userAndPass.split(":").length<2){


                    response.setStatus(401);


                    response.setHeader("WWW-authenticate","Basic realm=\"请输入管理员密码\"");


                    out.print("对不起你没有权限!!");


                    return;


                }


                user=userAndPass.split(":")[0];


                pass=userAndPass.split(":")[1];


                if(user.equals("111")&&pass.equals("111")){


                    session.setAttribute("user",user);


                    RequestDispatcher dispatcher=request.getRequestDispatcher("index.jsp");


                    dispatcher.forward(request,response);


                }else{


                    response.setStatus(401);


                    response.setHeader("WWW-authenticate","Basic realm=\"请输入管理员密码\"");


                    out.print("对不起你没有权限!!");


                    return;


                }


             }catch(Exception ex){


                ex.printStackTrace();


             }


         }else{


             RequestDispatcher dispatcher=request.getRequestDispatcher("index.jsp");


             dispatcher.forward(request,response);


       }
node

js basic

js get operator system


http://stackoverflow.com/questions/13487856/get-specific-windows-version-by-javascript
http://stackoverflow.com/questions/4006420/detect-windows-version-with-javascript






SearchResultTemplate.jsp?CHART_SN=51%26DATA_SN=37%26VIEW=V_PROJECT_CONFIG_VIEW


CHART_SN=51&DATA_SN=37&VIEW=V_PROJECT_CONFIG_VIEW


在iframe 中 , %26 和 & 的转化




Javascript 最佳实践
1. 第一次给变量赋值时,别忘记var关键字
给一个未声明的变量赋值,该变量会被自动建立为全局变量,在JS开发中,应该避免使用全局变量。
2. 使用===替换==
[10]  == 10
   var s1 = [10];
   var s2 = 10;
   alert(s1==s2);
3. 使用分号来做为行终止字符 
4. 建立构造函数
    function Person(firstName, lastName){  
        this.firstName =  firstName;  
        this.lastName = lastName;          
    }    
      
    var Saad = new Person("Saad", "Mousliki");  
5. 应当当心使用typeof、instanceof和constructor 
    var arr = ["a", "b", "c"];  
    typeof arr;   // return "object"   
    arr  instanceof Array // true  
    arr.constructor();  //[]  
6. 建立一个Self-calling函数 ,  被称为自我调用的匿名函数或当即调用函数表达式(LLFE)
    (function(){  
        // some private code that will be executed automatically  
    })();    
    (function(a,b){  
        var result = a+b;  
        return result;  
    })(10,20) 
7.  给数组建立一个随机项 
    var items = [12, 548 , 'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' , 2145 , 119];  
      
    var  randomItem = items[Math.floor(Math.random() * items.length)];
8.   在特定范围里得到一个随机数 
    var x = Math.floor(Math.random() * (max - min + 1)) + min;  
9. 在数字0和最大数之间生成一组随机数 
var numbersArray = [] , max = 100;  
  
for( var i=1; numbersArray.push(i++) < max;);  // numbers = [0,1,2,3 ... 100]


10 . 生成一组随机的字母数字字符 
    function generateRandomAlphaNum(len) {  
        var rdmstring = "";  
        for( ; rdmString.length < len; rdmString  += Math.random().toString(36).substr(2));  
        return  rdmString.substr(0, len);  
      
    }  
11.打乱数字数组 
var numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411];  
numbers = numbers.sort(function(){ return Math.random() - 0.5});  
/* the array numbers will be equal for example to [120, 5, 228, -215, 400, 458, -85411, 122205]  */ 
12. 字符串tim函数 
String.prototype.trim = function(){return this.replace(/^\s+|\s+$/g, "");};   
13. 数组追加 
var array1 = [12 , "foo" , {name "Joe"} , -2458];  
  
var array2 = ["Doe" , 555 , 100];  
Array.prototype.push.apply(array1, array2);  
/* array1 will be equal to  [12 , "foo" , {name "Joe"} , -2458 , "Doe" , 555 , 100] */
14. 将参数对象转换为数组 
    var argArray = Array.prototype.slice.call(arguments);  
15. 验证一个给定参数是否为数字 
function isNumber(n){  
    return !isNaN(parseFloat(n)) && isFinite(n);  

16. 验证一个给定的参数为数组
    function isArray(obj){  
        return Object.prototype.toString.call(obj) === '[object Array]' ;  
    }  
注意,若是toString()方法被重写了,你将不会获得预期结果。


或者你能够这样写:


[js] view plaincopy在CODE上查看代码片派生到个人代码片


    Array.isArray(obj); // its a new Array method  


一样,若是你使用多个frames,你能够使用instancesof,若是内容太多,结果一样会出错。


[js] view plaincopy在CODE上查看代码片派生到个人代码片


    var myFrame = document.createElement('iframe');  
    document.body.appendChild(myFrame);  
      
    var myArray = window.frames[window.frames.length-1].Array;  
    var arr = new myArray(a,b,10); // [a,b,10]    
      
    // instanceof will not work correctly, myArray loses his constructor   
    // constructor is not shared between frames  
    arr instanceof Array; // false  
17. 从数字数组中得到最大值和最小值
    var  numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411];   
    var maxInNumbers = Math.max.apply(Math, numbers);   
    var minInNumbers = Math.min.apply(Math, numbers);  
18.清空数组
    var myArray = [12 , 222 , 1000 ];    
    myArray.length = 0; // myArray will be equal to [].  
19. 不要用delete从数组中删除项目
开发者能够使用split来代替使用delete来删除数组项。与其删除数组中未定义项目,还不如使用delete来替代。 


var items = [12, 548 ,'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' ,2154 , 119 ];   
items.length; // return 11   
delete items[3]; // return true   
items.length; // return 11   
/* items will be equal to [12, 548, "a", undefined × 1, 5478, "foo", 8852, undefined × 1, "Doe", 2154,       119]   */
也能够…… 
var items = [12, 548 ,'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' ,2154 , 119 ];   
items.length; // return 11   
items.splice(3,1) ;   
items.length; // return 10   
/* items will be equal to [12, 548, "a", 5478, "foo", 8852, undefined × 1, "Doe", 2154,       119]   */


delete方法应该删除一个对象属性。 


20.使用length属性缩短数组
如上文提到的清空数组,开发者还能够使用length属性缩短数组。
    var myArray = [12 , 222 , 1000 , 124 , 98 , 10 ];    
    myArray.length = 4; // myArray will be equal to [12 , 222 , 1000 , 124].  
若是你所定义的数组长度值太高,那么数组的长度将会改变,而且会填充一些未定义的值到数组里,数组的length属性不是只读的。 
    myArray.length = 10; // the new array length is 10   
    myArray[myArray.length - 1] ; // undefined  






<script src="/folder/file.js"></script> 


以上须要加上工程名 相似样,才能找到js 文件  <script src="/工程名/folder/file.js"></script> 




页面自动跳转:
<TITLE>ALPS Dashboard</TITLE>
<META name="description" content="ALPS Dashboard Forward">
<META name="keywords" content="ALPS Dashboard">
<META name="robots" content="index,follow,all">
<meta http-equiv="refresh" content="0; URL=http://mtkplmap1:7001/alpsdb"> 






<a class="buttonbar-entry-href" href="javascript:window.close()" title="Do not save password" target="mainframe">&nbsp;Cancel&nbsp;</a>


<a href="javascript:window.close()" target="mainframe">Cancel</a>




target 会致使窗口一直关不掉




若是在css、js文件的地址后面加上如 ?v=123 的版本号, 每次发布都自动增1, 那么就能够比较好的解决此问题。 




js switch 能够使用 str 型




offsetWidth  获得动态table 的宽度。
若是table 没有设置width  或是 style 中没有这是width的话, 使用width 就没法获得table的宽度了。


ajax 返回不能以status为key




浏览器控制台  console.log(e.toString());


26.
ajax 返回不要返回 status, 也不要返回空值


25. 关闭页面触发
onbeforeunload 


24.
FF下不能经过window.event来获取event的对象
window.event 是IE独有的,其余的浏览器如要使用的话,须要从触发的地方传入 event
onclick = doclick(event)




23.  === 与 ==的区别
使用“==”时,若是两边类型不一样,js引擎会把它们转换成相同类型而后在进行比较,而“===”则不会进行类型转换,所以当两边不是属于同一个类型,确定不相等


22.
Renderer.prototype.draw = function(canvas,graph)
{
        var t = this;
        graph.nodes.forEach(function(e){
                alert(t.drawNode);
                t.drawNode(canvas,e.graph);
                
        });
        graph.edges.forEach(function(e){
        t.drawEdge(canvas,e.graph);
        }); gantt.serverList
        
};


这个地方必需要使用var t = this;, 不然调用不到定义的方法。


21.
能经过Array.prototype.slice转换为真正的数组的带有length属性的对象。
这种对象有不少,比较特别的是arguments对象,还有像调用getElementsByTagName,document.childNodes之类的,它们都返回NodeList对象都属于伪数组。
咱们能够经过Array.prototype.slice.call(fakeArray)将伪数组转变为真正的Array对象。 




20.
好用的高质量JavaScript库一览(1)
http://developer.51cto.com/art/201203/323308.htm


19. 12种不宜使用的Javascript语法 
http://www.ruanyifeng.com/blog/2010/01/12_javascript_syntax_structures_you_should_not_use.html


18. <script>有个defer属性
w3学校给出defer的解释是“规定是否对脚本执行进行延迟,直到页面加载为止。”只给出了延迟,并无给出多个




17. indexOf
    lastIndexOf
    slide 


16.
    a:link,定义正常连接的样式;
    a:visited,定义已访问过连接的样式;
    a:hover,定义鼠标悬浮在连接上时的样式;
    a:active,定义鼠标点击连接时的样式。 


15. js日期格式
http://cqujsjcyj.iteye.com/blog/1169585


14. JavaScript客户端写二进制文件(转)  
http://blog.csdn.net/mqgh2007/article/details/4730445


CGI(Common Gateway Interface)是HTTP服务器与你的或其它机器
上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。 




13.
JavaScript读取文件内容实例
http://www.bsdown.com/html/201003/514.html


12.
用IE的“工具”去删除cookie,可是发现cookie删除不了
若是没有添加Expires ,cookie是根当前的IE线程而存在的。你经过IE的“工具”来删除是不行的。
当你关闭IE, cookie就消失了。


11.所有替换
ss.replace(/vend.rdsrv2/g,"vend_rdsrv2");




10.
for(i in test){
 alert(i);//i就是test的属性名
 alert(test.i);//test.i就是属性值
}


<script language="javascript">
var MAX_DUMP_DEPTH = 10;
function dumpObj(obj, name, indent, depth) {
  if (depth > MAX_DUMP_DEPTH) {
    return indent + name + ": <Maximum Depth Reached>\n";
  }
  if (typeof obj == "object") {
    var child = null;
    var output = indent + name + "\n";
    indent += "\t";
    for (var item in obj) {
      try {
        child = obj[item];
      } catch (e) {
        child = "<Unable to Evaluate>";
      }
      if (typeof child == "object") {
        output += dumpObj(child, item, indent, depth + 1);
      } else {
        output += indent + item + ": " + child + "\n";
      }
    }
    return output;
  } else {
    return obj;
  }
}


</script>


function writeObj(obj){
2            var description = "";
3            for(var i in obj){ 
4                var property=obj[i]; 
5                description+=i+" = "+property+"\n";
6            } 
7            alert(description);
8        }


9.
out.write(mBuf.toString());
out.flush();


8. json格式
{"anthor" : "Addis" , "age" : "23", "books":[ {"name":"C++"} ,{ "name" : "JAVA"}, {"name": "Flash ActionScript3.0"} ] }


7. endWith扩展
# <SCRIPT type="text/javascript" language="JavaScript">  
# function test(){  
#  var a  = "abcdef".startWith("abc");  
#  alert("a : "+a);  
#  var b  = "abcdef".endWith("def");  
#  alert("b : "+b);  
# }  
# String.prototype.endWith=function(str){  
# if(str==null||str==""||this.length==0||str.length>this.length)  
#   return false;  
# if(this.substring(this.length-str.length)==str)  
#   return true;  
# else  
#   return false;  
# return true;  
# }  
#   
# String.prototype.startWith=function(str){  
# if(str==null||str==""||this.length==0||str.length>this.length)  
#   return false;  
# if(this.substr(0,str.length)==str)  
#   return true;  
# else  
#   return false;  
# return true;  
# }  
#   
# </SCRIPT>  


6.
var iTop= document.body.scrollTop;
scrollTop


5.  
   1). 连接的 onclick 事件被先执行,其次是 href 属性下的动做(页面跳转,或 javascript 伪连接);
   2). 假设连接中同时存在 href 与 onclick,若是想让 href 属性下的动做不执行,onclick 必须获得一个 false 的返回值。不信,你能够将 goGoogle 函数中的 return false 注释掉;
   3). 若是页面过长有滚动条,且但愿经过连接的 onclick 事件执行操做。应将它的 href 属性设为 javascript:void(0);,而不要是 #,这能够防止没必要要的页面跳动;
   4. 若是在连接的 href 属性中调用一个有返回值的函数,当前页面的内容将被此函数的返回值代替;
   5. 在按住Shift键的状况下会有所区别。
   6. 今天我遇到的问题,在IE6.0里以href的形式访问不到parentNode。
   7. 尽可能不要用javascript:协议作为A的href属性,这样不只会致使没必要要的触发window.onbeforeunload事件,在IE里面更会使gif动画图片中止播放。




4.
event对象: http://www.congci.com/item/141
在javascript中,咱们要经常用到event对象来处理一些事件,可是IE和Firefox下event对象的属性是不一样的。
1).keyCode||which||charCode
      IE下支持keyCode,不支持which,charCode。
      Firefox下支持keyCode,除功能键外,其余键值始终为0,Firefox下支持which和charCode属性
      要获取兼容IE和Firefox的键值,有以下方法:
      在函数调用时传递event   
2).event.srcElement||event.target
     在IE下,event对象有srcElement属性,没有target属性。在火狐下,event对象有target属性,没有srcElement属性
解决办法很简单:
3).event.x,event.y||event.pageX,event.pageY
      IE下event对象有event.x,event.y属性,而Firefox下没有。Firefox下有event.pageX,event.PageY属性,而IE下没有。解决办法:
      var mx = event.x?event.x:event.pageX;
4)attachEvent()||addEventListener()
IE下支持attachEvent()方法,而Firefox下支持addEventListener()方法。
attachEvent("eventType",fun)
eventType是指事件类型,fun是指调用事件的函数
addEventListener("eventType",fun,flag)
addEventListener方法的前两个参数和attachEvent方法同样,flag参数则是一个 Boolean 值,指明该结点是否以DOM中所谓的捕捉模式来侦听事件。对于一个典型的事件侦听器来讲,第三个参数应该为false(假)。


3.
在js中,延迟执行函数有两种,setTimeout和setInterval,用法以下:
setTimeout("test()","2000");  //2000毫秒后执行test()函数,只执行一次。
setInterval("test()","2000"); //每隔2000毫秒执行一次test()函数,执行无数次。
var interval = window.setInterval("test()","2000");
window.clearInterval(interval);     //中止执行setInterval循环。
当咱们想让test()函数每隔2000毫秒执行一次,执行10000毫秒后中止执行时,能够用二者三者结合使用来实现。
var interval2 = window.setInterval("openit2()",2000);
setTimeout(function() {window.clearInterval(interval2);},10000);




2. confirm的使用
if(confirm("确认提交"))
{
}


1. function trim(str){
    return str.replace(/(^\s*)|(\s*$)/g, "");
}


2. Modal Window. (模式窗口)
子窗口没有处理完就不能处理父窗口




3. var i=parseInt("123");
   var f=parseFloat("12.3");


4. radio没有readOnly


5.执行iframe中的javascript方法


document.getElementById("iframeId").contentWindow.functionName();   - IE ,firefox都兼容


window.frames['framename'].functionName();    只适用于IE




6.“·”符号能够使用两种方式:
一、直接使用中文的标点符号“·”;
二、使用其实体字符“&#8226;”;


7. firefox中不能用 cursor:hand


style="cursor:hand;"
在IE中能正常显示成手;在firefox中却不能正常显示


若是改用 style="cursor:pointer;"
则在两个浏览器下都能正常显示


8.window.status="欢迎来到JavaScript的世界";


在FireFox浏览器中


 【工具】-->【选项】-->【内容】-->启用JavaScript的【高级】-->将【修改状态栏的内容】打上√ 便可


9. 
1.倒计定时器:timename=setTimeout("function();",delaytime);  


2.循环定时器:timename=setInterval("function();",delaytime);  


10.在   firefox   下的手形样式不是   cursor:   hand   而是   cursor:   pointer


11. toLowerCase(),toUpperCase(). 大小写转换
str.toLowerCase() 


12. js 引用 js文件
document.write("<script language=\"JavaScript\" src=\"../mediatek/com/userSelect/object.js\"></script>")
document.write("<script language=\"JavaScript\" src=\"../mediatek/com/userSelect/array.js\"></script>")  
document.write("<script language=\"JavaScript\" src=\"../mediatek/com/userSelect/map.js\"></script>") 


13. 判断浏览器的类型
<script language="JavaScript">
function getOs()
{
    var OsObject = "";
   if(navigator.userAgent.indexOf("MSIE")>0) {
        return "MSIE";
   }
   if(isFirefox=navigator.userAgent.indexOf("Firefox")>0){
        return "Firefox";
   }
   if(isSafari=navigator.userAgent.indexOf("Safari")>0) {
        return "Safari";
   } 
   if(isCamino=navigator.userAgent.indexOf("Camino")>0){
        return "Camino";
   }
   if(isMozilla=navigator.userAgent.indexOf("Gecko/")>0){
        return "Gecko";
   }
  
}
 alert("您的浏览器类型为:"+getOs());
</script> 


14. isNaN 判断是不是数字
jquery

Navigation Bar

100 Great CSS Menu Tutorials
http://www.noupe.com/css/100-great-css-menu-tutorials.html


30 Cutting Edge Examples Of CSS Navigation
http://www.1stwebdesigner.com/css/cutting-edge-examples-css-navigation/


30 Exceptional CSS Navigation Techniques
http://sixrevisions.com/css/30-exceptional-css-navigation-techniques/


40 Premium CSS Menu and Navigation Solutions
http://www.tripwiremagazine.com/2012/06/css-menu-and-navigation.html


55 Wonderful CSS Navigation Menu Designs
http://inspirationfeed.com/inspiration/55-wonderful-css-navigation-menu-designs/

SSO

具体是采用Kerberos 仍是NTLM验证方式取决于如下三种状况
1.客户端以ip地址访问服务器
无论客户端跟服务器是否在域、也无论客户端是否以域账号登录,只要客户端以ip地址访问服务器,


    那么客户端就会选择NTLM方式验证
    而且不会直接发送客户端登陆用户的用户名和密码给服务器
    而是会弹出一个对话框要求用户输入用户名和口令,而后发送到服务端验证。


        您能够避免在使用 IP 地址或名称中包含句点的企业内部网服务器上出现这种提示,方法是,在 Internet Explorer 的“本地 Intranet”设置中,列出包含 IP 地址的服务器,或是列出包含句点的服务器名称。能够经过依次单击“工具”、“Internet 选项”、“本地 Intranet”、“站点”、“高级”来访问“本地 Intranet”设置部分。而后在“将该网站添加到区域中”输入 http://127.0.0.1 或其余相关站点的 URL。


 


下面总结的都是在客户端以机器名访问服务器的状况。
2. 服务器在域,客户端以域账号登录


若是客户端的机器在域中,同时登录用户又是以域用户登陆,那么IE选择Kerberos验证方式。
3. 其余状况IE都选择采用NTLM验证方式。


出来上述的两种状况,其余状况,客户端都选择NTLM验证,并首先尝试把登陆客户端用户的用户名和密码传送给服务器验证,


    若是验证经过了,被直接受权访问;
    若是验证没经过,客户端弹出对话框要求输入用户名和密码,而后再传送到服务端验证,直到验证经过。


集成 Windows 身份验证Kerberos的验证方式是 Intranet 环境中最好的身份验证方案:


    在这种用户拥有 Windows 域账户,Kerberos验证不在网络上传递用户密码,只用传送一个用户验证票。
    NTLM要传送用户的密码,可是密码通过处理后派生出一个8字节的key加密质询码,也是比较安全的。




-          首先因为jCIFS只是应用了SMB协议进行认证,这样它就没办法拿到用户的其余的一些信息,好比组信息或者权限信息。对于这个问题,通常能够由咱们本身的应用程序经过LDAP到AD上去存取,但毕竟增长了咱们的工做。


-          第二个不足是,NTLM认证是一个M$准备放弃的协议,在Windows 2000和之后的操做系统中,缺省的认证协议是Kerberos,只有在和2000以前的系统通讯时才使用NTLM。固然这并非说jCIFS在2000以上就用不起来了,缺省状况老是能够用的,M$老是要保持兼容的J 固然若是你想实现基于Kerberos的SSO,你能够去参考下面列出的文章,但这就不是这里讨论的话题了。






默认值:


Windows 2000 以及 Windows XP: 发送 LM & NTLM 响应


Windows Server 2003: 仅发送 NTLM 响应


Windows Vista、Windows Server 200八、Windows 7 以及 Windows Server 2008 R2: 仅发送 NTLMv2 响应




Network security: LAN Manager authentication level


This security setting determines which challenge/response authentication protocol is used for network logons. This choice affects the level of authentication protocol used by clients, the level of session security negotiated, and the level of authentication accepted by servers as follows:


Send LM & NTLM responses: Clients use LM and NTLM authentication and never use NTLMv2 session security; domain controllers accept LM, NTLM, and NTLMv2 authentication.


Send LM & NTLM - use NTLMv2 session security if negotiated: Clients use LM and NTLM authentication and use NTLMv2 session security if the server supports it; domain controllers accept LM, NTLM, and NTLMv2 authentication.


Send NTLM response only: Clients use NTLM authentication only and use NTLMv2 session security if the server supports it; domain controllers accept LM, NTLM, and NTLMv2 authentication.


Send NTLMv2 response only: Clients use NTLMv2 authentication only and use NTLMv2 session security if the server supports it; domain controllers accept LM, NTLM, and NTLMv2 authentication.


Send NTLMv2 response only\refuse LM: Clients use NTLMv2 authentication only and use NTLMv2 session security if the server supports it; domain controllers refuse LM (accept only NTLM and NTLMv2 authentication).


Send NTLMv2 response only\refuse LM & NTLM: Clients use NTLMv2 authentication only and use NTLMv2 session security if the server supports it; domain controllers refuse LM and NTLM (accept only NTLMv2 authentication).


Important


This setting can affect the ability of computers running Windows 2000 Server, Windows 2000 Professional, Windows XP Professional, and the Windows Server 2003 family to communicate with computers running Windows NT 4.0 and earlier over the network. For example, at the time of this writing, computers running Windows NT 4.0 SP4 and earlier did not support NTLMv2. Computers running Windows 95 and Windows 98 did not support NTLM.


Default:


Windows 2000 and windows XP: send LM & NTLM responses


Windows Server 2003: Send NTLM response only


Windows Vista, Windows Server 2008, Windows 7, and Windows Server 2008 R2: Send NTLMv2 response only










    NTLMv1 but not NTLMv2 via JCIFS
    NTLMv1+NTLMv2+kerberos via Waffle but only for windows :(
    Kerberos only via "Spring Security Kerberos Extension"








Out of the above list, only ntlmv2-auth and Jespa support NTLMv2. Jespa is workable but commercial. ntlmv2-auth I haven't tried but it's based on the code from Liferay, which I've seen working before.


'ntlm-authentication-in-java' is only NTLMv1, which is old, insecure, and works in a dwindling number of environments as people upgrade to newer Windows versions. JCIFS used to have an NTLMv1 HTTP auth filter, but it was removed in later versions, as the way it was implemented amounts to a man-in-the-middle attack on the insecure protocol. (The same appears to be true of 'ntlm-authentication-in-java'.)


The 'spnego' project is Kerberos not NTLM. If you want to replicate full IWA as IIS does it, you'd need to support both NTLMv2 and Kerberos ('NTLM' auth, 'Negotiate' auth, NTLMSSP-in-SPNego auth and NTLM-masquerading-as-Negotiate auth).








缘由分析:因JCIFS的HttpFilter并不支持NTLM2协议,而当客户端是WIN7系统时,默认采用的是NTLM2协议。若是此时域控服务器也支持NTLM2,则会默认采用NTLM2协议验证。就会出现该异常了。








HTTP 协议中有401 这个状态表示用户未受权, 要求NTLM方式提供用户信息时, IE会自动去当前windows 账号,其余浏览器会弹出对话框要求用户输入,服务器获得用户信息后交给域控验证。
IIS  能够简单配置达到验证功能
可是tomcat, jboss 没有这样的功能。须要第三方的开源项目实现这个功能--jcifs 就是一个。
1. 问题A:jboss启动后,第一个发出请求的浏览器能正常进行当前用户的验证,之后的都报用户名或密码错误
问题A有了新发现,其实不用改代码,只要在配置中指定一个链接域控的用户名密码便可
2. 问题B:项目在公司内部上线后,不停有用户登陆不上,报500错误:the parameter is incorrect 
缘由是vista或win7默认采用NTLM2协议验证,JCIFS不支持NTLM2。








Active Directory是一种服务,这种必须基于DC(Domain Controller)存在,一个Active Directory 得架构至少有一个Domain Controller。Domain Controller用来存放Active Directory得信息。








开始我win7这运行时遇到一个错误
jcifs.smb.SmbException: The parameter is incorrect.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa中新建一个dword值LMCompatibilityLevel,值为1,便可解决






spnego 实现sso 的jar 包
http://spnego.sourceforge.net/


ntlm-java实现sso 的jar 包
http://code.google.com/p/ntlm-java/


http://jcifs.samba.org/src/docs/ntlmhttpauth.html
http://www.innovation.ch/personal/ronald/ntlm.html
http://www.rgagnon.com/javadetails/java-0441.html


1.在火狐(Firefox)地址栏中输入:about:config
2.而后在过滤器中输入:NTLM
3.双击network.automatic-ntlm-auth.trusted-uris,
4.在输入值中输入   localhost
5.而后关闭火狐(Firefox)浏览器,从新打开就能够了。








第一个问题出现了,就是域用户访问会提示要求输入用户名和密码这是多郁闷的一件事啊,搞这个东东为的就是想自动登陆还冒出个框来,在网上找了下大多都没提这个事,经本人摸索找到了方法:设置IE浏览器的安全-Internet-自定义级别-用户验证选择“自动使用当前用户名和密码登陆”。
第二个问题又来了,自动登陆后会报异常
jcifs.smb.SmbException: NTLMv2 requires extended security (jcifs.smb.client.useExtendedSecurity must be true if jcifs.smb.lmCompatibility >= 3
查了全部中文网站没见有解决方法的,最后仍是在官方网站找到了一条信息,有个哥们说是jcifs存在BUG,须要将jcifs.smb.NtlmPasswordAuthentication类中的LM_COMPATIBILITY常量的改为非STATIC,下了源码把这个改了,从新打包,问题解决。




Windows Authentication is performed via NTLM. If a browser doesn't automatically supply the credentials then a username/password dialog should be shown in all browsers which would prompt the user to enter their credentials. This should happen automatically.


If you can edit the config settings in FireFox then you can make the credentials be submitted automatically by adding the domain to network.automatic-ntlm-auth.trusted-uris in about:config.




集成验证时IE采用Kerberos 仍是NTLM验证方式?
1.客户端以ip地址访问服务器
无论客户端跟服务器是否在域、也无论客户端是否以域账号登录,只要客户端以ip地址访问服务器,


    那么客户端就会选择NTLM方式验证
    而且不会直接发送客户端登陆用户的用户名和密码给服务器
    而是会弹出一个对话框要求用户输入用户名和口令,而后发送到服务端验证。


        您能够避免在使用 IP 地址或名称中包含句点的企业内部网服务器上出现这种提示,方法是,在 Internet Explorer 的“本地 Intranet”设置中,列出包含 IP 地址的服务器,或是列出包含句点的服务器名称。能够经过依次单击“工具”、“Internet 选项”、“本地 Intranet”、“站点”、“高级”来访问“本地 Intranet”设置部分。而后在“将该网站添加到区域中”输入 http://127.0.0.1 或其余相关站点的 URL。


下面总结的都是在客户端以机器名访问服务器的状况。
2. 服务器在域,客户端以域账号登录


若是客户端的机器在域中,同时登录用户又是以域用户登陆,那么IE选择Kerberos验证方式。
3. 其余状况IE都选择采用NTLM验证方式。


出来上述的两种状况,其余状况,客户端都选择NTLM验证,并首先尝试把登陆客户端用户的用户名和密码传送给服务器验证,


    若是验证经过了,被直接受权访问;
    若是验证没经过,客户端弹出对话框要求输入用户名和密码,而后再传送到服务端验证,直到验证经过。


集成 Windows 身份验证Kerberos的验证方式是 Intranet 环境中最好的身份验证方案:


    在这种用户拥有 Windows 域账户,Kerberos验证不在网络上传递用户密码,只用传送一个用户验证票。
    NTLM要传送用户的密码,可是密码通过处理后派生出一个8字节的key加密质询码,也是比较安全的。


NTLM


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.PasswordAuthentication;
import java.net.URL;


public class NtlmTest {


        public static void main(String[] args) throws Exception {


                //String urlStr = "http://mtkplmap2:7001/esdm_fed_web″;
            String urlStr = "http://mtkplmap2:7001/esdm_fed_web";
                String domain = ""; // May also be referred as realm
                String userName = "mtk40157";
                String password = "";                


                String responseText = getAuthenticatedResponse(urlStr, domain, userName, password);


            System.out.println("response: " + responseText);
        }


        private static String getAuthenticatedResponse(final String urlStr,
                        final String domain, final String userName, final String password)
                        throws IOException {


                StringBuilder response = new StringBuilder();


                Authenticator.setDefault(new Authenticator() {
                        @Override
                        public PasswordAuthentication getPasswordAuthentication() {
                                return new PasswordAuthentication(domain + "\\" + userName,
                                                password.toCharArray());
                        }
                });


                URL urlRequest = new URL(urlStr);
                HttpURLConnection conn = (HttpURLConnection) urlRequest
                                .openConnection();
                conn.setDoOutput(true);
                conn.setDoInput(true);
                conn.setRequestMethod("GET");


                InputStream stream = conn.getInputStream();
                BufferedReader in = new BufferedReader(new InputStreamReader(stream));
                String str = "";
                while ((str = in.readLine()) != null) {
                        response.append(str);
                }
                in.close();


                return response.toString();
        }
}


IE接受Negotiate头,分别使用NTLM 或 Kerberos两种验证的状况说明


一、 NTLM验证过程
1.1.    客户端选择NTLM方式
若是IE选择了NTLM验证,IE就会在发送到IIS的请求中加入一个Authorization: Negotiate头,内容为:


Authorization: Negotiate NTLMSSPXXXXXXXXXXXXXXXXX


蓝色部分在实际中是通过base64编码的,其中“NTLMSSP”表示是NTLM验证的请求,后面的“XXXXXXXX”部分是二进制的数据,告诉服务器,客户端如今选择了NTLM验证,请服务器发送质询码给客户端。


1.2.    服务端返回质询码
服务器在返回无受权访问的http回应的头部加入Authorization: Negotiate头,内容为:


Authorization: Negotiate NTLMSSPXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX


服务器返回的“XXXXXXXX”部分中含有一个八字节的质询码。


1.3.    客户端加密质询码再次发送请求
客户端使用客户端账号的密码派生出来的8字节DESkey使用DES算法加密收到的质询码。连同客户端账号的用户名发送到服务端,形式仍是这样:


Authorization: Negotiate NTLMSSPXXXXXXXXXXXXXXXXX


这里的“XXXXXXX”部分包含了加密后的质询码和客户端用户名,用户名在其中以明码形式存在。


1.4.    服务端验证客户端用户和密码
服务端收到用户名后,先查验本机是否有这个用户,若是没有直接返回没有受权的http回应。


若是有这个用户,就用这个用户的密码派生出来的8字节DESkey使用DES算法加密发给客户端的那个8字节的质询码,而后跟收到客户端发送来的加密后的质询码比较,若是不相同,表示客户端输入密码不正确看,返回没有受权的http回应;若是相同,就表示客户端输入这个用户的密码正确,验证经过,返回客户端请求的资源。


二、 Kerberos验证过程
2.1.    客户端选择Kerberos验证
若是客户端选择了Kerberos验证,客户端直接在请求头中加入Authorization: Negotiate头,内容为:


Authorization: Negotiate XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX


其中“XXXXXXXXXX”包含了客户端登陆用户的身份验证票(登陆时域中的票据服务器发放的标识此登陆用户身份的票据,其中不包含用户的密码)。


2.2.    服务端验证身份验证票
服务器验证用户验证票,若是有效的票据,服务端能据此得到用户的用户名,并验证用户的有效性。验证经过后,服务端返回客户端请求的资源。






可是客户端IE什么时候选择NTLM 、合适选择Kerberos呢?下面经过一系列的测试来找出答案。






分服务器和客户端在域不在域两种状况测试。






三、 客户端和服务器都不在域中
测试环境为服务器和客户端机器在同一个局域网中,可是都不在域中。客户端IE请求服务端IIS的一个页面default.aspx。


IIS服务端设置:


l         不启用匿名访问


l         只启用集成windows身份验证






这个环境下又分为下面几种状况:


3.1.    客户端用ip地址访问服务
3.1.1.    客户端IE申请页面
客户端IE浏览器的地址栏上输入要访问的URL,就会向服务端发送一个GET请求:


GET /wstest/default.aspx HTTP/1.1


Accept: */*


Accept-Language: zh-cn


UA-CPU: x86


Accept-Encoding: gzip, deflate


User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1; MAXTHON 2.0)


Host: 192.168.1.13:81


Connection: Keep-Alive


3.1.2.    服务端返回无受权回应
服务端设置了禁用匿名访问,只容许windows验证,因此服务端返回了无受权回应:


HTTP/1.1 401 Unauthorized


返回的http头中还包括的:


WWW-Authenticate: Negotiate


WWW-Authenticate: NTLM


这两个头表示服务端只接受集成windows验证方式


HTTP/1.1 401 Unauthorized


Content-Length: 1327


Content-Type: text/html


Server: Microsoft-IIS/6.0


WWW-Authenticate: Negotiate


WWW-Authenticate: NTLM


X-Powered-By: ASP.NET


Date: Sun, 11 Nov 2007 12:28:29 GMT






3.1.3.    客户端选择NTLM验证,要求输入用户名密码,请求质询码
客户端经过Authorization: Negotiate NTLMSSPXXXX 头告诉服务器,客户端要求NTLM验证,请求服务端发送质询码。


GET /wstest/default.aspx HTTP/1.1


Accept: */*


Accept-Language: zh-cn


UA-CPU: x86


Accept-Encoding: gzip, deflate


User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1; MAXTHON 2.0)


Host: 192.168.1.13:81


Connection: Keep-Alive


Authorization: Negotiate TlRMTVNTUAABAAAAB4IIogAAAAAAAAAAAAAAAAAAAAAFAs4OAAAAD3==






3.1.4.    服务器返回质询码
服务端收到客户端的请求,发送一个八字节的质询码。


HTTP/1.1 401 Unauthorized


Content-Length: 1251


Content-Type: text/html


Server: Microsoft-IIS/6.0


WWW-Authenticate: Negotiate TlRMTVNTUAACAAAAEgASADgAAAAFgoqii7rzphzu6mEAAAAAAAAAAFwAXABKAAAABQLODgAAAA9CAEkAWgBUAEEATABLAFIAMgACABIAQgBJAFoAVABBAEwASwBSADIAAQASAEIASQBaAFQAQQBMAEsAUgAyAAQAEgBiAGkAegB0AGEAbABrAFIAMgADABIAYgBpAHoAdABhAGwAawBSADIAAAAAAA==


X-Powered-By: ASP.NET


Date: Sun, 11 Nov 2007 12:29:44 GMT






3.1.5.    客户端发送使用前面输入帐户的密码加密后的质询码
客户端IE收到质询码后,使用根据必定的规则从登陆用户密码派生出的8字节的key对质询码进行DES加密,加密后的质询码和用户名明码连同页面请求一块儿发送到服务端。


GET /wstest/default.aspx HTTP/1.1


Accept: */*


Accept-Language: zh-cn


UA-CPU: x86


Accept-Encoding: gzip, deflate


User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1; MAXTHON 2.0)


Host: 192.168.1.13:81


Connection: Keep-Alive


Authorization: Negotiate TlRMTVNTUAADAAAAGAAYAI4AAAAYABgApgAAABgAGABIAAAAGgAaAGAAAAAUABQAegAAAAAAAAC+AAAABYKIogUCzg4AAAAPMQA5ADIALgAxADYAOAAuADEALgAxADMAYQBkAG0AaQBuAGkAcwB0AHIAYQB0AG8AcgBXAEkATgAyADAAMAAzAC0AUABDAL0amMkkEMWLAAAAAAAAAAAAAAAAAAAAAFND1Boc0kthz0TBnfxn3z4W9/NILU1CtW==






3.1.6.    服务端验证经过,返回资源
服务端收到用户名和加密后的质询码后,根据用户名查找服务器上此用户的密码,按照客户端一样的方法加密质询码,而后跟收到客户端返回的质询码,若是一致,则说明用户名和密码都一致,验证经过,返回客户端IE请求资源。若是不对,再次返回无受权http回应。


HTTP/1.1 200 OK


Date: Sun, 11 Nov 2007 12:29:44 GMT


Server: Microsoft-IIS/6.0


X-Powered-By: ASP.NET


X-AspNet-Version: 2.0.50727


Cache-Control: private


Content-Type: text/html; charset=utf-8


Content-Length: 522










<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">






<html xmlns="http://www.w3.org/1999/xhtml" >


<head><title>


.Untitled Page


</title></head>


<body>


    <form method="post" action="default.aspx">


<div>


<input name="__VIEWSTATE" value="/wEPDwUJNzgzNDMwNTMzZGTcefU2sz1MLsbXiZdUEXomIyZ20Q==" />


</div>






    <div>


        This is a simple page!</div>


    </form>


</body>


</html>


3.2.    客户端用机器名访问服务器,登陆用户名/口令跟服务器不匹配
这种状况,客户端用服务器名访问服务器,可是客户端登陆系统的用户跟服务器上的用户名和密码不匹配,也就是要么服务器上没这个用户,要么就是服务器这个用户的密码跟客户端这个用户的密码不同。


3.2.1.    客户端IE申请页面
GET /wstest/default.aspx HTTP/1.1


Accept: */*


Accept-Language: zh-cn


UA-CPU: x86


Accept-Encoding: gzip, deflate


User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1; MAXTHON 2.0)


Host: biztalkr2:81


Connection: Keep-Alive


3.2.2.    服务端返回无受权回应
服务端不容许匿名访问,服务端返回须要集成验证的的http头。


HTTP/1.1 401 Unauthorized


Content-Length: 1327


Content-Type: text/html


Server: Microsoft-IIS/6.0


WWW-Authenticate: Negotiate


WWW-Authenticate: NTLM


X-Powered-By: ASP.NET


Date: Wed, 14 Nov 2007 12:38:36 GMT


3.2.3.    客户端选择NTLM验证,请求质询码
GET /wstest/default.aspx HTTP/1.1


Accept: */*


Accept-Language: zh-cn


UA-CPU: x86


Accept-Encoding: gzip, deflate


User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1; MAXTHON 2.0)


Host: biztalkr2:81


Connection: Keep-Alive


Authorization: Negotiate TlRMTVNTUAABAAAAB4IIogAAAAAAAAAAAAAAAAAAAAAFAs4OAAAADw==


3.2.4.    服务器返回质询码
HTTP/1.1 401 Unauthorized


Content-Length: 1251


Content-Type: text/html


Server: Microsoft-IIS/6.0


WWW-Authenticate: Negotiate TlRMTVNTUAACAAAAEgASADgAAAAFgoqikemftrQx0qUAAAAAAAAAAFwAXABKAAAABQLODgAAAA9CAEkAWgBUAEEATABLAFIAMgACABIAQgBJAFoAVABBAEwASwBSADIAAQASAEIASQBaAFQAQQBMAEsAUgAyAAQAEgBiAGkAegB0AGEAbABrAFIAMgADABIAYgBpAHoAdABhAGwAawBSADIAAAAAAA==


X-Powered-By: ASP.NET


Date: Wed, 14 Nov 2007 12:38:36 GMT


3.2.5.    客户端发送用登录本机的帐户加密后的质询码
客户端IE首先用本机登陆用户的密码派生的key加密质询码,而后连同用户名一块儿发送到服务端验证。


GET /wstest/default.aspx HTTP/1.1


Accept: */*


Accept-Language: zh-cn


UA-CPU: x86


Accept-Encoding: gzip, deflate


User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1; MAXTHON 2.0)


Host: biztalkr2:81


Connection: Keep-Alive


Authorization: Negotiate TlRMTVNTUAADAAAAGAAYAIoAAAAYABgAogAAABQAFABIAAAAGgAaAFwAAAAUABQAdgAAAAAAAAC6AAAABYKIogUCzg4AAAAPVwBJAE4AMgAwADAAMwAtAFAAQwBBAGQAbQBpAG4AaQBzAHQAcgBhAHQAbwByAFcASQBOADIAMAAwADMALQBQAEMAwo4jxECJeUwAAAAAAAAAAAAAAAAAAAAA2/kscwhI0mmAC6W4OmsZjbrRyrS2NGUX


3.2.6.    服务端返回无受权回应
客户端本机登陆的用户名和密码跟服务器端没有匹配的,因此验证在服务端没有经过,服务端返回无受权的回应。


HTTP/1.1 401 Unauthorized


Content-Length: 1251


Content-Type: text/html


Server: Microsoft-IIS/6.0


WWW-Authenticate: Negotiate


WWW-Authenticate: NTLM


X-Powered-By: ASP.NET


Date: Wed, 14 Nov 2007 12:38:36 GMT






3.2.7.    客户端及选选择NTLM验证,要求输入用户名和口令,再次请求质询码
GET /wstest/default.aspx HTTP/1.1


Accept: */*


Accept-Language: zh-cn


UA-CPU: x86


Accept-Encoding: gzip, deflate


User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1; MAXTHON 2.0)


Host: biztalkr2:81


Connection: Keep-Alive


Authorization: Negotiate TlRMTVNTUAABAAAAB4IIogAAAAAAAAAAAAAAAAAAAAAFAs4OAAAADw==


3.2.8.    服务端返回质询码
HTTP/1.1 401 Unauthorized


Content-Length: 1251


Content-Type: text/html


Server: Microsoft-IIS/6.0


WWW-Authenticate: Negotiate TlRMTVNTUAACAAAAEgASADgAAAAFgoqi3GHiM9qD6TUAAAAAAAAAAFwAXABKAAAABQLODgAAAA9CAEkAWgBUAEEATABLAFIAMgACABIAQgBJAFoAVABBAEwASwBSADIAAQASAEIASQBaAFQAQQBMAEsAUgAyAAQAEgBiAGkAegB0AGEAbABrAFIAMgADABIAYgBpAHoAdABhAGwAawBSADIAAAAAAA==


X-Powered-By: ASP.NET


Date: Wed, 14 Nov 2007 12:38:45 GMT


3.2.9.    客户端发送使用前面输入帐户的密码加密后的质询码
GET /wstest/default.aspx HTTP/1.1


Accept: */*


Accept-Language: zh-cn


UA-CPU: x86


Accept-Encoding: gzip, deflate


User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1; MAXTHON 2.0)


Host: biztalkr2:81


Connection: Keep-Alive


Authorization: Negotiate TlRMTVNTUAADAAAAGAAYAIgAAAAYABgAoAAAABIAEgBIAAAAGgAaAFoAAAAUABQAdAAAAAAAAAC4AAAABYKIogUCzg4AAAAPQgBJAFoAVABBAEwASwBSADIAYQBkAG0AaQBuAGkAcwB0AHIAYQB0AG8AcgBXAEkATgAyADAAMAAzAC0AUABDAKeYMtcyzwKJAAAAAAAAAAAAAAAAAAAAAExqwTipbr+IzohNdmnopPU1B9pp7QBplA==


3.2.10.     服务端验证经过,返回资源
HTTP/1.1 200 OK


Date: Wed, 14 Nov 2007 12:38:45 GMT


Server: Microsoft-IIS/6.0


X-Powered-By: ASP.NET


X-AspNet-Version: 2.0.50727


Cache-Control: private


Content-Type: text/html; charset=utf-8


Content-Length: 522














<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">






<html xmlns="http://www.w3.org/1999/xhtml" >


<head><title>


.Untitled Page


</title></head>


<body>


    <form method="post" action="default.aspx">


<div>


<input name="__VIEWSTATE" value="/wEPDwUJNzgzNDMwNTMzZGTcefU2sz1MLsbXiZdUEXomIyZ20Q==" />


</div>






    <div>


        This is a simple page!</div>


    </form>


</body>


</html>


3.3.    客户端用机器名访问服务器,登陆用户名/口令跟服务器匹配
这种状况,客户端用服务器名访问服务器,并且客户端登陆系统的用户正好在服务器上有个同名同密码的用户。


3.3.1.    客户端IE申请页面
GET /wstest/default.aspx HTTP/1.1


Accept: */*


Accept-Language: zh-cn


UA-CPU: x86


Accept-Encoding: gzip, deflate


User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1; MAXTHON 2.0)


Host: biztalkr2:81


Connection: Keep-Alive


3.3.2.    服务端返回无受权回应
一样,服务端不容许匿名访问,服务端返回须要集成验证的的http头。


HTTP/1.1 401 Unauthorized


Content-Length: 1327


Content-Type: text/html


Server: Microsoft-IIS/6.0


WWW-Authenticate: Negotiate


WWW-Authenticate: NTLM


X-Powered-By: ASP.NET


Date: Wed, 14 Nov 2007 12:35:41 GMT


3.3.3.    客户端选择NTLM验证,请求质询码
GET /wstest/default.aspx HTTP/1.1


Accept: */*


Accept-Language: zh-cn


UA-CPU: x86


Accept-Encoding: gzip, deflate


User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1; MAXTHON 2.0)


Host: biztalkr2:81


Connection: Keep-Alive


Authorization: Negotiate TlRMTVNTUAABAAAAB4IIogAAAAAAAAAAAAAAAAAAAAAFAs4OAAAADw==


3.3.4.    服务器返回质询码
HTTP/1.1 401 Unauthorized


Content-Length: 1251


Content-Type: text/html


Server: Microsoft-IIS/6.0


WWW-Authenticate: Negotiate TlRMTVNTUAACAAAAEgASADgAAAAFgoqiSWLtzjLMElAAAAAAAAAAAFwAXABKAAAABQLODgAAAA9CAEkAWgBUAEEATABLAFIAMgACABIAQgBJAFoAVABBAEwASwBSADIAAQASAEIASQBaAFQAQQBMAEsAUgAyAAQAEgBiAGkAegB0AGEAbABrAFIAMgADABIAYgBpAHoAdABhAGwAawBSADIAAAAAAA==


X-Powered-By: ASP.NET


Date: Wed, 14 Nov 2007 12:35:41 GMT


3.3.5.    客户端发送用登录本机的帐户加密后的质询码
GET /wstest/default.aspx HTTP/1.1


Accept: */*


Accept-Language: zh-cn


UA-CPU: x86


Accept-Encoding: gzip, deflate


User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1; MAXTHON 2.0)


Host: biztalkr2:81


Connection: Keep-Alive


Authorization: Negotiate TlRMTVNTUAADAAAAGAAYAIoAAAAYABgAogAAABQAFABIAAAAGgAaAFwAAAAUABQAdgAAAAAAAAC6AAAABYKIogUCzg4AAAAPVwBJAE4AMgAwADAAMwAtAFAAQwBBAGQAbQBpAG4AaQBzAHQAcgBhAHQAbwByAFcASQBOADIAMAAwADMALQBQAEMAg7v6JYS/3bAAAAAAAAAAAAAAAAAAAAAArE2xu3xDN3w0LmV1yUkDkrqVWhb2wg27


3.3.6.    服务端验证经过,返回资源
用户端登陆的用户名和密码正好能匹配到服务端的一个用户和密码,验证经过。


HTTP/1.1 200 OK


Date: Wed, 14 Nov 2007 12:35:41 GMT


Server: Microsoft-IIS/6.0


X-Powered-By: ASP.NET


X-AspNet-Version: 2.0.50727


Cache-Control: private


Content-Type: text/html; charset=utf-8


Content-Length: 522










<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">






<html xmlns="http://www.w3.org/1999/xhtml" >


<head><title>


.Untitled Page


</title></head>


<body>


    <form method="post" action="default.aspx">


<div>


<input name="__VIEWSTATE" value="/wEPDwUJNzgzNDMwNTMzZGTcefU2sz1MLsbXiZdUEXomIyZ20Q==" />


</div>






    <div>


        This is a simple page!</div>


    </form>


</body>


</html>


四、 客户端和服务器都在同一域中
服务器和客户端机器在同一个局域网中,并同在一个域中。客户端IE请求服务端IIS的一个页面iisstart.htm。


IIS服务端设置:


l         不启用匿名访问


l         只启用集成windows身份验证






这样的环境下又范围如下几种状况:


4.1.    客户端用机ip访问服务器
4.1.1.    客户端IE申请页面
GET /iisstart.htm HTTP/1.1


Accept: */*


Accept-Language: zh-cn


UA-CPU: x86


Accept-Encoding: gzip, deflate


User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727; MAXTHON 2.0)


Host: 192.168.100.5:81


Connection: Keep-Alive


4.1.2.    服务端返回无受权回应
IIS的设置不容许匿名访问,只能windows验证,因此发送401无受权回应,同时发回Negotiate和NTLM两个身份验证头让客户端选择。


HTTP/1.1 401 Unauthorized


Content-Length: 1327


Content-Type: text/html


Server: Microsoft-IIS/6.0


WWW-Authenticate: Negotiate


WWW-Authenticate: NTLM


X-Powered-By: ASP.NET


Date: Wed, 14 Nov 2007 07:23:43 GMT


4.1.3.    客户端选择NTLM验证,要求输入用户名密码,请求质询码
因为使用的是ip地址访问服务器,URL中包含有”.”字符,IE认为访问的不是企业内部服务器,因此不直接提供用户凭据给服务端,要求用户输入账户


GET /iisstart.htm HTTP/1.1


Accept: */*


Accept-Language: zh-cn


UA-CPU: x86


Accept-Encoding: gzip, deflate


User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727; MAXTHON 2.0)


Host: 192.168.100.5:81


Connection: Keep-Alive


Authorization: Negotiate TlRMTVNTUAABAAAAB4IIogAAAAAAAAAAAAAAAAAAAAAFAs4OAAAAD4==


4.1.4.    服务器返回质询码
HTTP/1.1 401 Unauthorized


Content-Length: 1251


Content-Type: text/html


Server: Microsoft-IIS/6.0


WWW-Authenticate: Negotiate TlRMTVNTUAACAAAACgAKADgAAAAFgomiF0CRjzLrr+cAAAAAAAAAAHwAfABCAAAABQLODgAAAA9TAFoAQgBUAEkAAgAKAFMAWgBCAFQASQABAAgATABPAEcAUwAEABgAcwB6AGIAdABpAC4AZwBvAHYALgBjAG4AAwAiAGwAbwBnAHMALgBzAHoAYgB0AGkALgBnAG8AdgAuAGMAbgAFABgAcwB6AGIAdABpAC4AZwBvAHYALgBjAG4AAAAAAA==


X-Powered-By: ASP.NET


Date: Wed, 14 Nov 2007 07:24:15 GMT


4.1.5.    客户端发送使用前面输入帐户的密码加密后的质询码
GET /iisstart.htm HTTP/1.1


Accept: */*


Accept-Language: zh-cn


UA-CPU: x86


Accept-Encoding: gzip, deflate


User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727; MAXTHON 2.0)


Host: 192.168.100.5:81


Connection: Keep-Alive


Authorization: Negotiate TlRMTVNTUAADAAAAGAAYAHYAAAAYABgAjgAAABoAGgBIAAAACgAKAGIAAAAKAAoAbAAAAAAAAACmAAAABYKIogUCzg4AAAAPMQA5ADIALgAxADYAOAAuADEAMAAwAC4ANQBqAGkAbgBqAHoASgBJAE4ASgBaALVaV8Ku0ERuAAAAAAAAAAAAAAAAAAAAAFowQcbaUXykWTrI7WJKQUA2taaV7wo5T2==


4.1.6.    服务端验证经过,返回资源
HTTP/1.1 200 OK


Content-Length: 1135


Content-Type: text/html


Last-Modified: Mon, 12 Nov 2007 09:33:27 GMT


Accept-Ranges: bytes


ETag: "d4469314f25c81:e35"


Server: Microsoft-IIS/6.0


X-Powered-By: ASP.NET


Date: Wed, 14 Nov 2007 07:24:15 GMT






<html>






<head>


<meta HTTP-EQUIV="Content-Type" Content="text/html; charset=gb2312">






</head>






<body bgcolor=white>


This is a simple page!






</body>


</html>






4.2.    客户端用机器名访问服务器,客户端用户以域帐户登陆
4.2.1.    客户端IE申请页面
GET /iisstart.htm HTTP/1.1


Accept: */*


Accept-Language: zh-cn


UA-CPU: x86


Accept-Encoding: gzip, deflate


User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727; MAXTHON 2.0)


Host: logs:81


Connection: Keep-Alive


4.2.2.    服务端返回无受权回应
HTTP/1.1 401 Unauthorized


Content-Length: 1327


Content-Type: text/html


Server: Microsoft-IIS/6.0


WWW-Authenticate: Negotiate


WWW-Authenticate: NTLM


X-Powered-By: ASP.NET


Date: Wed, 14 Nov 2007 08:27:18 GMT


4.2.3.    客户端选择Kerberos验证,发送验证票到服务端
客户端在域中,而且以域帐户登陆,因此客户端IE选择使用Kerberos身份验证,发送与用户的验证票到服务端。


GET /iisstart.htm HTTP/1.1


Accept: */*


Accept-Language: zh-cn


UA-CPU: x86


Accept-Encoding: gzip, deflate


User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727; MAXTHON 2.0)


Host: logs:81


Connection: Keep-Alive


Authorization: Negotiate YIIEzQYGKwYBBQUCoIIEwTCCBL2gJDAiBgkqhkiC9xIBAgIGCSqGSIb3EgECAgYKKwYBBAGCNwICCqKCBJMEggSPYIIEiwYJKoZIhvcSAQICAQBuggR6MIIEdqADAgEFoQMCAQ6iBwMFACAAAACjggOiYYIDnjCCA5qgAwIBBaEOGwxTWkJUSS5HT1YuQ06iFzAVoAMCAQKhDjAMGwRIVFRQGwRsb2dzo4IDaDCCA2SgAwIBF6EDAgEMooIDVgSCA1IeN8fZeLtzkw+5H8HOKmM8zgDOVL5GmeXoS8dMgE20RtI14EVWWZLn2j0AMXTqMOA550Grsadh89vZ89+6vprkVL0v49FM+gxHFCmZSOvLTIawBqXvLU6w1Pni8PN1pbhOKCRVON6+5XH4MN8Rfuqpyy1A/2gfeQIfLMMHs73yohp7h7QJP29b61jm0vj1xE0jEP7EupHlr225vrrVCnktTksbyqi88kIZlCB84J1gTqYoNeOycn4Qzvv8x6z1AsCfo2SBSwo1tj38BK2Fbu+BRXw26RrebGWPkILYwqED7bSR+RlDdokEhjubbyaWcnIjiSXZaN5kQqZQqms3iqhUrZpX7RaaV5BsMOgJs7LwYmc3uM5v7YqljwFD3T44XfpAiS3xlyirP3modOR1l+hV2xdIIFusXtRzY7rTkmEb2F3dGjTiMXySrc0GGhe3TrIeH9nB/2Udo/Z9m0ifXC0EU2fFogefmDc322vHhhv9gEYccG44Q/cnWx8gY9GfWCRihlaefGK+DmCvm+515UFYeIcG5KafXBQw3KX7MjI4/4hlAh3mQNn9p3nX0ePy1G1RRV2SToN7eg1PkaaYXDeC6MSIwCb53MfebzpyN0LKzmPZ6GneLYbyBIpANzPNoXz/LADA1h/l8F098ti1fThPVkUgoehgy1iyovTXyqJg6rojI0juIH7fKfc/UpfO+eLMhsquhH1KNjkCTD2CkdUfcsEU7B15j15p1OyGeg5/tEbRE67+NAWkfLSPp5R3tzGqjAh39w8n/8EWot9DBlHwk+qJp3rMFJZIvNtmXuvqnUW1NGpO1GIf78PBixyFwrJSo5syTfCiWIcw9YQ7MyvuyynAmsXeaI5+OP/GfmGpnvt5kMznu5q/nNf7LMV8n6x2+lmNlcPJiWr+KckPM9Nvntw2h/bl2qGnHDdOqNYI2N0VxzIm8wY6dWS3NIwlGl/usMjjebaELFP6rdHjpVG6pziJYjrBrws5DbqCxJ1EOeQdBiT8l1O6OUQqdOBVZH6/bj5MkLghWv0edHG8TJ4OGa69nMHDwTBOyuyRbTr5uWWFnESdyAGGbfGlJjuvSSzxgZViMSB2j8Ulk8x8MCqrupEK2i0UR6HrMNMJIDJsVcXTpIG6MIG3oAMCAReiga8EgazteAbcguseBpQnHeJihLFO78PfjI2Qop+MkH9jCOrvO9cQns1GzOKByoAbeP307QQq4zbaDF3EJlOC//4k4A6W4dc4k5lNeOgwR4LEvbIQKpdlljFiW8XUb+IgovsOlZEG0qFQgZY0I35I4Uvk/2dDkz06DGiDsQ0IENrRIMT4/7xgMSmkzspO2ojSbG5aKlbjK203QxMlkEoxb8WpJFZQggUqrLAr0q2graET


4.2.4.    服务端验证经过,返回资源
HTTP/1.1 200 OK


Content-Length: 167


Content-Type: text/html


Last-Modified: Wed, 14 Nov 2007 08:21:24 GMT


Accept-Ranges: bytes


ETag: "bf2d54589726c81:e35"


Server: Microsoft-IIS/6.0


X-Powered-By: ASP.NET


WWW-Authenticate: Negotiate oYGgMIGdoAMKAQChCwYJKoZIgvcSAQICooGIBIGFYIGCBgkqhkiG9xIBAgICAG9zMHGgAwIBBaEDAgEPomUwY6ADAgEXolwEWrdYWb37ROEMMnP/4vTBwSe9hVe4XklXCWqFKG16d53aBUiTEem+lrFE8ycBgSln3zme63lKfSn9UHoNTlT100T86wxllsyrrMe437ElPcxI4pgcv9rNKU9aKg==


Date: Wed, 14 Nov 2007 08:27:18 GMT






<html>






<head>


<meta HTTP-EQUIV="Content-Type" Content="text/html; charset=gb2312">






</head>






<body bgcolor=white>


This is a simple page!






</body>


</html>






4.3.    客户端用机器名访问服务器,客户端用户以客户端本地用户登陆,用户名/口令跟服务器帐户不匹配
4.3.1.    客户端IE申请页面
GET /iisstart.htm HTTP/1.1


Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, application/x-silverlight, */*


Accept-Language: zh-cn


UA-CPU: x86


Accept-Encoding: gzip, deflate


User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727)


Host: logs:81


Connection: Keep-Alive


4.3.2.    服务端返回无受权回应
HTTP/1.1 401 Unauthorized


Content-Length: 1327


Content-Type: text/html


Server: Microsoft-IIS/6.0


WWW-Authenticate: Negotiate


WWW-Authenticate: NTLM


X-Powered-By: ASP.NET


Date: Wed, 14 Nov 2007 08:58:13 GMT


4.3.3.    客户端选择NTLM验证,请求质询码
GET /iisstart.htm HTTP/1.1


Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, application/x-silverlight, */*


Accept-Language: zh-cn


UA-CPU: x86


Accept-Encoding: gzip, deflate


User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727)


Host: logs:81


Connection: Keep-Alive


Authorization: Negotiate TlRMTVNTUAABAAAAB4IIogAAAAAAAAAAAAAAAAAAAAAFAs4OAAAADw==


4.3.4.    服务器返回质询码
HTTP/1.1 401 Unauthorized


Content-Length: 1251


Content-Type: text/html


Server: Microsoft-IIS/6.0


WWW-Authenticate: Negotiate TlRMTVNTUAACAAAACgAKADgAAAAFgomibnmMcRgPlTMAAAAAAAAAAHwAfABCAAAABQLODgAAAA9TAFoAQgBUAEkAAgAKAFMAWgBCAFQASQABAAgATABPAEcAUwAEABgAcwB6AGIAdABpAC4AZwBvAHYALgBjAG4AAwAiAGwAbwBnAHMALgBzAHoAYgB0AGkALgBnAG8AdgAuAGMAbgAFABgAcwB6AGIAdABpAC4AZwBvAHYALgBjAG4AAAAAAA==


X-Powered-By: ASP.NET


Date: Wed, 14 Nov 2007 08:58:13 GMT


4.3.5.    客户端发送用登录本机的帐户加密后的质询码
GET /iisstart.htm HTTP/1.1


Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, application/x-silverlight, */*


Accept-Language: zh-cn


UA-CPU: x86


Accept-Encoding: gzip, deflate


User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727)


Host: logs:81


Connection: Keep-Alive


Authorization: Negotiate TlRMTVNTUAADAAAAGAAYAHYAAAAYABgAjgAAAAoACgBIAAAAGgAaAFIAAAAKAAoAbAAAAAAAAACmAAAABYKIogUCzg4AAAAPSgBJAE4ASgBaAEEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIASgBJAE4ASgBaACY8afODxKsFAAAAAAAAAAAAAAAAAAAAAPfRbw7FX9gKolM+6+QhqsRU+MWS3jKLkQ==


4.3.6.    服务端返回无受权回应
HTTP/1.1 401 Unauthorized


Content-Length: 1251


Content-Type: text/html


Server: Microsoft-IIS/6.0


WWW-Authenticate: Negotiate


WWW-Authenticate: NTLM


X-Powered-By: ASP.NET


Date: Wed, 14 Nov 2007 08:58:13 GMT


4.3.7.    客户端及选选择NTLM验证,要求输入用户名和口令,再次请求质询码
GET /iisstart.htm HTTP/1.1


Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, application/x-silverlight, */*


Accept-Language: zh-cn


UA-CPU: x86


Accept-Encoding: gzip, deflate


User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727)


Host: logs:81


Connection: Keep-Alive


Authorization: Negotiate TlRMTVNTUAABAAAAB4IIogAAAAAAAAAAAAAAAAAAAAAFAs4OAAAADw==


4.3.8.    服务端返回质询码
HTTP/1.1 401 Unauthorized


Content-Length: 1251


Content-Type: text/html


Server: Microsoft-IIS/6.0


WWW-Authenticate: Negotiate TlRMTVNTUAACAAAACgAKADgAAAAFgomi3CZKUW4302QAAAAAAAAAAHwAfABCAAAABQLODgAAAA9TAFoAQgBUAEkAAgAKAFMAWgBCAFQASQABAAgATABPAEcAUwAEABgAcwB6AGIAdABpAC4AZwBvAHYALgBjAG4AAwAiAGwAbwBnAHMALgBzAHoAYgB0AGkALgBnAG8AdgAuAGMAbgAFABgAcwB6AGIAdABpAC4AZwBvAHYALgBjAG4AAAAAAA==


X-Powered-By: ASP.NET


Date: Wed, 14 Nov 2007 08:59:09 GMT


4.3.9.    客户端发送使用前面输入帐户的密码加密后的质询码
GET /iisstart.htm HTTP/1.1


Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, application/x-silverlight, */*


Accept-Language: zh-cn


UA-CPU: x86


Accept-Encoding: gzip, deflate


User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727)


Host: logs:81


Connection: Keep-Alive


Authorization: Negotiate TlRMTVNTUAADAAAAGAAYAHYAAAAYABgAjgAAAAoACgBIAAAAGgAaAFIAAAAKAAoAbAAAAAAAAACmAAAABYKIogUCzg4AAAAPSgBJAE4ASgBaAGEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIASgBJAE4ASgBaAIP0UwZaV4tAAAAAAAAAAAAAAAAAAAAAAMS9l9MtVOFPSz/JmjD+/7W2ssAdBrkvwQ==


4.3.10.     服务端验证经过,返回资源
HTTP/1.1 200 OK


Content-Length: 167


Content-Type: text/html


Last-Modified: Wed, 14 Nov 2007 08:21:24 GMT


Accept-Ranges: bytes


ETag: "bf2d54589726c81:e35"


Server: Microsoft-IIS/6.0


X-Powered-By: ASP.NET


Date: Wed, 14 Nov 2007 08:59:09 GMT






<html>






<head>


<meta HTTP-EQUIV="Content-Type" Content="text/html; charset=gb2312">






</head>






<body bgcolor=white>


This is a simple page!






</body>


</html>






4.4.    客户端用机器名访问服务器,客户端用户以客户端本地用户登陆,用户名/口令跟服务器帐户匹配
4.4.1.    客户端IE申请页面
GET /iisstart.htm HTTP/1.1


Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, application/x-silverlight, */*


Accept-Language: zh-cn


UA-CPU: x86


Accept-Encoding: gzip, deflate


User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727)


Host: logs:81


Connection: Keep-Alive


4.4.2.    服务端返回无受权回应
HTTP/1.1 401 Unauthorized


Content-Length: 1327


Content-Type: text/html


Server: Microsoft-IIS/6.0


WWW-Authenticate: Negotiate


WWW-Authenticate: NTLM


X-Powered-By: ASP.NET


Date: Wed, 14 Nov 2007 09:11:09 GMT


4.4.3.    客户端选择NTLM验证,请求质询码
GET /iisstart.htm HTTP/1.1


Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, application/x-silverlight, */*


Accept-Language: zh-cn


UA-CPU: x86


Accept-Encoding: gzip, deflate


User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727)


Host: logs:81


Connection: Keep-Alive


Authorization: Negotiate TlRMTVNTUAABAAAAB4IIogAAAAAAAAAAAAAAAAAAAAAFAs4OAAAADw==


4.4.4.    服务器返回质询码
HTTP/1.1 401 Unauthorized


Content-Length: 1251


Content-Type: text/html


Server: Microsoft-IIS/6.0


WWW-Authenticate: Negotiate TlRMTVNTUAACAAAACgAKADgAAAAFgomil8OZAC0QBhYAAAAAAAAAAHwAfABCAAAABQLODgAAAA9TAFoAQgBUAEkAAgAKAFMAWgBCAFQASQABAAgATABPAEcAUwAEABgAcwB6AGIAdABpAC4AZwBvAHYALgBjAG4AAwAiAGwAbwBnAHMALgBzAHoAYgB0AGkALgBnAG8AdgAuAGMAbgAFABgAcwB6AGIAdABpAC4AZwBvAHYALgBjAG4AAAAAAA==


X-Powered-By: ASP.NET


Date: Wed, 14 Nov 2007 09:11:09 GMT


4.4.5.    客户端发送用登录本机的帐户加密后的质询码
GET /iisstart.htm HTTP/1.1


Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, application/x-silverlight, */*


Accept-Language: zh-cn


UA-CPU: x86


Accept-Encoding: gzip, deflate


User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727)


Host: logs:81


Connection: Keep-Alive


Authorization: Negotiate TlRMTVNTUAADAAAAGAAYAHYAAAAYABgAjgAAAAoACgBIAAAAGgAaAFIAAAAKAAoAbAAAAAAAAACmAAAABYKIogUCzg4AAAAPSgBJAE4ASgBaAEEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIASgBJAE4ASgBaAMQdxp9OWMESAAAAAAAAAAAAAAAAAAAAAMEj775cWctAx2Csmbgfq2afsGcop92oMA==


4.4.6.    服务端验证经过,返回资源
用户端登陆的用户名和密码正好能匹配到服务端的一个用户和密码,验证经过。


HTTP/1.1 200 OK


Content-Length: 167


Content-Type: text/html


Last-Modified: Wed, 14 Nov 2007 08:21:24 GMT


Accept-Ranges: bytes


ETag: "bf2d54589726c81:e35"


Server: Microsoft-IIS/6.0


X-Powered-By: ASP.NET


Date: Wed, 14 Nov 2007 09:11:09 GMT






<html>






<head>


<meta HTTP-EQUIV="Content-Type" Content="text/html; charset=gb2312">






</head>






<body bgcolor=white>


This is a simple page!






</body>


</html>






五、 集成验证总结
5.1.    客户端以ip地址访问服务器
无论客户端跟服务器是否在域、也无论客户端是否以域账号登录,只要客户端以ip地址访问服务器,那么客户端就会选择NTLM方式验证,而且不会直接发送客户端登陆用户的用户名和密码给服务器,而是会弹出一个对话框要求用户输入用户名和口令,而后发送到服务端验证。


您能够避免在使用 IP 地址或名称中包含句点的企业内部网服务器上出现这种提示,方法是,在 Internet Explorer 的“本地 Intranet”设置中,列出包含 IP 地址的服务器,或是列出包含句点的服务器名称。能够经过依次单击“工具”、“Internet 选项”、“本地 Intranet”、“站点”、“高级”来访问“本地 Intranet”设置部分。而后在“将该网站添加到区域中”输入 http://127.0.0.1 或其余相关站点的 URL。






下面总结的都是在客户端以机器名访问服务器的状况。


5.2.    服务器在域,客户端以域账号登录
若是客户端的机器在域中,同时登录用户又是以域用户登陆,那么IE选择Kerberos验证方式。


5.3.    其余状况IE都选择采用NTLM验证方式。
出来上述的两种状况,其余状况,客户端都选择NTLM验证,并首先尝试把登陆客户端用户的用户名和密码传送给服务器验证,若是验证经过了,被直接受权访问;若是验证没经过,客户端弹出对话框要求输入用户名和密码,而后再传送到服务端验证,直到验证经过。






集成 Windows 身份验证Kerberos的验证方式是 Intranet 环境中最好的身份验证方案,在这种用户拥有 Windows 域账户,Kerberos验证不在网络上传递用户密码,只用传送一个用户验证票。NTLM要传送用户的密码,可是密码通过处理后派生出一个8字节的key加密质询码,也是比较安全的。










4、  基自己份验证
客户端IE请求服务端IIS的一个页面iisstart.htm。


IIS服务端设置:


l         不启用匿名访问


l         只启用基自己份验证






一、 客户端IE申请页面
GET /iisstart.htm HTTP/1.1


Accept: */*


Accept-Language: zh-cn


UA-CPU: x86


Accept-Encoding: gzip, deflate


User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727; MAXTHON 2.0)


Host: logs:81


Connection: Keep-Alive


二、 服务端返回无受权回应,并告知客户端要求基自己份验证
服务端设置的基自己份验证,因此这里返回的无受权回应的http头中包含 WWW-Authenticate: Basic 头,告诉客户端,服务端要求的是基自己份验证


HTTP/1.1 401 Unauthorized


Content-Length: 1327


Content-Type: text/html


Server: Microsoft-IIS/6.0


WWW-Authenticate: Basic realm="logs"


X-Powered-By: ASP.NET


Date: Mon, 19 Nov 2007 06:15:57 GMT


三、 客户端弹出对话框要求输入用户名和密码
GET /iisstart.htm HTTP/1.1


Accept: */*


Accept-Language: zh-cn


UA-CPU: x86


Accept-Encoding: gzip, deflate


User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727; MAXTHON 2.0)


Host: logs:81


Connection: Keep-Alive


Authorization: Basic YWRtaW5pc3RyYXRvcjpzemJ0aUAxMDA1


客户端把用户名和密码转换成base64编码后,直接发送到服务端。


发送到服务器的“Authorization: Basic”头里面的“YWRtaW5pc3RyYXRvcjpzemJ0aUAxMDA1”部分就是用户的用户名和密码,通过base64解码后是这样的:administrator:szbti@1005


四、 服务端验证经过,返回资源
HTTP/1.1 200 OK


Content-Length: 167


Content-Type: text/html


Last-Modified: Wed, 14 Nov 2007 08:21:24 GMT


Accept-Ranges: bytes


ETag: "bf2d54589726c81:e7d"


Server: Microsoft-IIS/6.0


X-Powered-By: ASP.NET


Date: Mon, 19 Nov 2007 06:16:34 GMT






<html>






<head>


<meta HTTP-EQUIV="Content-Type" Content="text/html; charset=gb2312">






</head>






<body bgcolor=white>


This is a simple page!






</body>


</html>
git

站点

7个Loading图标在线生成工具 
github

http://blog.csdn.net/cuixiping/article/details/5663627

1. 主机屋
2. http://www.idcpcw.com/
3. http://www.adminxy.com/




http://www.cjkidc.com  希最安克


东路互联


http://www.tuita.biz


中国频道




希最安克是不错的,另外不错的还有
987HK
新网
新网互联
35互联
商务中国
时代互联
中资源 
万网 


导航栏

100 Great CSS Menu Tutorials
http://www.noupe.com/css/100-great-css-menu-tutorials.html


30 Cutting Edge Examples Of CSS Navigation
http://www.1stwebdesigner.com/css/cutting-edge-examples-css-navigation/


30 Exceptional CSS Navigation Techniques
http://sixrevisions.com/css/30-exceptional-css-navigation-techniques/


40 Premium CSS Menu and Navigation Solutions
http://www.tripwiremagazine.com/2012/06/css-menu-and-navigation.html


55 Wonderful CSS Navigation Menu Designs
http://inspirationfeed.com/inspiration/55-wonderful-css-navigation-menu-designs/

html




<!DOCTYPE html>


会影响浏览器默认的样式。 user agent stylesheet
好比对于table 的定义。




.x-form-textarea {


        BACKGROUND-IMAGE: url(images/form/text-bg.gif);


        LINE-HEIGHT: normal;


        HEIGHT: auto !important


}
若是父的CSS 有定义HEIGHT : 17px 这样明确的高度
在firefox 中 , 子的css 会自动覆盖父的定义
当时IE中却不行, 须要加上 !important








td无内容无边框问题解决方法 问题描述 在ie(经测试IE8已经不存在此问题)中若是td标签中没有内容时,存
<table width="568"border="1"cellspacing="0"style="border-collapse:collapse;">




internet explorer cannot open the internet site operation aborted


Internet Explorer没法打开internet站点,已终止操做的解决方法合集


缘由是html 的元素匹配不对称 
或是 ext 组件提早 create






13.作邮件样式注意事项 email html css 要点 
一、邮件不能采用div布局,只能使用table,如使用div布局,不能出现并排显示的内容,outlook下载后,div布局的内容会横排显示,不能竖排显示
二、涉及到须要用背景图片的,须要使用table的background属性,而不是style里面的background样式
三、邮件中不能定义font-family为汉字的字体,须要默认字体,或者不定义,gmail等邮箱会过滤掉字体样式属性
四、邮件里设置的高度,gmail会过滤掉,若是空内容,是没法把容器撑开的,通常采用img图片撑开,但须要注意,空白位置须要增长font-size:0px;line-height:0px;两个属性,保证样式在发到邮箱后,img下面不会多出空行
五、邮件宽度不超过650px
六、在全部td和tr标签上添加  style="border: 0px; padding: 0px; margin: 0px;"样式,保证各个浏览器样式统一


12.
font 简写属性在一个声明中设置全部字体属性。
能够按顺序设置以下属性:


    font-style  ==> 该属性设置使用斜体、倾斜或正常字体。斜体字体一般定义为字体系列中的一个单独的字体。理论上讲,用户代理能够根据正常字体计算一个斜体字体。
    font-variant  ==> 该属性主要用于定义小型大写字母文本。理论上,用户代理能够根据正常字体计算出小型大写字母字体。normal
    font-weight
    font-size/line-height
    font-family




11. span 换行/不换行-解决
相信不少朋友在设置span里面的内容有背景的时候会遇到以下问题:
一、设为display:block能够解决有背景,但换行,因block属性缘由,必会换行
二、不用display:block背景便不会所有显示出来
三、float:left也很差用
四、有的只好用定位,较麻烦
解决办法:
把display设置为:inline-block




10. input 的宽度设置成 style="width:100%"
会依据 value的值所有撑开,  这个时候须要设置最外层的table 的  table-layout:fixed;


9..datatable-href-cell_special_link{ font-size: 10px; vertical-align:text-middle; padding-bottom: 2px; font-weight: normal; text-align: left; overflow:hidden; white-space:normal;}
.datatable-href-cell_special_link a{color:#757A8D}


8。http://hi.baidu.com/small_%C2%EC%D2%CF/blog/item/8758248e36f64be5f11f3652.html
history对象   history对象控制前进和后退。history对象是Window对象的一个子对象.
history提供了3个方法:
1). history.back();   //浏览器后退
2). history.forward();//浏览器前进
3). history.go(-2);   //浏览器后退两次,当history.go()方法的参数为0时,表示刷新当前页面,




7.window open参数
具体总结的各个属性参数以下:
window = object.open([URL ][, name ][, features ][, replace]]]])
URL:新窗口的URL地址
name:新窗口的名称,能够为空
featurse:属性控制字符串,在此控制窗口的各类属性,属性之间以逗号隔开。
fullscreen= { yes/no/1/0 } 是否全屏,默认no
channelmode= { yes/no/1/0 } 是否显示频道栏,默认no
toolbar= { yes/no/1/0 } 是否显示工具条,默认no
location= { yes/no/1/0 } 是否显示地址栏,默认no
directories = { yes/no/1/0 } 是否显示转向按钮,默认no
status= { yes/no/1/0 } 是否显示窗口状态条,默认no
menubar= { yes/no/1/0 } 是否显示菜单,默认no
scrollbars= { yes/no/1/0 } 是否显示滚动条,默认yes
resizable= { yes/no/1/0 } 是否窗口可调整大小,默认no
width=number 窗口宽度(像素单位)
height=number 窗口高度(像素单位)
top=number 窗口离屏幕顶部距离(像素单位)
left=number 窗口离屏幕左边距离(像素单位) 




6.图片透明的css设置
filter: Alpha(opacity=30);-moz-opacity:.1;opacity:0.1;


5. 解决Html IE8 readonly的 textbox 中还有 光标
HTML code<inputtype="text" readonly="readonly" UNSELECTABLE='on'/>


4.     style = "WORD-BREAK: break-all"  
table 的td 里加了textarea, 宽度设为 100% .会自动撑开textarea. 添加以上到 table便可


3. textarea的宽度能够经过设置 width 和 height达到


2. if(navigator.userAgent.indexOf("Firefox")>0)




1.
条件注释就是一些if判断,但这些判断不是在脚本里执行的,而是直接在html代码里执行的,好比:
<!–[if IE]>
    这里是正常的html代码
<![endif]–>






一、条件注释的基本结构和HTML的注释(<!– –>)是同样的。所以IE之外的浏览器将会把它们看做是普通的注释而彻底忽略它们。
二、IE将会根据if条件来判断是否如解析普通的页面内容同样解析条件注释里的内容。
三、条件注释使用的是HTML的注释结构,所以他们只能使用在HTML文件里,而不能在CSS文件中使用。
   那若是当前的浏览器是IE,但版本比IE5还低,该怎么办呢,能够使用<!–[if ls IE 5]>,固然,根据条件注释只能在IE5+的环境之下,因此<!–[if ls IE 5]>根本不会被执行。
lte:就是Less than or equal to的简写,也就是小于或等于的意思。
lt :就是Less than的简写,也就是小于的意思。
gte:就是Greater than or equal to的简写,也就是大于或等于的意思。
gt :就是Greater than的简写,也就是大于的意思。
! : 就是不等于的意思,跟javascript里的不等于判断符相同


<!--[if IE]>
 <h1>您正在使用IE浏览器</h1>
 <!--[if IE 5]>
    <h2>版本 5</h2>
 <![endif]-->
 <!--[if IE 5.0]>
    <h2>版本 5.0</h2>
 <![endif]-->
 <!--[if IE 5.5]>
    <h2>版本 5.5</h2>
 <![endif]-->
 <!--[if IE 6]>
    <h2>版本 6</h2>
 <![endif]-->
 <!--[if IE 7]>
    <h2>版本 7</h2>
 <![endif]-->
<![endif]-->


2. meta的做用:  http://www.51xuediannao.com/html+css/htmlcssjq/73.html
http-equiv 属性 -- HTTP协议的响应头报文
此属性出如今meta标签中
此属性用于代替name,HTTP服务器经过此属性收集HTTP协议的响应头报文
此属性的HTTP协议的响应头报文的值应使用content属性描述
http-equiv示例
<meta http-equiv="content-type" content="text/html; charset=utf-8" />


告诉浏览器等设备,文件为html文件,且使用了utf8编码
 
<meta http-equiv="content-language" content="zh-CN" />
告诉浏览器等设备,语言使用了中文
 
经常使用的http-equiv类型
charset -- charset 定义编码信息
refresh -- refresh 刷新与跳转网页
no-cache -- HTML meta no-cache 定义页面缓存
expires -- HTML meta expires 定义网页缓存过时时间


说明:设定页面使用的字符集,用以说明主页制做所使用的文字已经语言,浏览器会根据此来调用相应的字符集显示page内容。
用法:
<meta http-equiv="Content-Type" Content="text/html; Charset=gb2312″ />
<meta http-equiv="Content-Language" Content="zh-CN" />


Refresh (刷新)


说明:让网页多长时间(秒)刷新本身,或在多长时间后让网页自动连接到其它网页。
用法:
<meta http-equiv="Refresh" Content="30″>
<meta http-equiv="Refresh" Content="5; Url=http://www.microsoft.com" />


Expires (期限)


说明:指定网页在缓存中的过时时间,一旦网页过时,必须到服务器上从新调阅。
用法:
<meta http-equiv="Expires" Content="0″ />
<meta http-equiv="Expires" Content="Wed, 26 Feb 1997 08:21:57 GMT" />
注意:必须使用GMT的时间格式,或直接设为0(数字表示多少时间后过时)。


Pragma (cach模式)


说明:禁止浏览器从本地机的缓存中调阅页面内容。
用法:<meta http-equiv="Pragma" Content="No-cach" />
注意:网页不保存在缓存中,每次访问都刷新页面。这样设定,访问者将没法脱机浏览。


Set-Cookie (cookie设定)


说明:浏览器访问某个页面时会将它存在缓存中,下次再次访问时就可从缓存中读取,以提升速度。
当你但愿访问者每次都刷新你广告的图标,或每次都刷新你的计数器,就要禁用缓存了。
一般HTML文件没有必要禁用缓存,对于ASP等页面,就能够使用禁用缓存,由于每次看到的页面都是在服务器动态生成的,缓存就失去意义。若是网页过时,那么存盘的cookie将被删除。
用法:
<meta http-equiv="Set-Cookie" Content="cookievalue=xxx; expires=Wednesday,21-Oct-9816:14:21 GMT; ath=/">


Window-target (显示窗口的设定)


说明:强制页面在当前窗口以独立页面显示。
用法:<meta http-equiv="Widow-target" Content="_top">
注意:这个属性是用来防止别人在框架里调用你的页面。Content选项:_blank、_top、_self、_parent。


3. css IE 兼容
* html #mtReqTopLink
{
display: block;
color: white;
text-decoration: none;
border-bottom: 1px solid #778;
border-right: 1px solid #778;
background: url("Required_Normal.png") no-repeat;
height:32px;
}


* html #mtOptTopLink
{
display: block;
color: white;
text-decoration: none;
border-bottom: 1px solid #778;
border-right: 1px solid #778;
background: url("Required_Normal.png") no-repeat;
height:32px;
}


4. IE 中对a:link , a:hover的设定须要设置href才能生效


HTML 状态码
1xx 消息




这一类型的状态码,表明请求已被接受,须要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。因为HTTP/1.0协议中没有定义任何1xx状态码,因此除非在某些试验条件下,服务器禁止向此类客户端发送1xx响应。 这些状态码表明的响应都是信息性的,标示客户应该采起的其余行动。
100 Continue
客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分,或者若是请求已经完成,忽略这个响应。服务器必须在请求完成后向客户端发送一个最终响应。
101 Switching Protocols
服务器已经理解了客户端的请求,并将经过Upgrade消息头通知客户端采用不一样的协议来完成这个请求。在发送完这个响应最后的空行后,服务器将会切换到在Upgrade消息头中定义的那些协议。: 只有在切换新的协议更有好处的时候才应该采起相似措施。例如,切换到新的HTTP版本比旧版本更有优点,或者切换到一个实时且同步的协议以传送利用此类特性的资源。
102 Processing
由WebDAV(RFC 2518)扩展的状态码,表明处理将被继续执行。


2xx 成功




这一类型的状态码,表明请求已成功被服务器接收、理解、并接受。
200 OK
请求已成功,请求所但愿的响应头或数据体将随此响应返回。
201 Created
请求已经被实现,并且有一个新的资源已经依据请求的须要而建立,且其URI已经随Location头信息返回。假如须要的资源没法及时建立的话,应当返回'202 Accepted'。
202 Accepted
服务器已接受请求,但还没有处理。正如它可能被拒绝同样,最终该请求可能会也可能不会被执行。在异步操做的场合下,没有比发送这个状态码更方便的作法了。:返回202状态码的响应的目的是容许服务器接受其余过程的请求(例如某个天天只执行一次的基于批处理的操做),而没必要让客户端一直保持与服务器的链接直到批处理操做所有完成。在接受请求处理并返回202状态码的响应应当在返回的实体中包含一些指示处理当前状态的信息,以及指向处理状态监视器或状态预测的指针,以便用户可以估计操做是否已经完成。
203 Non-Authoritative Information
服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的肯定集合,而是来自本地或者第三方的拷贝。当前的信息多是原始版本的子集或者超集。例如,包含资源的元数据可能致使原始服务器知道元信息的超级。使用此状态码不是必须的,并且只有在响应不使用此状态码便会返回200 OK的状况下才是合适的。
204 No Content
服务器成功处理了请求,但不须要返回任何实体内容,而且但愿返回更新了的元信息。响应可能经过实体头部的形式,返回新的或更新后的元信息。若是存在这些头部信息,则应当与所请求的变量相呼应。
若是客户端是浏览器的话,那么用户浏览器应保留发送了该请求的页面,而不产生任何文档视图上的变化,即便按照规范新的或更新后的元信息应当被应用到用户浏览器活动视图中的文档。
因为204响应被禁止包含任何消息体,所以它始终以消息头后的第一个空行结尾。
205 Reset Content
服务器成功处理了请求,且没有返回任何内容。可是与204响应不一样,返回此状态码的响应要求请求者重置文档视图。该响应主要是被用于接受用户输入后,当即重置表单,以便用户可以轻松地开始另外一次输入。
与204响应同样,该响应也被禁止包含任何消息体,且以消息头后的第一个空行结束。
206 Partial Content
服务器已经成功处理了部分GET请求。相似于FlashGet或者迅雷这类的HTTP 下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载。
该请求必须包含Range头信息来指示客户端但愿获得的内容范围,而且可能包含If-Range来做为请求条件。
响应必须包含以下的头部域:
Content-Range用以指示本次响应中返回的内容的范围;若是是Content-Type为multipart/byteranges的多段下载,则每一multipart段中都应包含Content-Range域用以指示本段的内容范围。假如响应中包含Content-Length,那么它的数值必须匹配它返回的内容范围的真实字节数。
Date
ETag和/或Content-Location,假如一样的请求本应该返回200响应。
Expires, Cache-Control,和/或Vary,假如其值可能与以前相同变量的其余响应对应的值不一样的话。
假如本响应请求使用了If-Range强缓存验证,那么本次响应不该该包含其余实体头;假如本响应的请求使用了If-Range弱缓存验证,那么本次响应禁止包含其余实体头;这避免了缓存的实体内容和更新了的实体头信息之间的不一致。不然,本响应就应当包含全部本应该返回200响应中应当返回的全部实体头部域。
海姹网(网址:http://www.seacha.com),标签:HTTP状态码完整介绍, HTTP,协议,状态码,seo
假如ETag或Last-Modified头部不能精确匹配的话,则客户端缓存应禁止将206响应返回的内容与以前任何缓存过的内容组合在一块儿。
任何不支持Range以及Content-Range头的缓存都禁止缓存206响应返回的内容。
207 Multi-Status
由WebDAV(RFC 2518)扩展的状态码,表明以后的消息体将是一个XML消息,而且可能依照以前子请求数量的不一样,包含一系列独立的响应代码。


3xx 重定向




这类状态码表明须要客户端采起进一步的操做才能完成请求。一般,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的Location域中指明。
当且仅当后续的请求所使用的方法是GET或者HEAD时,用户浏览器才能够在没有用户介入的状况下自动提交所须要的后续请求。客户端应当自动监测无限循环重定向(例如:A->A,或者A->B->C->A),由于这会致使服务器和客户端大量没必要要的资源消耗。按照HTTP/1.0版规范的建议,浏览器不该自动访问超过5次的重定向。
300 Multiple Choices
被请求的资源有一系列可供选择的回馈信息,每一个都有本身特定的地址和浏览器驱动的商议信息。用户或浏览器可以自行选择一个首选的地址进行重定向。
除非这是一个HEAD请求,不然该响应应当包括一个资源特性及地址的列表的实体,以便用户或浏览器从中选择最合适的重定向地址。这个实体的格式由Content-Type定义的格式所决定。浏览器可能根据响应的格式以及浏览器自身能力,自动做出最合适的选择。固然,RFC 2616规范并无规定这样的自动选择该如何进行。
若是服务器自己已经有了首选的回馈选择,那么在Location中应当指明这个回馈的URI;浏览器可能会将这个Location值做为自动重定向的地址。此外,除非额外指定,不然这个响应也是可缓存的。
301 Moved Permanently
被请求的资源已永久移动到新位置,而且未来任何对此资源的引用都应该使用本响应返回的若干个URI之一。若是可能,拥有连接编辑功能的客户端应当自动把请求的地址修改成从服务器反馈回来的地址。除非额外指定,不然这个响应也是可缓存的。
新的永久性的URI应当在响应的Location域中返回。除非这是一个HEAD请求,不然响应的实体中应当包含指向新的URI的超连接及简短说明。
若是这不是一个GET或者HEAD请求,所以浏览器禁止自动进行重定向,除非获得用户的确认,由于请求的条件可能所以发生变化。
注意:对于某些使用HTTP/1.0协议的浏览器,当它们发送的POST请求获得了一个301响应的话,接下来的重定向请求将会变成GET方式。
302 Found
请求的资源如今临时从不一样的URI响应请求。因为这样的重定向是临时的,客户端应当继续向原有地址发送之后的请求。只有在Cache-Control或Expires中进行了指定的状况下,这个响应才是可缓存的。
新的临时性的URI应当在响应的Location域中返回。除非这是一个HEAD请求,不然响应的实体中应当包含指向新的URI的超连接及简短说明。
若是这不是一个GET或者HEAD请求,那么浏览器禁止自动进行重定向,除非获得用户的确认,由于请求的条件可能所以发生变化。
注意:虽然RFC 1945和RFC 2068规范不容许客户端在重定向时改变请求的方法,可是不少现存的浏览器将302响应视做为303响应,而且使用GET方式访问在Location中规定的URI,而无视原先请求的方法。状态码303和307被添加了进来,用以明确服务器期待客户端进行何种反应。
303 See Other
对应当前请求的响应能够在另外一个URI上被找到,并且客户端应当采用GET的方式访问那个资源。这个方法的存在主要是为了容许由脚本激活的POST请求输出重定向到一个新的资源。这个新的URI不是原始资源的替代引用。同时,303响应禁止被缓存。固然,第二个请求(重定向)可能被缓存。
新的URI应当在响应的Location域中返回。除非这是一个HEAD请求,不然响应的实体中应当包含指向新的URI的超连接及简短说明。
注意:许多HTTP/1.1版之前的浏览器不能正确理解303状态。若是须要考虑与这些浏览器之间的互动,302状态码应该能够胜任,由于大多数的浏览器处理302响应时的方式偏偏就是上述规范要求客户端处理303响应时应当作的。
304 Not Modified
若是客户端发送了一个带条件的GET请求且该请求已被容许,而文档的内容(自上次访问以来或者根据请求的条件)并无改变,则服务器应当返回这个状态码。304响应禁止包含消息体,所以始终以消息头后的第一个空行结尾。
该响应必须包含如下的头信息:
Date,除非这个服务器没有时钟。假如没有时钟的服务器也遵照这些规则,那么代理服务器以及客户端能够自行将Date字段添加到接收到的响应头中去(正如RFC 2068中规定的同样),缓存机制将会正常工做。
ETag和/或Content-Location,假如一样的请求本应返回200响应。
Expires, Cache-Control,和/或Vary,假如其值可能与以前相同变量的其余响应对应的值不一样的话。
假如本响应请求使用了强缓存验证,那么本次响应不该该包含其余实体头;不然(例如,某个带条件的GET请求使用了弱缓存验证),本次响应禁止包含其余实体头;这避免了缓存了的实体内容和更新了的实体头信息之间的不一致。
假如某个304响应指明了当前某个实体没有缓存,那么缓存系统必须忽视这个响应,而且重复发送不包含限制条件的请求。
假如接收到一个要求更新某个缓存条目的304响应,那么缓存系统必须更新整个条目以反映全部在响应中被更新的字段的值。
305 Use Proxy
被请求的资源必须经过指定的代理才能被访问。Location域中将给出指定的代理所在的URI信息,接收者须要重复发送一个单独的请求,经过这个代理才能访问相应资源。只有原始服务器才能建立305响应。
注意:RFC 2068中没有明确305响应是为了重定向一个单独的请求,并且只能被原始服务器建立。忽视这些限制可能致使严重的安全后果。
306 Switch Proxy
在最新版的规范中,306状态码已经再也不被使用。
307 Temporary Redirect
请求的资源如今临时从不一样的URI响应请求。因为这样的重定向是临时的,客户端应当继续向原有地址发送之后的请求。只有在Cache-Control或Expires中进行了指定的状况下,这个响应才是可缓存的。
新的临时性的URI应当在响应的Location域中返回。除非这是一个HEAD请求,不然响应的实体中应当包含指向新的URI的超连接及简短说明。由于部分浏览器不能识别307响应,所以须要添加上述必要信息以便用户可以理解并向新的URI发出访问请求。
若是这不是一个GET或者HEAD请求,那么浏览器禁止自动进行重定向,除非获得用户的确认,由于请求的条件可能所以发生变化。




4xx 请求错误




这类的状态码表明了客户端看起来可能发生了错误,妨碍了服务器的处理。除非响应的是一个HEAD请求,不然服务器就应该返回一个解释当前错误情况的实体,以及这是临时的仍是永久性的情况。这些状态码适用于任何请求方法。浏览器应当向用户显示任何包含在此类错误响应中的实体内容。
若是错误发生时客户端正在传送数据,那么使用TCP的服务器实现应当仔细确保在关闭客户端与服务器之间的链接以前,客户端已经收到了包含错误信息的数据包。若是客户端在收到错误信息后继续向服务器发送数据,服务器的TCP栈将向客户端发送一个重置数据包,以清除该客户端全部还未识别的输入缓冲,以避免这些数据被服务器上的应用程序读取并干扰后者。
400 Bad Request
因为包含语法错误,当前请求没法被服务器理解。除非进行修改,不然客户端不该该重复提交这个请求。
401 Unauthorized
当前请求须要用户验证。该响应必须包含一个适用于被请求资源的WWW-Authenticate信息头用以询问用户信息。客户端能够重复提交一个包含恰当的Authorization头信息的请求。若是当前请求已经包含了Authorization证书,那么401响应表明着服务器验证已经拒绝了那些证书。若是401响应包含了与前一个响应相同的身份验证询问,且浏览器已经至少尝试了一次验证,那么浏览器应当向用户展现响应中包含的实体信息,由于这个实体信息中可能包含了相关诊断信息。参见RFC 2617。
402 Payment Required
该状态码是为了未来可能的需求而预留的。
403 Forbidden
服务器已经理解请求,可是拒绝执行它。与401响应不一样的是,身份验证并不能提供任何帮助,并且这个请求也不该该被重复提交。若是这不是一个HEAD请求,并且服务器但愿可以讲清楚为什么请求不能被执行,那么就应该在实体内描述拒绝的缘由。固然服务器也能够返回一个404响应,假如它不但愿让客户端得到任何信息。
海姹网(网址:http://www.seacha.com),标签:HTTP状态码完整介绍, HTTP,协议,状态码,seo
404 Not Found
请求失败,请求所但愿获得的资源未被在服务器上发现。没有信息可以告诉用户这个情况究竟是暂时的仍是永久的。假如服务器知道状况的话,应当使用410状态码来告知旧资源由于某些内部的配置机制问题,已经永久的不可用,并且没有任何能够跳转的地址。404这个状态码被普遍应用于当服务器不想揭示到底为什么请求被拒绝或者没有其余适合的响应可用的状况下。
405 Method Not Allowed
请求行中指定的请求方法不能被用于请求相应的资源。该响应必须返回一个Allow头信息用以表示出当前资源可以接受的请求方法的列表。
鉴于PUT,DELETE方法会对服务器上的资源进行写操做,于是绝大部分的网页服务器都不支持或者在默认配置下不容许上述请求方法,对于此类请求均会返回405错误。
406 Not Acceptable
请求的资源的内容特性没法知足请求头中的条件,于是没法生成响应实体。
除非这是一个HEAD请求,不然该响应就应当返回一个包含可让用户或者浏览器从中选择最合适的实体特性以及地址列表的实体。实体的格式由Content-Type头中定义的媒体类型决定。浏览器能够根据格式及自身能力自行做出最佳选择。可是,规范中并无定义任何做出此类自动选择的标准。
407 Proxy Authentication Required
与401响应相似,只不过客户端必须在代理服务器上进行身份验证。代理服务器必须返回一个Proxy-Authenticate用以进行身份询问。客户端能够返回一个Proxy-Authorization信息头用以验证。参见RFC 2617。
408 Request Timeout
请求超时。客户端没有在服务器预备等待的时间内完成一个请求的发送。客户端能够随时再次提交这一请求而无需进行任何更改。
409 Conflict
因为和被请求的资源的当前状态之间存在冲突,请求没法完成。这个代码只容许用在这样的状况下才能被使用:用户被认为可以解决冲突,而且会从新提交新的请求。该响应应当包含足够的信息以便用户发现冲突的源头。
冲突一般发生于对PUT请求的处理中。例如,在采用版本检查的环境下,某次PUT提交的对特定资源的修改请求所附带的版本信息与以前的某个(第三方)请求向冲突,那么此时服务器就应该返回一个409错误,告知用户请求没法完成。此时,响应实体中极可能会包含两个冲突版本之间的差别比较,以便用户从新提交归并之后的新版本。
410 Gone
被请求的资源在服务器上已经再也不可用,并且没有任何已知的转发地址。这样的情况应当被认为是永久性的。若是可能,拥有连接编辑功能的客户端应当在得到用户许可后删除全部指向这个地址的引用。若是服务器不知道或者没法肯定这个情况是不是永久的,那么就应该使用404状态码。除非额外说明,不然这个响应是可缓存的。
410响应的目的主要是帮助网站管理员维护网站,通知用户该资源已经再也不可用,而且服务器拥有者但愿全部指向这个资源的远端链接也被删除。这类事件在限时、增值服务中很广泛。一样,410响应也被用于通知客户端在当前服务器站点上,本来属于某个我的的资源已经再也不可用。固然,是否须要把全部永久不可用的资源标记为'410 Gone',以及是否须要保持此标记多长时间,彻底取决于服务器拥


JQuery

jQuery.browser.msie
jQuery('#main_grid_context').height()


var s = $("#input3").val();
若是input3 没有的话, s 为 undefined




JQuery 组件:
http://www.jqwidgets.com/jquery-widgets-demo/demos/jqxcombobox/index.htm




$("input[name=selectRelType]:checked").val()
$("form[name=TemplateForm] input[type=hidden]")


2.http://www.jshtmlcss.com/103/
150个jQuery插件总有你喜欢的


http://www.jcodecraeer.com/a/jquery_js_ajaxjishu/2012/1108/529.html
40个值得你关注的jQuery插件


1.
jQuery 元素选择器
  $("p") 选取 <p> 元素。
  $("p.intro") 选取全部 class="intro" 的 <p> 元素。
  $("p#demo") 选取 id="demo" 的第一个 <p> 元素。


jQuery 属性选择器
       $("[href]") 选取全部带有 href 属性的元素。
       $("[href='#']") 选取全部带有 href 值等于 "#" 的元素。
       $("[href!='#']") 选取全部带有 href 值不等于 "#" 的元素。
       $("[href$='.jpg']") 选取全部 href 值以 ".jpg" 结尾的元素。


     jQuery CSS 选择器
       $("p").css("background-color","red");


      2. var jq=jQuery.noConflict(),帮助您使用本身的名称(好比 jq)来代替 $ 符号。

js 图形



https://github.com/Matt-Esch/simpleCanvas.js


最近发现使用VML绘制的图形在IE8下不见了,须要将IE8的Document Mode改成IE7 Standard才能够,或者你须要在页面添加这个信息:   
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
http://blog.163.com/beyond_qh/blog/static/7063837201141331937598/


超强 tree grid
http://www.treegrid.com/


有各类layout 的绘图
http://www.graphviz.org/Gallery.php


流行的JavaScript绘图库
http://www.swordair.com/blog/2011/06/626/


10款超酷的Javascript绘画和画布类库
http://www.gbin1.com/technology/javascript/20120119cooljavascriptdrawingcanvaslibraries/


http://jsdraw2d.jsfiction.com
是一个Javascript程序库,开发者能够用其建立基本的图形(如多边形、圆形、拱形等)、填充图形以及贝塞尔曲线(线性、二次及立体曲线),同时还能够在div元素中将坐标系统的默认原点更改成任意点, 也能够选择默认或是笛卡尔坐标系统。凭借jsDraw2D,开发者还能够设定图形的缩放比例。








最近作了个小型的HTML版本工做流配置。用到了几个框架。
一、MVC框架 BACKBONE
二、jquery UI 1.9实现dragaable(也能够用jquery EASYUI)
三、jquery contextMenu.js 实现右键菜单
四、draw2D.js http://www.draw2d.org/draw2d/ 绘图库(收费。之前的版本不收费,也包含右键菜单功能),功能很强大。
五、CSS绘制网格背景


1.
SVG 介绍
http://www.ibm.com/developerworks/cn/web/1107_pangjun_svgcanvas1/index.html 






http://mobile.51cto.com/design-250037_20.htm




http://www.jointjs.com/demos.html


http://demos.bonsaijs.org/demos (不支持IE)


YUI
http://developer.yahoo.com/yui/examples/


Google
https://developers.google.com/chart/interactive/docs/gallery/bubblechart




https://github.com/filamentgroup/jQuery-Visualize


https://github.com/mbostock/d3  (不支持IE)
https://github.com/mbostock/d3/wiki/Gallery




//begin


http://mbostock.github.com/protovis/ex/splines.html(不支持IE)


//end






http://jsvectoreditor.googlecode.com/svn/trunk/index.html


http://code.zemanta.com/fry/ruleanimation/






http://jsplumb.org/jquery/flowchartConnectorsDemo.html




http://alias.io/raphael/free_transform/




Jqplot的应用 
http://blog.csdn.net/wdt3385/article/details/8254177




10款优秀的jQuery图片插件
http://www.csdn.net/article/2011-06-14/299721


10个漂亮的JQuery网站
http://www.csdn.net/article/2011-03-02/292863


分享10个Js的小型库,效果然的很棒.. 
http://blog.csdn.net/rgcyc/article/details/4505873








一 Google Chart Tools


官网:https://developers.google.com/chart/


谷歌图表工具提供了一个完美的方式形象化您的网站上的数据。从简单到复杂的层次结构树图线图,图表厨房提供了大量精心设计的图表类型。填入您的数据很容易被使用所提供的客户端和服务器端工具。


在线示例:https://developers.google.com/chart/interactive/docs/examples


在线文档:http://code.google.com/apis/ajax/playground/?type=visualization


注:以上连接可能被和谐,怎么浏览,你懂的!


 


二 jqPlot 
官网:http://www.jqplot.com/


jqPlot是一个jQuery绘图插件,能够利用它制做漂亮的线状图和柱状图。jqPlot支持为图表设置各类不一样的样式。提供Tooltips,数据点高亮显示等功能.


jqPlot has been tested on IE 7, IE 8, Firefox, Safari, and Opera.


在线示例:http://www.jqplot.com/tests/


在线文档:http://www.jqplot.com/docs/files/usage-txt.html


下载地址:http://bitbucket.org/cleonello/jqplot/downloads/


 


三 Highcharts 
官网:http://www.highcharts.com/


受权协议: 对我的用户彻底免费,非开源(商用收费)


图表上标有官网的网址水印。


支持大部分的图表类型:直线图,曲线图、区域图、区域曲线图、柱状图、饼装图、散布图。


支持在线打印,导出PDF等功能。
兼容性:兼容当今全部的浏览器,包括iPhone、IE和火狐等.


在线示例:http://www.highcharts.com/demo


在线文档:http://www.highcharts.com/ref/


下载地址:http://www.highcharts.com/download


 


四 amCharts: JavaScript/HTML5 charts


官网:http://www.amcharts.com/


它是您最须要的JavaScript/HTML5图表集。咱们的包,包括串行(列,栏,线,区,步线,平滑线,烛台,OHLC图),馅饼/甜甜圈,雷达/极性和XY /分散/气泡图。


收费列表:http://www.amcharts.com/buy


在线示例:http://www.amcharts.com/javascript/100-stacked-area-chart/
在线文档:http://www.amcharts.com/docs
下载地址:http://www.amcharts.com/download

draw2d

使用paper.setViewBox 实现zoom in/out 功能时, 若是 canvas 的div 长度设置的比较大的话, 好比长,宽设置成 9999px 的时候,在IE 7 下面, label 这种figure 的 text 会跑出框框。  在其余浏览器是正常的。




3. 实现多选使用window.event.ctrlKey ,
在IE下是没有问题, 可是Firefox却不行,由于Firefox 自己须要产生的event.
因此只能修改 draw2d 自己的 
draw2d.policy.canvas.BoundingboxSelectionPolicy
这样就对应到修改canvas里面的
在onmouseup, onmousedown,onmousedrag
把event 带出来


 1. onDragStart: 拖动从什么位置开始。  
 从哪开始拖。


2. draw2d.Connection.DEFAULT_ROUTER = router;
设置 connect 的默认链接方式。 直线仍是曲线。




3. x, y 是起始点的位置
就是左上角(圆,椭圆的话就是外接四边形)


4. label 最后产生的
<text style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: start; font-size: 9px;" x="0" y="8.5" text-anchor="start" font="10px &quot;Arial&quot;" fill="#ffffff" title="FM_RADIO_RECORD" transform="matrix(1,0,0,1,793.8525,462.3415)" stroke-width="0.9476249999999998" font-size="9px"><tspan style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);" dy="3">FM_RADIO..</tspan></text>


transform转化成label 字体的大小。
若是在setZoom 以后设置字体的话, 字体大小不会产生效果。
好比字体设置变小, 不会生效。 默认字体是 12px
可是变大的话,看上去有效果


因此要控制字体的话只能从matrix(1,0,0,1,793.8525,462.3415) 入手了
matrix方法来自raphael
Raphael.matrix(a, b, c, d, e, f) 有六个参数, 实验了一下, 各参数表明的意义大体以下
a -- 横向大小比例
b -- 字体方向
c -- 字体方向
d -- 纵向大小比例
e -- 横坐标
f -- 纵坐标


实际参数意义: 
    x’=ax+cy+e
    y’=bx+dy+f 


Performance


1. 使用Ext.require 进行Ext 方式定义的js 类文件的动态导入。2. 使用Ext.load.LoadScript 导入通常的js 文件。(需判断是否已经导入过)3. 使用Ext.util.CSS.swapStyleSheet 动态导入 CSS 文件。4. User Selector 的js 和 CSS 已经实现动态导入。(从ExtjsInclude.js移除)5. DeliverableMartrix 功能的js 和CSS 实现动态导入。(从ExtjsInclude.js移除)6. ext-all.js 压缩。siza 从 4M 减小为 到 1.5 M.7.  IE中使用的www.sencha.com/s.gif改从local 读取8. 文件合并 BIG5TOGB2312.jsBIGCodeUnicode.jsGB2312TOBIG5.jsGBCodeUnicode.jsGB2312TOBIGGB.jsBIG5TOGBBIG.js==》 ToGBUnicode.jsToBigGB.js9. 文件合并object.jsarray.jsmap.js==>arraymap.js10. index page 实行batch layout11. sencha cmd. ext-all.js   1.5M排除Ext.chart 1.31M1. ext-all.js 压缩。 从 4M 到 1.5 M.(暂时没使用sencha cmd进行模组定制,缘由是ext-all.js 里面有作客制化)dashboard 看上去基本用到了全部的模组, 也不须要定制了。2. IE 浏览器自己设置调优http://bootstrike.com/Articles/SpeedUpIE/1. Disable Unneeded Add-ons2. Disable Automatic Configuration3. Increase the Max Connections Per Server4. Use a HOSTS file (Advanced)5. Increase the Half-Open Connection Limit (Advanced)6. Disable JavaScript and ActiveX (Advanced)7. Re-register actxprxy.dll (IE8 only) 8. Clear Temporary Files 8. Clean Up and Defrag Your Hard Drive 9. Remove list of Restricted Sites 10. Optimize Your Internet Connection Extjs 性能优化http://www.sencha.com/blog/ext-js-4-1-performance1.  build a single, concatenated JavaScript file containing all the required JavaScript used by the application.2. It’s much more efficient to use a single, identifying class name on elements to be styled.3. javascript 优化-Avoid older or badly written JavaScript engines.-Optimize code which is repeated frequently.-Optimize code which is executed at render or layout time.-Better still, try not to execute any extra code at initial render or layout time.-Move invariant expressions outside of loops-Use for (...) rather than Ext.Array.each-If a function performs its task conditionally and is frequently called, check the condition outside the call, and only call it if necessary. (See calls to fireEvent in Ext JS codebase)-Setup and teardown of a call frame (apparatus needed to make a function call) is slow on bad JavaScript engines////////////////////////////////////////////////////////////////////function badTotalFn(menuItem) {   var r = store.getRange(),       total = 0;    Ext.Array.each(r, function(rec) {       total += rec.get(menuItem.up('dataIndex').dataIndex);   });}function goodTotalFn(menuItem) {    var r = store.getRange(),        field = menuItem.up('dataIndex').dataIndex;        total = 0;     for (var j = 0, l = r.length; j < l; j++) {        total += r[j].get(field);    } }性能差的缘由:1. each 中的没有都要新建一个func 对象, 比较耗时间2. menuItem.up('dataIndex').dataIndex;  不该该在循环中执行。运行10000次, 性能差距:////////////////////////////////////////////////////////////////////Use Page Analyzer to measure performance1.If you’re using Chrome, start it from the command line using the --enable-benchmarking switch to enable microsecond timing accuracy.Coalesce multiple layouts1. batch Layout{    Ext.suspendLayouts();    // batch of updates    Ext.resumeLayouts(true);}Reduce DOM burdenIt’s important to reduce container/component nesting to as shallow a level as possible to avoid redundant layout runs and DOM reflows. These can be expensive.////////////////////////////////////////////////Bad:{    xtype: "tabpanel",    items: [{        title: "Results",        items: {            xtype: "grid"            ...        }    }]}Good{    xtype: "tabpanel",    items: [{        title: "Results",        xtype: "grid",        ...    }]}////////////////////////////////////////////////Avoid shrinkwrapping (auto sizing based on content) where possible.Avoid size constraints (minHeight, maxHeight, minWidth, maxWidth) where possible.Avoid postprocessing DOM of Component in afterRenderIE Sieve 主要用来检测 JavaScript 编程中,IE 运行时,内存的泄露状况。IE Sieve,检测 IE 内存泄露将地址输入软件地址栏中,单击“Go”,就会显示出页面,右下角是内存及节点状况。    usage 内存使用。    delta 内存增减。绿色是内存减小,红色是内存增长。    #inUse 在使用的 HTML 节点,好比 div。    #leaks 泄露的 HTML 节点,好比 div。IE 8 using 4.0.01. Using Chrome, EXTJS is lightning fast! (much faster than in EXTJS 3.3) 2. Using FF 3.6, performance is not far off Chrome but I’m seeing a little performance degradation when layouts get more complex.3. Using IE 8, large layouts/apps are basically unusable.1. 在应用程序中如何使用事件监听是一个提供性能的一个关键。例如,想在Store第一次加载数据时触发load事件,若是不注意,就会形成Store每次加载数据时都会触发load事件。这时候,在Store第一次加载数据触发load事件后关闭它,将会提高应用程序的总体性能。方法就是在监听中添加“single:true”:1.listeners: {2.load: onFirstLoadData,3.single: true4.}2. 另一个常常忽略的是afterrender事件,它会在全部DOM元素都渲染后触发。渲染后修改元素会引发回流(reflows),从而下降应用性能。相反,使用beforerender事件,在渲染前调整元素的样式,可以让元素在渲染时就是正确的样式。有时候,一些代码必须在渲染后,元素的大小被肯定后才能运行。这时候,在Ext JS 4.1,能够考虑使用其提供的一个新事件——boxready,它会在组件大小肯定后触发,3. 移除doLayout和doComponentLayout的调用 简而言之,就是尽可能移除这些昂贵的调用。在旧版本Ext JS(4.0以前),doLayout会让框架在组件或容器继续前进时,从新计算其布局。即便在Ext JS 4.0,有时候,也须要在直接更新DOM后或解决某些缺陷时调用它。4. 减小容器嵌套 咱们常常看到过多嵌套容器的应用,例如,一个容器内只有一个容器,而这个容器内有多个组件。这时候,能够取消外层容器,只使用一个容器完成一样的工做。很重要的一点,必须记住,每一个容器的初始化、渲染和布局都须要花费时间,于是,必须排除这些没必要要的嵌套容器,这样,应用将运行得更快。相似的代码以下(id属性在实际上不多见到,添加在这里是为了标记这里有两个容器):5.Ext JS面板比容器功能强大,但也是很昂贵的。于是,最好指定“xtype: 'container'”,以免应用使用默认的面板,以下所示:6.减小边框布局(borderLayout)嵌套 在Ext JS4.1,不少状况下,再也不须要使用边框布局嵌套。移除嵌套能够减小初始化、渲染和布局组件的时间。在ExtJS以前的版本不少状况下都须要嵌套,例如,在同一区域内有两个或两个以上相同的区域。在Center区域上有2个North区域的时候,你必须嵌套边框布局。如今,使用一个边框布局就能够实现两个North区域。在Ext JS4.1,区域能够根据须要动态添加,任何添加的区域可在前端显示并在不须要的时候隐藏它们。还能够经过weight属性定义区域的优先权,例如,能够定义West区域的优先权在North区域以前。这些变化意味着再也不须要嵌套边框buutons,从而提升使用该布局的组件的渲染速度。7.减小DOM的读取和写入 在Ext JS4.1,咱们已经尽量的减小了布局对DOM的读取和写入。一样,在你的代码也须要这样作。DOM在读取自身时会下降应用速度,尤为是在混合了DOM写入操做时的开销至关高,并且这样结合会引发回流。尝试使用beforerender来维护样式,这样能够在渲染时修改组件,而不是在渲染后。避免使用setStyle、addCls、removeCls以及其它直接修改DOM元素的语句,这些语句都会引发写入操做。做为通常规则,为了得到更好的性能,维护DOM时须要写入时,多尝试使用批量读取和写入。8. 使用Ext.suspendLayouts和Ext.resumeLayouts消除额外的布局操做 Ext JS 4.1提供了Ext.suspendLayouts和Ext.resumeLayouts两个新方法来协调多个组件和容器的更新。例如,要迅速增长两个组件到两个连续容器,会致使多个布局和渲染操做被执行。若是在添加这些组件以前调用Ext.suspendLayouts方法,将再也不单独执行个别组件的布局操做。添加完成后,调用Ext.resumeLayouts方法,框架将只执行一次渲染和布局操做。9. Ext.getCmp(),  up() Ext.getCmp() uses a hash map internally, so it is lighting fast, nearly as fast as retrieving the value in an array based on a key..up() and down() are implemented using a traversal of the component hierarchy, which is a slower process.But up() and down() use selectors, so they can also select classes, not just ids.10. x-hide-display  contentELAdd either the x-hidden or the x-hide-display CSS class to prevent a brief flicker of the content before it is rendered to the panel.