首页 > 代码库 > Android与webserver数据交互编程---3网络爬虫项目实现虚拟浏览器的jsp后台执行
Android与webserver数据交互编程---3网络爬虫项目实现虚拟浏览器的jsp后台执行
背景:原先的b/s设计中在一个jsp界面中实现多个复杂的工作流。。。
为实现移动接口的调用保证工作流的正常webproject特别给提供了该虚拟浏览器的方案
原理:通过该方案实现虚拟浏览器后台运行jsp脚本,以达到我们要求
要求:
1、session保持。不然总会跳转到login界面
2、jsp脚本必须被运行,不能仅仅是单纯的发起一个请求
先上
private String submitHandler(HttpServletRequest request,String msg,String sessionid,String pathjsp) throws IOException{ //虚拟浏览器 模拟提交jsp URL url = null; //添加浏览器版本号 去掉try catch WebClient client = new WebClient(BrowserVersion.INTERNET_EXPLORER_10); client.getOptions().setJavaScriptEnabled(true); client.getOptions().setCssEnabled(false); client.getOptions().setThrowExceptionOnFailingStatusCode(false); client.getOptions().setThrowExceptionOnScriptError(false); client.getOptions().setRedirectEnabled(true); url = new URL("http://localhost:"+ request.getServerPort()+pathjsp); System.out.println("sfq--url====" + url); //跳转登录查看cookie //HtmlPage page = client.getPage(url); WebRequest webRequest2 = new WebRequest(url, HttpMethod.POST); List<NameValuePair> reqParam2 = new ArrayList<NameValuePair>(); reqParam2.add(new NameValuePair("paramters", msg)); System.out.println("sfq--url====msg:" + msg); webRequest2.setAdditionalHeader("Cookie", "JSESSIONID="+sessionid); webRequest2.setRequestParameters(reqParam2); //client.getOptions().setThrowExceptionOnScriptError(true); HtmlPage page2 = (HtmlPage) client.getPage(webRequest2); System.out.println("sfq--pageasText====" + page2.asText()); WebResponse webResponse = page2.getWebResponse(); int status21 = webResponse.getStatusCode(); System.out.println("sfq--status21====" + status21); if(status21==200){ return "1"; }else{ return status21+""; } }几点说明:
1、由于项目中的jsp原来仅仅是为web服务的。改装成移动端交互使用难免各种报错,仅仅要不影响流程。我选择忽略他们。
所以去掉了当中的try catch异常捕获。(捕获真的非常碍事。
。)、
2、session保持问题纠结了非常久,尝试 网上的方法时大概人品出现了严重的问题,不好使(下面方法真的不好使。。。。
)
private void setCookies(WebClient webClient,String domain, Map<String, String> cookies) { if (cookies != null && cookies.size() > 0) { webClient.getCookieManager().setCookiesEnabled(true);// enable // cookies for (Entry<String, String> c : cookies.entrySet()) { Cookie cookie = new Cookie(domain, c.getKey(), c.getValue()); webClient.getCookieManager().addCookie(cookie); } } }
3、在我们领导的指点下使用requet的方法成功
webRequest2.setAdditionalHeader("Cookie", "JSESSIONID="+sessionid);当然,你也能够在请求你要的目的jsp之前先做一步模拟登录。从而获得了cookie......当然这就影响运行效率了
4、还不easy在本地測试通过了,搬移到外网server以后直接连接超时,终于通过更换url的ip地址为locslhost,问题解决
补充下:
localhoost 、 127.0.0.1 和本地ip的差别(网络基础太差了。。。
。。
。。)
no1:
localhost也叫local ,正确的解释是:本地server
127.0.0.1在windows等系统的正确解释是:本机地址(本机server)
他们的解析通过本机的host文件,windows自己主动将localhost解析为127.0.0.1
no2:
localhot(local)是不经网卡传输。这点非常重要,它不受网络防火墙和网卡相关的的限制。
127.0.0.1是通过网卡传输,依赖网卡。并受到网络防火墙和网卡相关的限制。
本机IP 也是通过网卡传输的。依赖网卡,并受到网络防火墙和网卡相关的限制。
可是本机IP与127.0.0.1的差别是:
127.0.0.1 仅仅能通过本机訪问
本机IP 通过本机訪问也能通过外部訪问
一般设置程序时本地服务用localhost是最好的,localhost不会解析成ip,也不会占用网卡、网络资源。
有时候用localhost能够,但用127.0.0.1就不能够的情况就是在于此。
猜想localhost訪问时,系统带的本机当前用户的权限去訪问,而用ip的时候。等于本机是通过网络再去訪问本机。用的到网络用户的权限。
总结下:
1、訪问本地server不管从效率还是有用上来讲直接使用localhost肯定是上上之选,不受其它问题的干扰
2、在公司法人项目中无知的选择了本机ip,效率最低的选择。訪问要经过外网、防火墙、不啦不啦在找到自己。。。
很多其它參考资料;
1、hmlunit http://shenbai.iteye.com/blog/1985844
2、http://blog.csdn.net/lu8000/article/details/10693091
3、http://shihlei.iteye.com/blog/2067707
4、 localho相关
Android与webserver数据交互编程---3网络爬虫项目实现虚拟浏览器的jsp后台执行