是 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语言)
自动化测试工程师面试,常问的问题有哪些?
自动化测试 老司机
软件测试 测试工程师 自动化测试 面试 职场和发展 软件测试 selenium 测试工具 android 测试工程师
自动化测试工程师面试是非常重要的环节,面试官会通过一系列的问题来评估候选人的技能和经验。下面是一些常见的问题,以及如何详细而规范地回答这些问题的建议。1.请介绍一下你的自动化测试经验。回答这个问题时,可以从项目经验、使用的自动化测试工具、编写的测试脚本等方面来介绍自己的经验。重点强调你在自动化测试领域的技能和擅长的领域。2.你在自动化测试中使用的编程语言是什么?为什么选择这种语言?回答这个问题时,
【无戒学堂】高效沟通是勇敢者的艺术
简沐文
沟通无处不在,生活中时时需要沟通,通过语言的、文字的、肢体语言的,各种沟通类型在生活的场景中交替出现。用什么样的沟通方式不是关键,关键是发挥沟通的力量,为生活提升品质。没有沟通,人与人就成为了一座座的孤岛,相互眺望,确毫不相干。像出行做车,我和相邻的人几乎不会沟通,因为本来就要各奔东西,就不想打破原本的静默。对于陌生人不沟通无关紧要,对于身边重要的关系,没有时常良好的交流,会慢慢变得生疏,渐行渐远
FlagEmbedding
吉小雨
python库 python
FlagEmbedding教程FlagEmbedding是一个用于生成文本嵌入(textembeddings)的库,适合处理自然语言处理(NLP)中的各种任务。嵌入(embeddings)是将文本表示为连续向量,能够捕捉语义上的相似性,常用于文本分类、聚类、信息检索等场景。官方文档链接:FlagEmbedding官方GitHub一、FlagEmbedding库概述1.1什么是FlagEmbeddi
ruby和python哪个好学
hakesashou
python基础知识 ruby python 开发语言
Ruby和python都挺好学的。建议学习Python,语法的话,Python相对更简洁。而且Python应用场合更广泛,运维、网站开发、数据处理、科学研究都可以。Ruby和Python十分相似,有很多共同点,但也有一些不同之外,以下是Python和Ruby的对比:1、Python和Ruby都是面向对象的语言,都是动态和灵活的。二者的主要区别在于他们解决问题的方式。Ruby提供了不同的方法,而Py
使用Python和Playwright破解滑动验证码
asfdsgdf
python 开发语言
滑动验证码是一种常见的验证码形式,通过拖动滑块将缺失的拼图块对准原图中的空缺位置来验证用户操作。本文将介绍如何使用Python中的OpenCV进行模板匹配,并结合Playwright实现自动化破解滑动验证码的过程。所需技术OpenCV模板匹配:用于识别滑块在背景图中的正确位置。Python:主要编程语言。Playwright:用于浏览器自动化,模拟用户操作。破解过程概述获取验证码图像:下载背景图和
爬虫技术抓取网站数据
Bearjumpingcandy
爬虫
爬虫技术是指通过程序自动访问网页并提取数据的技术。一般来说,爬虫技术包含以下几个步骤:确定目标网站:确定需要抓取的网站,并了解其页面结构和数据特点。分析页面结构:分析网页的结构和源代码,找到需要抓取的数据在页面中的位置和标识。编写爬虫程序:使用编程语言(如Python)编写爬虫程序,实现对目标网站的自动访问和数据提取。处理抓取数据:对抓取到的数据进行清洗、去重、整合等处理,以便后续的分析和利用。爬
【NumPy】深入解析numpy.zeros()函数
二七830
numpy
欢迎莅临我的个人主页这里是我深耕Python编程、机器学习和自然语言处理(NLP)领域,并乐于分享知识与经验的小天地!博主简介:我是二七830,一名对技术充满热情的探索者。多年的Python编程和机器学习实践,使我深入理解了这些技术的核心原理,并能够在实际项目中灵活应用。尤其是在NLP领域,我积累了丰富的经验,能够处理各种复杂的自然语言任务。技术专长:我熟练掌握Python编程语言,并深入研究了机
高效能写作必备书
青青的鱼
有人认为写作只是作家的事,和我们没什么关系,其实这是一种误解。写作对于处在快速发展社会中的我们是很重要的一件事,它是我们沟通和学习的重要途径。写作可以抒发情感和阐述思想,以达到与外界沟通的目的。不管你是写工作报告,还是发一个邮件,甚至小到发个短信,都需要组织语言清晰表达你的思想或目的。对于以学习为目的,写作就更重要了,写作是一个需要不断思考、搜集、整理、总结你大脑中过去所学的知识的过程,通过写作不
Go编程语言前景怎么样?参加培训好就业吗
QFdongdong
Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。不仅可以开发web,可以开发底层,目前知乎就是用golang开发。区块链首选语言就是go,以-太坊,超级账本都是基于go语言,还有go语言版本的btcd.Go的目标是希望提升现有编程语言对程序库等依赖性(dependency)的管理,这些软件元素会被应用程序反复调用。由
OpenCV图像处理技术(Python)——入门
森屿_
opencv
©FuXianjun.AllRightsReserved.OpenCV入门图像作为人类感知世界的视觉基础,是人类获取信息、表达信息的重要手段,OpenCV作为一个开源的计算机视觉库,它包括几百个易用的图像成像和视觉函数,既可以用于学术研究,也可用于工业邻域,它于1999年由因特尔的GaryBradski启动,OpenCV库主要由C和C++语言编写,它可以在多个操作系统上运行。1.1图像处理基本操作
华南农业大学C语言oj第八章
黑兔子撒
C语言 C语言 华南农业大学 编程 程序
18058一年的第几天时间限制:1000MS内存限制:65535K提交次数:0通过次数:0题型:填空题语言:G++;GCC;VCDescription定义一个结构体类型表示日期类型(包括年、月、日)。程序中定义一个日期类型的变量,输入该日期的年、月、日,计算并输出该日期是一年的第几天。#include struct DATE { _______________________ }; int da
linux gcc 格式,Linux下gcc与gdb简介
神奇的战士
linux gcc 格式
gcc编译器可以将C、C++等语言源程序、汇编程序编译、链接成可执行程序。gdb是GNU开发的一个Unix/Linux下强大的程序调试工具。linux下没有后缀名的概念。但gcc根据文件的后缀来区别输入文件的类别:.cC语言源代码文件.a由目标文件构成的库文件.C、.cc、.cppC++源码文件.h头文件.i经过预处理之后的C语言文件.ii经过预处理之后的C++文件.o编译后的目标文件.s汇编源码
MySQl篇(SQL - 基本介绍)(持续更新迭代)
wclass-zhengge
mysql sql 数据库
目录一、简介二、SQL方言(分页查询为例)1.简介2.SQL方言大比拼2.1.Oracle2.1.1.使用ROWNUM实现分页查询2.1.2.使用ROW_NUMBER()实现分页查询2.2.MySQL2.3.PostgreSQL三、语法规范四、注释五、MySQL脚本中的标点符号一、简介1、SQL是结构化查询语言(StructureQueryLanguage),专门用来操作/访问关系型数据库的通用语
腾讯发表多模态综述,一文详解多模态大模型
存内计算开发者社区
多模态大模型 人工智能 chatgpt AIGC 量子计算 AI-native gpt agi
多模态大语言模型(MLLM)是近年来兴起的一个新的研究热点,它利用强大的大语言模型作为大脑来执行多模态任务。MLLM令人惊讶的新兴能力,如基于图像写故事和无OCR的数学推理,在传统方法中是罕见的,这表明了一条通往人工通用智能的潜在道路。在本文中,追踪多模态大模型最新热点,讨论多模态关键技术以及现有在情绪识别上的应用。腾讯AILab发表了一篇关于多模态大模型的最新综述《MM-LLMs:RecentA
Go 语言基本架构
Fe_cow丿
Go
Go基本架构一、Go基本架构:packagemainimport"fmt"funcmain(){fmt.Println("hello,world")}go文件的后缀是.go;packagemain:表示文件所在的包是main;每个Go应用程序都包含一个为main的包;所有包名都应该使用小写字母;import“fmt”:表示引入一个包,包名为fmt,引入该包后,就可以使用fmt包的函数;比如:fmt
【C#生态园】深度剖析:C#嵌入式开发工具大揭秘
friklogff
C#生态园 c# 开发语言
C#嵌入式开发:全面了解六大框架与库前言随着物联网和嵌入式系统的快速发展,越来越多的开发者开始关注使用C#语言进行嵌入式开发。本文将介绍几种用于C#的嵌入式开发框架和相关库,以及它们的核心功能、安装配置方法和API概览,帮助读者了解并选择适合自己项目的工具和资源。欢迎订阅专栏:C#生态园文章目录C#嵌入式开发:全面了解六大框架与库前言1.nanoFramework:一个用于C#的嵌入式开发框架1.
Python怎么判断两个字符串是否相等?
老男孩IT教育
python 开发语言
在Python语言中,字符串是一种十分常见的数据类型,在很多业务场景下,我们需要判断两个字符串是否相等,这也是一个非常基础的操作,那么该如何实现呢?以下是详细的内容:Python中判断两个字符串是否相等有两种方法:直接比较和使用字符串方法。1、直接比较在Python中,我们可以使用==运算符来比较两个字符串是否相等。例如:str1='hello'str2='world'ifstr1==str2:p
Lua 与 C#交互
z2014z
lua c# 开发语言
Lua与C#交互前提Lua是一种嵌入式脚本语言,Lua的解释器是用C编写的,因此可以方便的与C/C++进行相互调用。轻量级Lua语言的官方版本只包括一个精简的核心和最基本的库,这使得Lua体积小、启动速度快,也适合嵌入在别的程序里。交互过程C#调用Lua:由C#文件调用Lua解析器底层dll库(由C语言编写),再由dll文件执行相应的Lua文件。Lua调用C#:1、Wrap方式:首先生成C#源文件
Github 2024-09-12 Go开源项目日报Top10
老孙正经胡说
github golang 开源 Github趋势分析 开源项目 Python Golang
根据GithubTrendings的统计,今日(2024-09-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下:开发语言项目数量Go项目10C项目1Terraform:基础设施即代码的开源工具创建周期:3626天开发语言:Go协议类型:OtherStar数量:40393个Fork数量:9397次关注人数:40393人贡献人数:358人OpenIssues数量:1943个Git
由于直接在一个回答中提供完整且多语言的游戏商城代码是不现实的(因为每种语言都有其独特的语法和库),我将为你概述一个游戏商城的核心概念,并提供几种不同编程语言的基本框架或示例代码段。
uthRaman
游戏 python 开发语言
商城系统概述hailiangwang.com游戏商城系统通常包含以下部分:用户系统(登录、注册、用户信息)商品列表(游戏、DLC、虚拟货币等)购物车系统支付系统订单系统2.示例框架(伪代码)首先,我们给出一个伪代码框架,描述商城的核心逻辑。plaintextclassUser:deflogin(username,password):#验证用户登录passdefregister(username,p
Kafka详细解析与应用分析
芊言芊语
kafka 分布式
Kafka是一个开源的分布式事件流平台(EventStreamingPlatform),由LinkedIn公司最初采用Scala语言开发,并基于ZooKeeper协调管理。如今,Kafka已经被Apache基金会纳入其项目体系,广泛应用于大数据实时处理领域。Kafka凭借其高吞吐量、持久化、分布式和可靠性的特点,成为构建实时流数据管道和流处理应用程序的重要工具。Kafka架构Kafka的架构主要由
MATLAB语言基础教程、 小项目1:简单的计算器、 小项目2:有页面的计算器、使用App Designer创建GUI计算器
azuredragonz
学习教程 matlab 开发语言
MATLABMATLAB语言基础教程1.MATLAB简介2.基本语法变量与赋值向量与矩阵矩阵运算数学函数控制流3.函数4.绘图案例:简单方程求解小项目1:简单的科学计算器功能代码项目说明小项目2:有页面的计算器使用AppDesigner创建GUI计算器主要步骤:完整代码(使用MATLAB编写)说明:如何运行:小项目总结MATLAB语言基础教程1.MATLAB简介MATLAB(矩阵实验室)是一种用于
⭐算法入门⭐《归并排序》简单01 —— LeetCode 21. 合并两个有序链表
英雄哪里出来
《LeetCode算法全集》 算法 数据结构 链表 c++ 归并排序
饭不食,水不饮,题必须刷C语言免费动漫教程,和我一起打卡!《光天化日学C语言》LeetCode太难?先看简单题!《C语言入门100例》数据结构难?不存在的!《数据结构入门》LeetCode太简单?算法学起来!《夜深人静写算法》文章目录一、题目1、题目描述2、基础框架3、原题链接二、解题报告1、思路分析2、时间复杂度3、代码详解三、本题小知识一、题目1、题目描述 将两个不降序链表合并为一个新的不降
PAT Advanced 1015. Reversible Primes (C语言实现)
OliverLew
我的PAT系列文章更新重心已移至Github,欢迎来看PAT题解的小伙伴请到GithubPages浏览最新内容。此处文章目前已更新至与GithubPages同步。欢迎star我的repo。题目Areversibleprimeinanynumbersystemisaprimewhose"reverse"inthatnumbersystemisalsoaprime.Forexampleinthedec
希希~嗯嗯~
猪猪女孩小哒哒
电话铺垫无聊天当天来上课的情况:外婆陪三岁的希希,妈妈陪小的大的上课规则感建立的还算不错,二的满场跑完全坐不住妈妈想找外教早教机构,因为大的在托班,里面会有数学、外教等分支教学课程。老二妈妈没怎么带教二宝。妈妈想给她找语言妈妈问有没有英文我的回答是英文课会有中教,应该回答中外教一起妈妈夸赞宝宝10个月会走了,今天见到的情形是宝宝走几步路就会跌倒,没有联系过爬,就开始走,长大以后模仿别人动作上面做的
语言精炼
一斗才华
今天在工作中。又受到了打击。原来自己以为自己写的挺好,洋洋洒洒两千字。可是重点没有抓住,优势没有突出。语言不够精炼。思想不够深邃。原来我的文学功底还有一段很长的路要走。这不光是在头条和微信上体现的。在工作中,生活中,演讲中,同样需要。
软件测试/测试开发/全日制 |利用Django REST framework构建微服务
霍格沃兹-慕漓
django 微服务 sqlite
霍格沃兹测试开发学社推出了《Python全栈开发与自动化测试班》。本课程面向开发人员、测试人员与运维人员,课程内容涵盖Python编程语言、人工智能应用、数据分析、自动化办公、平台开发、UI自动化测试、接口测试、性能测试等方向。为大家提供更全面、更深入、更系统化的学习体验,课程还增加了名企私教服务内容,不仅有名企经理为你1v1辅导,还有行业专家进行技术指导,针对性地解决学习、工作中遇到的难题。让找
go语言安装快速入门
吉祥鸟hu
[TOC]go语言是什么Go是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。Go是从2007年末由RobertGriesemer,RobPike,KenThompson主持开发,后来还加入了IanLanceTaylor,RussCox等人,并最终于2009年11月开源,在2012年早些时候发布了Go1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区如何安装环境笔者这
两种方法判断Python的位数是32位还是64位
sanqima
Python编程 电脑 python 开发语言
Python从1991年发布以来,凭借其简洁、清晰、易读的语法、丰富的标准库和第三方工具,在Web开发、自动化测试、人工智能、图形识别、机器学习等领域发展迅猛。 Python是一种胶水语言,通过Cython库与C/C++语言进行链接,通过Jython库与Java语言进行链接。 Python是跨平台的,可运行在多种操作系统上,包括但不限于Windows、Linux和macOS。这意味着用Py
Humanize 项目教程
尤嫒冰
Humanize项目教程humanizeAJSlibraryforaddinga“humantouch”todata.项目地址:https://gitcode.com/gh_mirrors/humani/humanize项目介绍Humanize是一个开源项目,旨在将机器生成的文本转换为更加自然、人性化的文本。该项目通过先进的算法和自然语言处理技术,使得AI生成的内容更加贴近人类的表达方式,从而提高
数据采集高并发的架构应用
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