是 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属性放在下面
认证
一. 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);
}
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
以上需要加上工程名 类似样,才能找到js 文件
页面自动跳转:
ALPS Dashboard
Cancel
Cancel
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.
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扩展
#
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.“·”符号可以使用两种方式:
1、直接使用中文的标点符号“·”;
2、使用其实体字符“•”;
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("")
document.write("")
document.write("")
13. 判断浏览器的类型
14. isNaN 判断是否是数字
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 2008、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两种验证的情况说明
1、 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回应;如果相同,就表示客户端输入这个用户的密码正确,验证通过,返回客户端请求的资源。
2、 Kerberos验证过程
2.1. 客户端选择Kerberos验证
如果客户端选择了Kerberos验证,客户端直接在请求头中加入Authorization: Negotiate头,内容为:
Authorization: Negotiate XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
其中“XXXXXXXXXX”包含了客户端登录用户的身份验证票(登录时域中的票据服务器发放的标识此登录用户身份的票据,其中不包含用户的密码)。
2.2. 服务端验证身份验证票
服务器验证用户验证票,如果有效的票据,服务端能据此获得用户的用户名,并验证用户的有效性。验证通过后,服务端返回客户端请求的资源。
但是客户端IE何时选择NTLM 、合适选择Kerberos呢?下面通过一系列的测试来找出答案。
分服务器和客户端在域不在域两种情况测试。
3、 客户端和服务器都不在域中
测试环境为服务器和客户端机器在同一个局域网中,但是都不在域中。客户端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
.Untitled Page
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
.Untitled Page
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
.Untitled Page
4、 客户端和服务器都在同一域中
服务器和客户端机器在同一个局域网中,并同在一个域中。客户端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
This is a simple page!
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
This is a simple page!
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
This is a simple page!
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
This is a simple page!
5、 集成验证总结
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加密质询码,也是比较安全的。
四、 基本身份验证
客户端IE请求服务端IIS的一个页面iisstart.htm。
IIS服务端设置:
l 不启用匿名访问
l 只启用基本身份验证
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
2、 服务端返回无授权回应,并告知客户端要求基本身份验证
服务端设置的基本身份验证,所以这里返回的无授权回应的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
3、 客户端弹出对话框要求输入用户名和密码
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
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:e7d"
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Mon, 19 Nov 2007 06:16:34 GMT
This is a simple page!
站点
7个Loading图标在线生成工具
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
会影响浏览器默认的样式。 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标签中没有内容时,存
internet explorer cannot open the internet site operation aborted
Internet Explorer无法打开internet站点,已终止操作的解决方法合集
原因是html 的元素匹配不对称
或是 ext 组件提前 create
13.做邮件样式注意事项 email html css 要点
1、邮件不能采用div布局,只能使用table,如使用div布局,不能出现并排显示的内容,outlook下载后,div布局的内容会横排显示,不能竖排显示
2、涉及到需要用背景图片的,需要使用table的background属性,而不是style里面的background样式
3、邮件中不能定义font-family为汉字的字体,需要默认字体,或者不定义,gmail等邮箱会过滤掉字体样式属性
4、邮件里设置的高度,gmail会过滤掉,如果空内容,是无法把容器撑开的,一般采用img图片撑开,但需要注意,空白位置需要增加font-size:0px;line-height:0px;两个属性,保证样式在发到邮箱后,img下面不会多出空行
5、邮件宽度不超过650px
6、在所有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里面的内容有背景的时候会遇到如下问题:
1、设为display:block可以解决有背景,但换行,因block属性原因,必会换行
2、不用display:block背景便不会全部显示出来
3、float:left也不好用
4、有的只好用定位,较麻烦
解决办法:
把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
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代码里执行的,比如:
这里是正常的html代码
1、条件注释的基本结构和HTML的注释()是一样的。因此IE以外的浏览器将会把它们看作是普通的注释而完全忽略它们。
2、IE将会根据if条件来判断是否如解析普通的页面内容一样解析条件注释里的内容。
3、条件注释使用的是HTML的注释结构,因此他们只能使用在HTML文件里,而不能在CSS文件中使用。
那如果当前的浏览器是IE,但版本比IE5还低,该怎么办呢,可以使用,当然,根据条件注释只能在IE5+的环境之下,所以根本不会被执行。
lte:就是Less than or equal to的简写,也就是小于或等于的意思。
lt :就是Less than的简写,也就是小于的意思。
gte:就是Greater than or equal to的简写,也就是大于或等于的意思。
gt :就是Greater than的简写,也就是大于的意思。
! : 就是不等于的意思,跟javascript里的不等于判断符相同
2. meta的作用: http://www.51xuediannao.com/html+css/htmlcssjq/73.html
http-equiv 属性 -- HTTP协议的响应头报文
此属性出现在meta标签中
此属性用于代替name,HTTP服务器通过此属性收集HTTP协议的响应头报文
此属性的HTTP协议的响应头报文的值应使用content属性描述
http-equiv示例
告诉浏览器等设备,文件为html文件,且使用了utf8编码
告诉浏览器等设备,语言使用了中文
常用的http-equiv类型
charset -- charset 定义编码信息
refresh -- refresh 刷新与跳转网页
no-cache -- HTML meta no-cache 定义页面缓存
expires -- HTML meta expires 定义网页缓存过期时间
说明:设定页面使用的字符集,用以说明主页制作所使用的文字已经语言,浏览器会根据此来调用相应的字符集显示page内容。
用法:
Refresh (刷新)
说明:让网页多长时间(秒)刷新自己,或在多长时间后让网页自动链接到其它网页。
用法:
Expires (期限)
说明:指定网页在缓存中的过期时间,一旦网页过期,必须到服务器上重新调阅。
用法:
注意:必须使用GMT的时间格式,或直接设为0(数字表示多少时间后过期)。
Pragma (cach模式)
说明:禁止浏览器从本地机的缓存中调阅页面内容。
用法:
注意:网页不保存在缓存中,每次访问都刷新页面。这样设定,访问者将无法脱机浏览。
Set-Cookie (cookie设定)
说明:浏览器访问某个页面时会将它存在缓存中,下次再次访问时就可从缓存中读取,以提高速度。
当你希望访问者每次都刷新你广告的图标,或每次都刷新你的计数器,就要禁用缓存了。
通常HTML文件没有必要禁用缓存,对于ASP等页面,就可以使用禁用缓存,因为每次看到的页面都是在服务器动态生成的,缓存就失去意义。如果网页过期,那么存盘的cookie将被删除。
用法:
Window-target (显示窗口的设定)
说明:强制页面在当前窗口以独立页面显示。
用法:
注意:这个属性是用来防止别人在框架里调用你的页面。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.intro") 选取所有 class="intro" 的
元素。
$("p#demo") 选取 id="demo" 的第一个
元素。
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才可以,或者你需要在页面添加这个信息:
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版本工作流配置。用到了几个框架。
1、MVC框架 BACKBONE
2、jquery UI 1.9实现dragaable(也可以用jquery EASYUI)
3、jquery contextMenu.js 实现右键菜单
4、draw2D.js http://www.draw2d.org/draw2d/ 绘图库(收费。以前的版本不收费,也包含右键菜单功能),功能很强大。
5、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 最后产生的
FM_RADIO..
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.js
BIGCodeUnicode.js
GB2312TOBIG5.js
GBCodeUnicode.js
GB2312TOBIGGB.js
BIG5TOGBBIG.js
==》
ToGBUnicode.js
ToBigGB.js
9. 文件合并
object.js
array.js
map.js
==>
arraymap.js
10. index page 实行batch layout
11. sencha cmd.
ext-all.js 1.5M
排除Ext.chart 1.31M
1. ext-all.js 压缩。 从 4M 到 1.5 M.
(暂时没使用sencha cmd进行模组定制,原因是ext-all.js 里面有做客制化)
dashboard 看上去基本用到了所有的模组, 也不需要定制了。
2.
IE 浏览器本身设置调优
http://bootstrike.com/Articles/SpeedUpIE/
1. Disable Unneeded Add-ons
2. Disable Automatic Configuration
3. Increase the Max Connections Per Server
4. 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-performance
1. 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 performance
1.If you’re using Chrome, start it from the command line using the --enable-benchmarking switch to enable microsecond timing accuracy.
Coalesce multiple layouts
1. batch Layout
{
Ext.suspendLayouts();
// batch of updates
Ext.resumeLayouts(true);
}
Reduce DOM burden
It’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 afterRender
IE Sieve 主要用来检测 JavaScript 编程中,IE 运行时,内存的泄露情况。
IE Sieve,检测 IE 内存泄露
将地址输入软件地址栏中,单击“Go”,就会显示出页面,右下角是内存及节点情况。
usage 内存使用。
delta 内存增减。绿色是内存减少,红色是内存增加。
#inUse 在使用的 HTML 节点,比如 div。
#leaks 泄露的 HTML 节点,比如 div。
IE 8 using 4.0.0
1. 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: true
4.}
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 contentEL
Add 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.