快速业务通道

Java ME应用设计指南之联网重定向 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15

Java ME应用设计指南之联网重定向

时间:2011-08-11

HTTP 1.1协议允许Web服务器临时改变资源的位置,也就是说你访问的资源在另外一个地址。这时候服务器返回的响应代码是302,而新的地址存放在Header中,Header的名称是Location。正常情况下,客户端浏览器应该指向临时的访问地址。但是,移动终端设备差距很大,在处理302返回码的时候,设备之间的行为差异很大。

下面的代码可以用来处理重定向问题,但是在部分设备中会导致应用程序出错。

Connection c = (HttpConnection) Connector.open(uri); int status = c.getResponseCode(); String new_uri = c.getHeaderField("Location"); // new_uri is null on some devices if (status == 302) { c.close(); c = (HttpConnection) Connector.open(new_uri); // Breaks here }

由于重定向是HTTP 1.1的特性,那么所有1.1兼容的设备都需要考虑这个问题。下面介绍如何解决这个问题。

事实证明在某些设备上,底层的网络协议栈处理重定向的问题,302响应码告诉应用程序内部的处理流程。应用程序应该等待直到响应码等于302。但是有些设备不能正确地从响应中解析出Location字段,这样Location字段的内容是null,响应码存储在了响应的内容之中。有经验的工程师会采用下面的解决办法。

1)解析响应,在Location或者响应的内容中查找新地址,如果找到的话关闭以前的连接,转向新的连接。

2)如果什么也没有找到的话,那么等待10-1000ms,直到状态码从302转变为200。马上处理响应,当作没有错误发生。

下面的代码能够很好的解决重定向的问题,供大家参考和完善。

Connection c = (HttpConnection) Connector.open(uri); int status = c.getResponseCode(); String redirection = httpConnection.getHeaderField("Location"); if (status == HttpConnection.HTTP_TEMP_REDIRECT) { if (redirection != null) { // This the standard HTTP 1.1 behaviour, move on to the redirection uri (basically restarting again). } else { // Parse the content of the HTTP response, if any. // Lookup for a "Location" header, if found, set value to the redirection variable if (redirection != null) { // Since location was found, fall back to the standard behaviour. } else { long begin_wait = System.currentTimeMillis(); while (System.currentTimeMillis() - begin_wait < 1000 || response != 200) { sleep(100); response = httpConnection.getResponseCode(); }; if (response == 200) { // Once again we''re back on tracks, continue processing as if no error has ever happen } else { // Here we''re really hopeless. Either the server did provided a valid redirection uri, // or the device did not preserved it. The best option is probably to fail by throwing an exception. }; }; }; } else // Handle other error codes here }; // Handle success here (status == 200)

您还可以了解一下Http协议的细节,http://www.ietf.org/rfc/rfc2616.txt。本文是笔者在阅读SUN的技术文章的时候编译的。您可以通过下面的地址阅读原文,也欢迎您编译其他的好文章,共同促进国内Java ME技术的发展。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号