博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android拦截并获取WebView内部POST请求参数
阅读量:5037 次
发布时间:2019-06-12

本文共 2439 字,大约阅读时间需要 8 分钟。

起因:

有些时候自家APP中嵌入的H5页面并不是自家的。但是很多时候又想在H5不知情的情况下获取H5内部请求的参数,这应该怎么做到呢?

带着这个疑问,就有了这篇博客。

实现过程:

方案一:

最开始想到的方案是直接拦截H5中所有的请求:

1 webView.setWebViewClient(new WebViewClient() { 2     @Override 3     public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { 4         try { 5             URL url = new URL(request.getUrl()); 6         } catch (MalformedURLException e) { 7             e.printStackTrace(); 8         } 9         Log.e("InternetActivity", request + "");10         return super.shouldInterceptRequest(view, request);11     }12 13 });

但是通过此方法只能获取get请求的参数(因为参数直接拼在了url链接中),对于post请求的参数无可奈何。

方案二:

后来参考了,有了新的实现方式,具体原理为:给H5注入一段js代码,目的是在每次Ajax请求都会调用Android原生的方法,将请求参数传给客户端。

具体流程如下:

 

其中,

js注入代码:

1 

客户端拦截请求:

1 @Override 2 public final WebResourceResponse shouldInterceptRequest(final WebView view, WebResourceRequest request) { 3     String requestBody = null; 4     Uri uri = request.getUrl(); 5  6     // 判断是否为Ajax请求(只要链接中包含AJAXINTERCEPT即是) 7     if (isAjaxRequest(request)) { 8         // 获取post请求参数 9         requestBody = getRequestBody(request);10         // 获取原链接11         uri = getOriginalRequestUri(request, MARKER);12     }13 14     // 重新构造请求,并获取response15     WebResourceResponse webResourceResponse = shouldInterceptRequest(view, new WriteHandlingWebResourceRequest(request, requestBody, uri));16     if (webResourceResponse == null) {17         return webResourceResponse;18     } else {19         return injectIntercept(webResourceResponse, view.getContext());20     }21 }

客户端注入js代码:

1 private WebResourceResponse injectIntercept(WebResourceResponse response, Context context) { 2     String encoding = response.getEncoding(); 3     String mime = response.getMimeType(); 4  5     // WebResourceResponse的mime必须为"text/html",不能是"text/html; charset=utf-8" 6     if (mime.contains("text/html")) { 7         mime = "text/html"; 8     } 9 10     InputStream responseData = response.getData();11     InputStream injectedResponseData = injectInterceptToStream(12             context,13             responseData,14             mime,15             encoding16     );17     return new WebResourceResponse(mime, encoding, injectedResponseData);18 }

注:根据,mime必须为"text/html"。

反思:

  • 开发过程中遇到了页面一直显示不了的问题,实际上就是因为获取到的mime是"text/html; charset=utf-8",得改成"text/html";
  • 通过此方法也可篡改response与request,但不要滥用;
  • 所以说,Android确实不安全!

GitHub地址:

 

大家如果有什么疑问或者建议可以通过评论或者的方式联系我,欢迎大家的评论~

转载于:https://www.cnblogs.com/lanxingren/p/10697106.html

你可能感兴趣的文章
python小记(3)
查看>>
编译Linux驱动程序 遇到的问题
查看>>
大型分布式网站架构技术总结
查看>>
HDU 1017[A Mathematical Curiosity]暴力,格式
查看>>
[算法之美] KMP算法的直观理解
查看>>
EntityFramework 性能优化
查看>>
【ASP.NET开发】菜鸟时期的ADO.NET使用笔记
查看>>
静态代码块、构造代码块
查看>>
批量管理服务器,批量分发文件
查看>>
白盒测试概述
查看>>
求基于fca算法的网页分类技术
查看>>
leetcode:Longest Consecutive Sequence
查看>>
ExtJS4之Ext.MessageBox的各种用法
查看>>
Linux系统编程@进程管理(二)
查看>>
Jconsole连接Tomcat JVM
查看>>
[C# 开发技巧系列]C#如何实现图片查看器
查看>>
vs2015编译boost 64位
查看>>
TensorFlow加载图片的方法
查看>>
第6章 计算机视觉加强之机器学习 6-1 机器学习章节介绍
查看>>
第3章 机器学习的典型应用 3-1 典型应用-关联规则
查看>>