| WAP(wml)开发问答 |
|
作者:佚名 文章来源:佚名 点击数: 更新时间:2005-9-5 19:35:51  |
|
26. 如何防止用户代理cache页面? 如果用户使用ASP,应该加入一行<%Response.expires=-1%> ,这个将阻止Cache。 27. 怎样防止从Cache中读取WML页面? 当WML页面下载到WAP设备后,它将保存在WAP设备内存中一段时间,直到这个时间过期。在这之后,页面将从服务器下载,而不是从WAP设备的缓存读取。这个过程被称做Cache。 但是有些时候不想让页面从缓存中读取,而是从服务器端读取。一个典型的例子就是当服务器的内容不断在更新的时候,通过在HTTP头中加入一定的cache信息,来告诉WAP设备该页面将不存储在缓存中。 可以在服务器端生成HTTP头,或者使用PHP、ASP、Perl或者其他服务端开发语言。这一行不能被包括在页面里,既然是HTTP的信息头,就不是WML元素。 对于静态页面,或许没有使用服务器端脚本语言,许多浏览器支持META标签来控制浏览器的Cache。看本部分的最后的例子。 将下面代码加入到HTTP头中,页面将马上过期: Expires: Mon, 26 Jul 1997 05:00:00 GMT Last-Modified: DD. month YYYY HH:MM:SS GMT Cache-Control: no-cache, must-revalidate Pragma: no-cache 第一行告诉微型浏览器,页面已经过期一段时间了。第二行告诉浏览器页面最后一次修改的时间。DD应该换成当天的日期,month YY HH MM SS等等类推。第三行和第四行有同样的效果。告诉浏览器页面不被Cache(第三行适用于 HTTP 1.1,第四行适用于HTTP 1.0)。 下面的是PHP的一个例子: <? // set the correct MIME type header("Content-type: text/vnd.wap.wml"); // expires in the past header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Last modified, right now header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // Prevent caching, HTTP/1.1 header("Cache-Control: no-cache, must-revalidate"); // Prevent caching, HTTP/1.0 header("Pragma: no-cache"); ?> 下面是使用WebClasses(VB)的例子。使用"Response.Expires=-1",防止Cache。 Private Sub WebClass_Start() 'Set correct MIME type Response.ContentType = "text/vnd.wap.wml" 'Make sure no caching Response.Expires = -1 Response.AddHeader "Pragma", "no-cache" Response.AddHeader "Cache-Control", "no-cache, must-revalidate" 'Use basicwml(my own) as template Set NextItem = basicwml End Sub 这里有一个ASP的例子,同样使用“Response.Expires=-1”防止Cache。 <% Response.ContentType = "text/vnd.wap.wml" Response.Expires = -1 Response.AddHeader "Pragma", "no-cache" Response.AddHeader "Cache-Control", "no-cache, must-revalidate" %> 最后是使用META的例子: <?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"> <wml> <head> <meta forua="true" http-equiv="Cache-Control" content="max-age=0"/> </head> <card id="alway***pire"> <p>This deck will never be stored in the cache</p> </card> </wml> 下面的页面是在经过86400秒(24 hours)后过期。 <?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"> <wml> <head> <meta forua="true" http-equiv="Cache-Control" content="max-age=86400"/> </head> <card id="expire1day"> <p>This card will live in the cache for a day</p> </card> </wml> 有些浏览器例如:UP.Simulator如果可以通过“返回”达到另外一个卡片,那么它将不会重新装载卡片。为了强制这个更新动作,用户必须在META标签中使用must-revalidate 参数。 <meta forua="true" http-equiv="Cache-Control" content="must-revalidate"/> 28. 如何防止变量被保存在Cache中? 变量保存在Cache中,这样变量还可以再利用。例如当用户返回到上一个输入卡片,他不需要重新输入,只需要改变需要改变的地方。但是在某些情况下这会造成一些问题。例如以WAP聊天系统,有些变量用了一遍又一遍,但是需要不同的内容。有些浏览器,例如:Nokia 7110,就会存在类似的在该清除的时候无法清除的问题。 在WML中,<card>标签有一个参数叫做newcontext。 当newcontext="true" 时清除所有的变量。但是这样也清除了所有导航的历史记录,这意味着back按钮不再工作。 为了清除变量,可以告诉浏览器将变量设为空: <setvar name="one_variable" value=""/> <setvar name="another_variable" value=""/> 但是,不是每个时候都有效果。在某些情况下必须使用一个难以想象的方法来清空变量。就是使用 onenterforward 事件。 <onevent type="onenterforward"> <refresh> <setvar name="one_variable" value=""/> <setvar name="another_variable" value=""/> </refresh> </onevent> 29. 怎么能够知道请求是从WML浏览器来的还是HTML浏览器来的? 既然要利用已经存在的为HTML浏览器编写的代码,就需要知道请求是从HTML浏览器还是从WML浏览器过来的。同样地,如果想重新引导的HTML浏览器直接到相应的HTML文档上,WML浏览器到WML页面上,以下的PHP代码就可以做到这些。 <? // Because this script sends out HTTP header information, // the first characters in the file must be the <? PHP tag. // relative URL to your HTML file $htmlredirect = "/html/my_htmlpage.html"; // ABSOLUTE URL to your WML file $wmlredirect = "http://wap.mysite.com/wml/my_wmldeck.wml"; if(strpos(strtoupper($HTTP_ACCEPT),"VND.WAP.WML") > 0) {// Check whether the browser/gateway says it accepts WML. $br = "WML"; } else { $browser=substr(trim($HTTP_USER_AGENT),0,4); if($browser=="Noki" || // Nokia phones and emulators $browser=="Eric" || // Ericsson WAP phones and emulators $browser=="WapI" || // Ericsson WapIDE 2.0 $browser=="MC21" || // Ericsson MC218 $browser=="AUR " || // Ericsson R320 $browser=="R380" || // Ericsson R380 $browser=="UP.B" || // UP.Browser $browser=="WinW" || // WinWAP browser $browser=="UPG1" || // UP.SDK 4.0 $browser=="upsi" || // another kind of UP.Browser ?? $browser=="QWAP" || // unknown QWAPPER browser $browser=="Jigs" || // unknown JigSaw browser $browser=="Java" || // unknown Java based browser $browser=="Alca" || // unknown Alcatel-BE3 browser (UP based?) $browser=="MITS" || // unknown Mitsubishi browser $browser=="MOT-" || // unknown browser (UP based?) $browser=="My S" || // unknown Ericsson devkit browser ? $browser=="WAPJ" || // Virtual WAPJAG www.wapjag.de $browser=="fetc" || // fetchpage.cgi Perl script from www.wapcab.de $browser=="ALAV" || // yet another unknown UP based browser ? $browser=="Wapa") // another unknown browser (Web based "Wapalyzer"?) { $br = "WML"; } else { $br = "HTML"; } } if($br == "WML") { // Force the browser to load the WML file instead header("302 Moved Temporarily"); header("Location: ".$wmlredirect); exit; } else { // Force the browser to load the HTML file instead header("302 Moved Temporarily"); header("Location: ".$htmlredirect); exit; } ?> 这个判断是在服务端完成的, PHP代码将首先查看网关是否接收text/vnd.wap.vml MIME类型。如果不是,将检测前面的字符,查看是否为WML浏览器。如果不符合,那么就假设为HTML浏览器。如果有新的WML浏览器,那么ID字符串也要增加。 这个代码基于Robert Whitinger(robert@wapsight.com)的代码,使用了Don Amaro(donamaro.concepcion@nl.unisys.com)提供的列表。 注意:由于只需要四个字符串就可以辨别,因此例如:"WapIDE-SDK/2.0;(R320s(Arial))" 可以使用“WapI”来代替是可行的做法,也是足够的。 同样的功能也可以通过ASP来解决。先判断请求的是“/index.wml” 或者 “/index.html” 和所需要的MIME类型。另外以下的脚本辨别的方式和上面不一样。另外还需要网关告诉服务器它能接收 的text/vnd.wap.wml MIME类型。该例子如下所示: <% Response.Buffer = TRUE Dim IsWap httpAccept = LCase(Request.ServerVariables("HTTP_ACCEPT")) if Instr(httpAccept,"wap") then IsWap=1 Else Response.Redirect "/index.html" : Response.Flush : Response.End End if %> <%Response.ContentType = "text/vnd.wap.wml"%><?xml version="1.0"?> <%Response.Flush%> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"> <wml> <card id="redirect"> <onevent type="onenterforward"> <go href="/index.wml"/> </onevent> <p> <a href="/index.wml">enter</a> </p> </card> </wml> <%Response.Flush:Response.End%> 30. 如何判断访问者是来自哪个浏览器或者移动电话? 可以通过检查HTTP_USER_AGENT标签来判断。例如试着使用Microsoft Internet Explorer访问一个站点的时候,HTTP_USER_AGENT将返回:Mozilla/4.0 (compatible;MSIE 5.0; Windows 98);在同样的情况下使用Nokia 7110访问这个站点,HTTP_USER_AGENT就会是:Nokia7110/1.0(04.73)。据此可以判断用户代理是什么类型的。 31. 可以得到用户代理的电话号码吗? 不可以,除非网关支持这个特点,WAP没有办法知道用户的电话号码。 32. 可以通过WML使得可以用WAP设备进行拨号吗? WAP的电话功能可以使用Wireless Telephony Application Interface(WTAI)。 例如: WMLScript: WTAPublic.MakeCall("9287787"); 但是第一代的WAP设备不支持这个功能。
上一页 [1] [2] [3] [4] [5] 下一页 |
| 文章录入:ihobo 责任编辑:ihobo |
|
上一篇文章: 怎样才能把个人网站做大
下一篇文章: 没有了 |
| 【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |