是 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.
你可能感兴趣的:(130-Web语言)
冒泡、选择、插入排序:三大基础排序算法深度解析(C语言实现)
xienda
算法 排序算法 数据结构
在算法学习道路上,排序算法是每位程序员必须掌握的基石。本文将深入解析冒泡排序、选择排序和插入排序这三种基础排序算法,通过C语言代码实现和对比分析,帮助读者彻底理解它们的差异与应用场景。算法原理与代码实现1.冒泡排序(BubbleSort)工作原理:通过重复比较相邻元素,将较大元素逐步"冒泡"到数组末尾。voidbubbleSort(intarr[],intn){ for(inti=0;iarr[
高效批量单词翻译工具的设计与应用
本文还有配套的精品资源,点击获取简介:在信息技术飞速发展的今天,批量单词翻译工具通过计算机的数据处理能力,大大提高了语言学习和文字处理的效率。用户通过简单输入单词列表到一个文本文件,并运行翻译程序,即可获得翻译结果并保存至指定文件。该工具集成了内置或外部翻译引擎,利用自然语言处理技术实现快速准确的翻译,并可能提供词性识别等附加功能。尽管机器翻译无法完全取代人工校对,但它为用户提供了一种高效的翻译解
嵌入式系统LCD显示模块编程实践
本文还有配套的精品资源,点击获取简介:本文档提供了一个具有800x480分辨率的3.5英寸液晶显示模块LW350AC9001的驱动程序代码,以及嵌入式系统中使用C/C++语言进行硬件编程的实践指南。该模块的2mm厚度使其适用于空间受限的便携式设备。内容包括驱动程序源代码、硬件控制接口使用方法,以及如何在嵌入式系统中进行图形处理、电源管理与性能优化。1.嵌入式系统原理1.1嵌入式系统概念嵌入式系统是
Python多版本管理与pip升级全攻略:解决冲突与高效实践
码界奇点
Python python pip 开发语言 python3.11 源代码管理 虚拟现实 依赖倒置原则
引言Python作为最流行的编程语言之一,其版本迭代速度与生态碎片化给开发者带来了巨大挑战。据统计,超过60%的Python开发者需要同时维护基于Python3.6+和Python2.7的项目。本文将系统解决以下核心痛点:如何安全地在同一台机器上管理多个Python版本pip依赖冲突的根治方案符合PEP标准的生产环境最佳实践第一部分:Python多版本管理核心方案1.1系统级多版本共存方案Wind
《Java前端开发全栈指南:从Servlet到现代框架实战》
前言在当今Web开发领域,Java依然是后端开发的主力语言,而随着前后端分离架构的普及,Java开发者也需要掌握前端技术栈。本文将全面介绍JavaWeb前端开发的核心技术,包括传统Servlet/JSP体系、现代前端框架集成方案,以及全栈开发的最佳实践。通过本文,您将了解如何构建现代化的JavaWeb应用前端界面。一、JavaWeb前端技术演进1.1传统技术栈Servlet:JavaWeb基础,处
LLM中 最后一个词语的表征(隐藏状态)通常会融合前面所有词语的信息吗?
ZhangJiQun&MXP
教学 2024大模型以及算力 2021 AI python 机器学习 算法 深度学习 人工智能
LLM中最后一个词语的表征(隐藏状态)通常会融合前面所有词语的信息吗?在大语言模型(LLM)中,最后一个词语的表征(隐藏状态)通常会融合前面所有词语的信息,这是由LLM的核心架构(以Transformer为基础)决定的,具体可以从以下角度理解:1.核心机制:自注意力(Self-Attention)的作用现代LLM(如GPT系列、Qwen等)均基于Transformer架构,其核心是自注意力机制。在
深度学习模型表征提取全解析
ZhangJiQun&MXP
教学 2024大模型以及算力 2021 AI python 深度学习 人工智能 python embedding 语言模型
模型内部进行表征提取的方法在自然语言处理(NLP)中,“表征(Representation)”指将文本(词、短语、句子、文档等)转化为计算机可理解的数值形式(如向量、矩阵),核心目标是捕捉语言的语义、语法、上下文依赖等信息。自然语言表征技术可按“静态/动态”“有无上下文”“是否融入知识”等维度划分一、传统静态表征(无上下文,词级为主)这类方法为每个词分配固定向量,不考虑其在具体语境中的含义(无法解
LLM的表征做减法的是什么,自然语言是一个矩阵,怎么进行减法的
ZhangJiQun&MXP
教学 2024大模型以及算力 2021 AI python 计算机视觉 人工智能 机器学习 算法 深度学习
LLM的表征做减法的是什么,自然语言是一个矩阵,怎么进行减法的有个假设:就是最后一个词语融合了前面词语的信息减法操作主要用于提取模型内部表征中的"诚实性"概念向量。具体来说,这是通过对比诚实和不诚实场景下的模型隐藏状态实现的。importtorchfromtransformersimportAutoModelForCausalLM,AutoTokenizer,AutoConfigimportnum
2025年渗透测试面试题总结-2025年HW(护网面试) 43(题目+回答)
独行soc
2025年护网 面试 职场和发展 linux 科技 渗透测试 安全 护网
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。目录2025年HW(护网面试)431.自我介绍与职业规划2.Webshell源码级检测方案3.2025年新型Web漏洞TOP54.渗透中的高价值攻击点5.智能Fuzz平台架构设计6.堆栈溢出攻防演进7.插桩技术实战应用8.二进制安全能力矩阵9.C语言内存管理精要10.Pyth
Tomcat:Java Web应用的幕后英雄
互联网动态分析
tomcat
在当今数字化浪潮中,Java作为一门成熟且广泛应用的编程语言,支撑着无数企业级应用和互联网服务的稳定运行。而在JavaWeb开发领域,Tomcat无疑是一个举足轻重的存在,它宛如一位默默耕耘的幕后英雄,为众多Web应用提供了可靠的运行环境。Tomcat的起源与发展Tomcat的故事始于1999年,当时SunMicrosystems(后被Oracle收购)与Apache软件基金会合作,旨在为Java
【亲测免费】 S7-1200PLC使用SCL语言编程实现数控G代码指令编程控制
苗璋希Eldwin
S7-1200PLC使用SCL语言编程实现数控G代码指令编程控制资源介绍本仓库提供了一个资源文件,标题为:S7-1200PLC使用SCL语言编程实现数控G代码指令编程控制(附上源程序).pdf。该资源文件详细介绍了如何使用S7-1200PLC的SCL(StructuredControlLanguage)语言进行编程,以实现数控G代码指令的编程控制。资源中不仅包含了详细的理论说明,还附带了完整的源程
AI MCP教程之 什么是 MCP?利用本地 LLM 、MCP、DeepSeek 集成构建您自己的 AI 驱动工具
知识大胖
NVIDIA GPU和大语言模型开发教程 人工智能 mcp deepseek
介绍利用模型上下文协议(MCP)的工具吸引了我们的注意力—将AI变成触手可及的生产力引擎。它们巧妙、高效,让人难以抗拒。但如果您可以将这样的功能添加到自己的工具中,会怎么样呢?在本指南中,我将引导您构建一个具有本地运行的大型语言模型(LLM)和MCP集成的AI工具-让您以类似的方式自动执行利用MCP的工具您喜欢的任务。推荐文章《AnythingLLM教程系列之12AnythingLLM上的Olla
24GB GPU 中的 DeepSeek R1:Unsloth AI 针对 671B 参数模型进行动态量化
知识大胖
NVIDIA GPU和大语言模型开发教程 人工智能 deepseek ollama
简介最初的DeepSeekR1是一个拥有6710亿个参数的语言模型,UnslothAI团队对其进行了动态量化,将模型大小减少了80%(从720GB减少到131GB),同时保持了强大的性能。当添加模型卸载功能时,该模型可以在24GBVRAM下以低令牌/秒的推理速度运行。推荐文章《本地构建AI智能分析助手之01快速安装,使用PandasAI和Ollama进行数据分析,用自然语言向你公司的数据提问为决策
Llama-Omni会说话的人工智能“语音到语音LLM” 利用低延迟、高质量语音转语音 AI 彻底改变对话方式(教程含源码)
知识大胖
NVIDIA GPU和大语言模型开发教程 llama 人工智能 nvidia llm
介绍“单靠技术是不够的——技术与文科、人文学科的结合,才能产生让我们心花怒放的成果。”——史蒂夫·乔布斯近年来,人机交互领域发生了重大变化,尤其是随着ChatGPT、GPT-4等大型语言模型(LLM)的出现。虽然这些模型主要基于文本,但人们对语音交互的兴趣日益浓厚,以使人机对话更加无缝和自然。然而,实现语音交互而不受语音转文本处理中常见的延迟和错误的影响仍然是一个挑战。关键字:Llama-Omni
NVIDIA 系列之 使用生成式 AI 增强 ROS2 机器人技术:使用 BLIP 和 Isaac Sim 进行实时图像字幕制作
知识大胖
NVIDIA GPU和大语言模型开发教程 人工智能 机器人
简介在快速发展的机器人领域,集成先进的AI模型可以显著增强机器人系统的功能。在本博客中,我们将探讨如何在ROS2(机器人操作系统2)环境中利用BLIP(引导语言图像预训练)模型进行实时图像字幕制作,并使用NVIDIAIsaacSim进行模拟。我们将介绍如何实现一个ROS2节点,该节点订阅摄像头源、应用BLIP模型进行图像字幕制作,并实时显示结果。这种集成展示了生成式AI在增强人机交互方面的强大功能
C++中NULL等于啥
奇妙之二进制
嵌入式/Linux # C++编程法则 c++ 开发语言
文章目录**一、`NULL`的标准定义****二、常见实现方式**1.**定义为整数`0`**2.**定义为`0L`或`(void*)0`**(较少见)**三、与C语言的关键区别****四、`NULL`在C++中的问题**1.**重载函数匹配歧义**2.**模板参数推导错误****五、C++11+的替代方案:`nullptr`****六、最佳实践****七、总结**在C++中,NULL的定义与行为
C语言手写一个简易 DNS 客户端
(Charon)
服务器 linux 网络
本文聚焦讲解如何通过C语言构造并发送一个最小化的DNS请求,特别以dns_client_commit()函数为主线,带你一步步理解DNS请求的构造过程。为什么要学习DNS报文构造?我们平时在浏览器里输入一个网址(比如www.baidu.com),浏览器其实背后会通过操作系统的DNS模块发送一个查询请求,将域名解析为IP地址。而如果我们手动用C语言自己构造DNS请求,我们可以更深刻地理解底层网络通信
C语言手写简易 DNS 客户端(接收部分)
(Charon)
c语言 开发语言
本文通过纯C语言手动构造DNS请求报文,使用UDP协议发送到公共DNS服务器,并接收响应,完整演示DNS请求流程。主流程:dns_client_commit()这是整个流程的核心函数,下面我们按顺序拆解每一步的逻辑,尤其突出发送sendto与接收recvfrom的设计思路和实现。第一步:创建UDP套接字intsockfd=socket(AF_INET,SOCK_DGRAM,0);if(sockfd
【C语言网络编程】HTTP 客户端请求(域名解析过程)
在做C语言网络编程或模拟HTTP客户端时,第一步就离不开“把域名解析为IP地址”这一步。很多人可能直接复制粘贴一段gethostbyname的代码,但未必真正理解它的原理。本篇博客将围绕一个经典函数:char*host_to_ip(constchar*hostname)深入剖析DNS解析过程、IP地址转换机制,并进一步带你了解HTTP请求是如何基于TCP通信进行的。一、核心函数:host_to_i
【AI大模型】LLM模型架构深度解析:BERT vs. GPT vs. T5
我爱一条柴ya
学习AI记录 ai 人工智能 AI编程 python
引言Transformer架构的诞生(Vaswanietal.,2017)彻底改变了自然语言处理(NLP)。在其基础上,BERT、GPT和T5分别代表了三种不同的模型范式,主导了预训练语言模型的演进。理解它们的差异是LLM开发和学习的基石。一、核心架构对比特性BERT(BidirectionalEncoder)GPT(GenerativePre-trainedTransformer)T5(Text
[论文阅读]Distilling Step-by-Step! Outperforming Larger Language Models with Less Training Data and Smal
0x211
论文阅读 语言模型 人工智能 自然语言处理
中文译名:逐步蒸馏!以较少的训练数据和较小的模型规模超越较大的语言模型发布链接:http://arxiv.org/abs/2305.02301AcceptedtoFindingsofACL2023阅读原因:近期任务需要用到蒸馏操作,了解相关知识核心思想:改变视角。原来的视角:把LLMs视为噪声标签的来源。现在的视角:把LLMs视为能够推理的代理。方法好在哪?需要的数据量少,得到的结果好。文章的方法
Likeshop单商户高级版对接拉卡拉支付收银台接入全流程详解
肥仔全栈开发
拉卡拉支付 拉卡拉支付 小程序
一、前期准备(1-3个工作日)商户认证在拉卡拉官网注册企业商户账号,提交营业执照、法人身份证等材料,完成实名认证并获取商户号(MCHID)和API密钥。在拉卡拉开发者后台下载API文档(含接口参数说明)和SDK工具包(支持Java/PHP等语言)。配置参数在Likeshop后台设置拉卡拉支付参数:商户号、API密钥、异步通知地址(如https://yourdomain.com/notify)。将拉
【亲测免费】 Mamba:快速跨平台的包管理器
林梦雅
Mamba:快速跨平台的包管理器项目基础介绍和主要编程语言Mamba是一个用C++重新实现的Conda包管理器。它旨在提供比传统Conda更快的包管理和依赖解析速度。Mamba的核心部分使用C++编写,以确保高效性和性能。同时,Mamba也使用了Python和其他一些辅助语言来实现其功能。项目核心功能Mamba的核心功能包括:快速依赖解析:利用libsolv库进行高效的依赖解析,这是RedHat、
GPT实操——利用GPT创建一个应用
狗木马
深度学习 gpt-3 gpt
功能描述信息查询:用户可以询问各种问题,如天气、新闻、股票等,机器人会返回相关信息。任务执行:用户可以要求机器人执行一些简单的任务,如设置提醒、发送邮件等。情感支持:机器人可以与用户进行情感交流,提供安慰和支持。个性化设置:用户可以自定义机器人的回复风格和偏好。技术栈前端:React.js后端:Node.js+Express数据库:MongoDB自然语言处理:OpenAIGPT-3API其他工具:
Linux信号处理完全指南:程序员必知的10个关键点
操作系统内核探秘
linux 信号处理 网络 ai
Linux信号处理完全指南:程序员必知的10个关键点关键词:Linux信号、信号处理、进程通信、sigaction、可重入函数、信号掩码、信号生命周期、优雅退出、竞态条件、coredump摘要:本文以“生活中的紧急通知”为类比,用通俗易懂的语言拆解Linux信号处理的核心机制。通过10个程序员必须掌握的关键点,结合代码示例和生活案例,帮你彻底理解信号的生成、传递、处理全流程,掌握编写健壮信号处理逻
Spring Framework 7.020.Spring 表达式语言(SpEL)Spring Expression Language
程序员勇哥
Java全套教程 Spring Framework 7 spring mysql 数据库 java springboot
SpringFramework7.020.Spring表达式语言(SpEL)SpringExpressionLanguageSpring表达式语言(SpEL)简介表达式求值核心特性类表达式集合数组映射函数操作符类型构造函数变量函数模板表达式bean定义中的表达式基于注解的配置中的表达式SpEL编译器解析器配置自定义评估上下文Spring表达式语言(简称SpEL)是一种强大的表达式语言,支持在运行时
什么是ORM?它如何简化后端开发?
破碎的天堂鸟
学习教程 数据库
什么是ORM?ORM(对象关系映射,Object-RelationalMapping)是一种编程技术,用于解决面向对象编程语言与关系型数据库之间的数据转换问题。其核心是将数据库中的表结构映射为程序中的类和对象,使开发者能够以操作对象的方式操作数据库,而非直接编写SQL语句。具体而言:映射机制:数据库表→编程语言中的类(如User类对应users表)表字段→类的属性(如username字段对应Use
2023高薪前端面试题(二、前端核心——Ajax)
原生AjaxAjax简介Ajax全程为AsynchronousJavaScript+XML,就是异步的JS和XML通过AJAX可以在浏览器中向服务器发送异步请求,最大的优势是:无刷新获取数据,实现局部刷新Ajax是一种用于创建快速动态网页的技术AJAX不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式Ajax的应用场景页面上拉加载更多数据列表数据无刷新分页表单项离开焦点数据验证搜索框提示
Go语言标识符命名规则详解:工程化实践
码农老gou
GO golang 开发语言 后端
引言Go语言的命名规则是其简洁哲学和工程实用性的集中体现。下面从语法规范、最佳实践到实际应用进行全面解析:一、基础命名规则1.变量命名//小驼峰式(lowerCamelCase)varuserNamestringvarmaxRetryCount=3varisConnectedbool特殊场景://短生命周期变量用缩写i:=0//索引n:=len(items)//数量ctx:=context.Bac
LeetCode第317题_离建筑物最近的距离
@蓝莓果粒茶
算法 leetcode linux 算法 c# 学习 python c++
LeetCode第317题:离建筑物最近的距离文章摘要本文详细解析LeetCode第317题"离建筑物最近的距离",这是一道图论和广度优先搜索的问题。文章提供了基于多源BFS的解法,包含C#、Python、C++三种语言实现,配有详细的算法分析和性能对比。适合想要提升图论算法能力的程序员。核心知识点:广度优先搜索、图论、矩阵遍历难度等级:困难推荐人群:具有图论基础,想要提升算法能力的程序员题目描述
数据采集高并发的架构应用
3golden
.net
问题的出发点:
最近公司为了发展需要,要扩大对用户的信息采集,每个用户的采集量估计约2W。如果用户量增加的话,将会大量照成采集量成3W倍的增长,但是又要满足日常业务需要,特别是指令要及时得到响应的频率次数远大于预期。
&n
不停止 MySQL 服务增加从库的两种方式
brotherlamp
linux linux视频 linux资料 linux教程 linux自学
现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库。前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作。
一般在线增加从库有两种方式,一种是通过mysqldump备份主库,恢复到从库,mysqldump是逻辑备份,数据量大时,备份速度会很慢,锁表的时间也会很长。另一种是通过xtrabacku
Quartz——SimpleTrigger触发器
eksliang
SimpleTrigger TriggerUtils quartz
转载请出自出处:http://eksliang.iteye.com/blog/2208166 一.概述
SimpleTrigger触发器,当且仅需触发一次或者以固定时间间隔周期触发执行;
二.SimpleTrigger的构造函数
SimpleTrigger(String name, String group):通过该构造函数指定Trigger所属组和名称;
Simpl
Informatica应用(1)
18289753290
sql workflow lookup 组件 Informatica
1.如果要在workflow中调用shell脚本有一个command组件,在里面设置shell的路径;调度wf可以右键出现schedule,现在用的是HP的tidal调度wf的执行。
2.designer里面的router类似于SSIS中的broadcast(多播组件);Reset_Workflow_Var:参数重置 (比如说我这个参数初始是1在workflow跑得过程中变成了3我要在结束时还要
python 获取图片验证码中文字
酷的飞上天空
python
根据现成的开源项目 http://code.google.com/p/pytesser/改写
在window上用easy_install安装不上 看了下源码发现代码很少 于是就想自己改写一下
添加支持网络图片的直接解析
#coding:utf-8
#import sys
#reload(sys)
#sys.s
AJAX
永夜-极光
Ajax
1.AJAX功能:动态更新页面,减少流量消耗,减轻服务器负担
2.代码结构:
<html>
<head>
<script type="text/javascript">
function loadXMLDoc()
{
.... AJAX script goes here ...
创业OR读研
随便小屋
创业
现在研一,有种想创业的想法,不知道该不该去实施。因为对于的我情况这两者是矛盾的,可能就是鱼与熊掌不能兼得。
研一的生活刚刚过去两个月,我们学校主要的是
需求做得好与坏直接关系着程序员生活质量
aijuans
IT 生活
这个故事还得从去年换工作的事情说起,由于自己不太喜欢第一家公司的环境我选择了换一份工作。去年九月份我入职现在的这家公司,专门从事金融业内软件的开发。十一月份我们整个项目组前往北京做现场开发,从此苦逼的日子开始了。
系统背景:五月份就有同事前往甲方了解需求一直到6月份,后续几个月也完
如何定义和区分高级软件开发工程师
aoyouzi
在软件开发领域,高级开发工程师通常是指那些编写代码超过 3 年的人。这些人可能会被放到领导的位置,但经常会产生非常糟糕的结果。Matt Briggs 是一名高级开发工程师兼 Scrum 管理员。他认为,单纯使用年限来划分开发人员存在问题,两个同样具有 10 年开发经验的开发人员可能大不相同。近日,他发表了一篇博文,根据开发者所能发挥的作用划分软件开发工程师的成长阶段。
初
Servlet的请求与响应
百合不是茶
servlet get提交 java处理post提交
Servlet是tomcat中的一个重要组成,也是负责客户端和服务端的中介
1,Http的请求方式(get ,post);
客户端的请求一般都会都是Servlet来接受的,在接收之前怎么来确定是那种方式提交的,以及如何反馈,Servlet中有相应的方法, http的get方式 servlet就是都doGet(
web.xml配置详解之listener
bijian1013
java web.xml listener
一.定义
<listener>
<listen-class>com.myapp.MyListener</listen-class>
</listener>
二.作用 该元素用来注册一个监听器类。可以收到事件什么时候发生以及用什么作为响
Web页面性能优化(yahoo技术)
Bill_chen
JavaScript Ajax Web css Yahoo
1.尽可能的减少HTTP请求数 content
2.使用CDN server
3.添加Expires头(或者 Cache-control) server
4.Gzip 组件 server
5.把CSS样式放在页面的上方。 css
6.将脚本放在底部(包括内联的) javascript
7.避免在CSS中使用Expressions css
8.将javascript和css独立成外部文
【MongoDB学习笔记八】MongoDB游标、分页查询、查询结果排序
bit1129
mongodb
游标
游标,简单的说就是一个查询结果的指针。游标作为数据库的一个对象,使用它是包括
声明
打开
循环抓去一定数目的文档直到结果集中的所有文档已经抓取完
关闭游标
游标的基本用法,类似于JDBC的ResultSet(hasNext判断是否抓去完,next移动游标到下一条文档),在获取一个文档集时,可以提供一个类似JDBC的FetchSize
ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法
白糖_
ORA-12514
今天通过Oracle SQL*Plus连接远端服务器的时候提示“监听程序当前无法识别连接描述符中请求服务”,遂在网上找到了解决方案:
①打开Oracle服务器安装目录\NETWORK\ADMIN\listener.ora文件,你会看到如下信息:
# listener.ora Network Configuration File: D:\database\Oracle\net
Eclipse 问题 A resource exists with a different case
bozch
eclipse
在使用Eclipse进行开发的时候,出现了如下的问题:
Description Resource Path Location TypeThe project was not built due to "A resource exists with a different case: '/SeenTaoImp_zhV2/bin/seentao'.&
编程之美-小飞的电梯调度算法
bylijinnan
编程之美
public class AptElevator {
/**
* 编程之美 小飞 电梯调度算法
* 在繁忙的时间,每次电梯从一层往上走时,我们只允许电梯停在其中的某一层。
* 所有乘客都从一楼上电梯,到达某层楼后,电梯听下来,所有乘客再从这里爬楼梯到自己的目的层。
* 在一楼时,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。
* 问:电梯停在哪
SQL注入相关概念
chenbowen00
sql Web 安全
SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
首先让我们了解什么时候可能发生SQ
[光与电]光子信号战防御原理
comsci
原理
无论是在战场上,还是在后方,敌人都有可能用光子信号对人体进行控制和攻击,那么采取什么样的防御方法,最简单,最有效呢?
我们这里有几个山寨的办法,可能有些作用,大家如果有兴趣可以去实验一下
根据光
oracle 11g新特性:Pending Statistics
daizj
oracle dbms_stats
oracle 11g新特性:Pending Statistics 转
从11g开始,表与索引的统计信息收集完毕后,可以选择收集的统信息立即发布,也可以选择使新收集的统计信息处于pending状态,待确定处于pending状态的统计信息是安全的,再使处于pending状态的统计信息发布,这样就会避免一些因为收集统计信息立即发布而导致SQL执行计划走错的灾难。
在 11g 之前的版本中,D
快速理解RequireJs
dengkane
jquery requirejs
RequireJs已经流行很久了,我们在项目中也打算使用它。它提供了以下功能:
声明不同js文件之间的依赖
可以按需、并行、延时载入js库
可以让我们的代码以模块化的方式组织
初看起来并不复杂。 在html中引入requirejs
在HTML中,添加这样的 <script> 标签:
<script src="/path/to
C语言学习四流程控制if条件选择、for循环和强制类型转换
dcj3sjt126com
c
# include <stdio.h>
int main(void)
{
int i, j;
scanf("%d %d", &i, &j);
if (i > j)
printf("i大于j\n");
else
printf("i小于j\n");
retu
dictionary的使用要注意
dcj3sjt126com
IO
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
user.user_id , @"id",
user.username , @"username",
Android 中的资源访问(Resource)
finally_m
xml android String drawable color
简单的说,Android中的资源是指非代码部分。例如,在我们的Android程序中要使用一些图片来设置界面,要使用一些音频文件来设置铃声,要使用一些动画来显示特效,要使用一些字符串来显示提示信息。那么,这些图片、音频、动画和字符串等叫做Android中的资源文件。
在Eclipse创建的工程中,我们可以看到res和assets两个文件夹,是用来保存资源文件的,在assets中保存的一般是原生
Spring使用Cache、整合Ehcache
234390216
spring cache ehcache @Cacheable
Spring使用Cache
从3.1开始,Spring引入了对Cache的支持。其使用方法和原理都类似于Spring对事务管理的支持。Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存放在缓存中,等到下次利用同样的
当druid遇上oracle blob(clob)
jackyrong
oracle
http://blog.csdn.net/renfufei/article/details/44887371
众所周知,Oracle有很多坑, 所以才有了去IOE。
在使用Druid做数据库连接池后,其实偶尔也会碰到小坑,这就是使用开源项目所必须去填平的。【如果使用不开源的产品,那就不是坑,而是陷阱了,你都不知道怎么去填坑】
用Druid连接池,通过JDBC往Oracle数据库的
easyui datagrid pagination获得分页页码、总页数等信息
ldzyz007
var grid = $('#datagrid');
var options = grid.datagrid('getPager').data("pagination").options;
var curr = options.pageNumber;
var total = options.total;
var max =
浅析awk里的数组
nigelzeng
二维数组 array 数组 awk
awk绝对是文本处理中的神器,它本身也是一门编程语言,还有许多功能本人没有使用到。这篇文章就单单针对awk里的数组来进行讨论,如何利用数组来帮助完成文本分析。
有这么一组数据:
abcd,91#31#2012-12-31 11:24:00
case_a,136#19#2012-12-31 11:24:00
case_a,136#23#2012-12-31 1
搭建 CentOS 6 服务器(6) - TigerVNC
rensanning
centos
安装GNOME桌面环境
# yum groupinstall "X Window System" "Desktop"
安装TigerVNC
# yum -y install tigervnc-server tigervnc
启动VNC服务
# /etc/init.d/vncserver restart
# vncser
Spring 数据库连接整理
tomcat_oracle
spring bean jdbc
1、数据库连接jdbc.properties配置详解 jdbc.url=jdbc:hsqldb:hsql://localhost/xdb jdbc.username=sa jdbc.password= jdbc.driver=不同的数据库厂商驱动,此处不一一列举 接下来,详细配置代码如下:
Spring连接池  
Dom4J解析使用xpath java.lang.NoClassDefFoundError: org/jaxen/JaxenException异常
xp9802
用Dom4J解析xml,以前没注意,今天使用dom4j包解析xml时在xpath使用处报错
异常栈:java.lang.NoClassDefFoundError: org/jaxen/JaxenException异常
导入包 jaxen-1.1-beta-6.jar 解决;
&nb