这个问题是在我升级J2ME版XHTML浏览器的时候被引入的,我尝试了很多方法、发了很多帖子、问了很多人都没有找到可行的解决方案。最后我在PC上通用OTA连接方式使用WireShark拦截数据包才解决了问题,接下来我和大家分享一下解决问题的过程。
所涉及的知识点:
1、如何使用J2ME连接cmwap代理
2、基于安全套接字的HTTPS
尝试方法一:
新建一个Midlet应用程序,在StartApp方法中加入如下代码:
1 HttpConnection conn = null; 2 InputStream is = null; 3 try { 4 // url: https://ebs.95559.com.cn/corporbank/es_logon.jsp 5 conn = (HttpConnection) Connector.open(" http://10.0.0.172:80/corporbank/es_logon.jsp", Connector.READ, true); 6 String host = "ebs.95559.com.cn"; 7 conn.setRequestProperty("x-online-host", host); 8 conn.setRequestMethod(HttpConnection.GET); 9 10 int code = conn.getResponseCode(); 11 System.out.println("Response Code: " + code); 12 13 is = conn.openDataInputStream(); 14 15 System.out.println("Response Stream:"); 16 byte[] buf = new byte[128]; 17 while (true) { 18 int availSize = is.read(buf, 0, buf.length); 19 if (availSize == -1) { 20 break; 21 } 22 System.out.println(new String(buf, 0, availSize)); 23 } 24 } catch (Exception ex) { 25 ex.printStackTrace(); 26 } finally { 27 if (is != null) { 28 try { 29 is.close(); 30 } catch (IOException ex) { 31 ex.printStackTrace(); 32 } 33 } 34 35 if (conn != null) { 36 try { 37 conn.close(); 38 } catch (IOException ex) { 39 ex.printStackTrace(); 40 } 41 } 42 } |
此代码的作用是:使用cmwap代理,请求我们制定的页面,并在控制台中输出返回的状态码及内容。很显然,这是一种普通的cmwap连接方式,并没有考虑https因素的加入,输出的结果也在意料之内:
Response Code: 502 Response Stream: <?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" http://www.wapforum.org/DTD/wml_1.1.xml> <wml><card> <p><do type="prev" name="Back" label="Back"><prev/></do>Connection to host failed. Check your settings and try again. If the pro blem persists contact your operator.</p></card></wml> |
原因分析:我们要请求的是安全HTTP,端口443,而在我们的代码中并没有体现出我们要连接HTTPS的意图,我们只是告诉了cmwap代理我们要连接地址“ebs.95559.com.cn/corporbank/es_logon.jsp”,而并没有告诉cmwap代理我们所要访问的地址是基于HTTPS的,所以cmwap代理会按照地址“http://ebs.95559.com.cn/corporbank/es_logon.jsp”去连接,恰好这个地址是不支持HTTP:80的,cmwap代理返回了网关错误。