Android攔截并獲取WebView內(nèi)部POST請求參數(shù)的實(shí)現(xiàn)方法
起因:
有些時候自家APP中嵌入的H5頁面并不是自家的。但是很多時候又想在H5不知情的情況下獲取H5內(nèi)部請求的參數(shù),這應(yīng)該怎么做到呢?
帶著這個疑問,就有了這篇博客。
實(shí)現(xiàn)過程:
方案一:
最開始想到的方案是直接攔截H5中所有的請求:
webView.setWebViewClient(new WebViewClient() {
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
try {
URL url = new URL(request.getUrl());
} catch (MalformedURLException e) {
e.printStackTrace();
}
Log.e("InternetActivity", request + "");
return super.shouldInterceptRequest(view, request);
}
});
但是通過此方法只能獲取get請求的參數(shù)(因?yàn)閰?shù)直接拼在了url鏈接中),對于post請求的參數(shù)無可奈何。
方案二:
后來參考了request_data_webviewclient,有了新的實(shí)現(xiàn)方式,具體原理為:給H5注入一段js代碼,目的是在每次Ajax請求都會調(diào)用Android原生的方法,將請求參數(shù)傳給客戶端。
具體流程如下:

其中,
js注入代碼:
<script language="JavaScript">
function generateRandom() {
return Math.floor((1 + Math.random()) * 0x10000)
.toString(16)
.substring(1);
}
// This only works if `open` and `send` are called in a synchronous way
// That is, after calling `open`, there must be no other call to `open` or
// `send` from another place of the code until the matching `send` is called.
requestID = null;
XMLHttpRequest.prototype.reallyOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function(method, url, async, user, password) {
requestID = generateRandom()
var signed_url = url + "AJAXINTERCEPT" + requestID;
this.reallyOpen(method, signed_url , async, user, password);
};
XMLHttpRequest.prototype.reallySend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function(body) {
interception.customAjax(requestID, body);
this.reallySend(body);
};
</script>
客戶端攔截請求:
@Override
public final WebResourceResponse shouldInterceptRequest(final WebView view, WebResourceRequest request) {
String requestBody = null;
Uri uri = request.getUrl();
// 判斷是否為Ajax請求(只要鏈接中包含AJAXINTERCEPT即是)
if (isAjaxRequest(request)) {
// 獲取post請求參數(shù)
requestBody = getRequestBody(request);
// 獲取原鏈接
uri = getOriginalRequestUri(request, MARKER);
}
// 重新構(gòu)造請求,并獲取response
WebResourceResponse webResourceResponse = shouldInterceptRequest(view, new WriteHandlingWebResourceRequest(request, requestBody, uri));
if (webResourceResponse == null) {
return webResourceResponse;
} else {
return injectIntercept(webResourceResponse, view.getContext());
}
}
客戶端注入js代碼:
private WebResourceResponse injectIntercept(WebResourceResponse response, Context context) {
String encoding = response.getEncoding();
String mime = response.getMimeType();
// WebResourceResponse的mime必須為"text/html",不能是"text/html; charset=utf-8"
if (mime.contains("text/html")) {
mime = "text/html";
}
InputStream responseData = response.getData();
InputStream injectedResponseData = injectInterceptToStream(
context,
responseData,
mime,
encoding
);
return new WebResourceResponse(mime, encoding, injectedResponseData);
}
注:根據(jù)
反思: •開發(fā)過程中遇到了頁面一直顯示不了的問題,實(shí)際上就是因?yàn)楂@取到的mime是"text/html; charset=utf-8",得改成"text/html"; •通過此方法也可篡改response與request,但不要濫用; •所以說,Android確實(shí)不安全! GitHub地址:webview_post_data 總結(jié) 以上所述是小編給大家介紹的Android攔截并獲取WebView內(nèi)部POST請求參數(shù)的實(shí)現(xiàn)方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
Android開發(fā)之瀏覽器用法實(shí)例詳解(調(diào)用uc,opera,qq瀏覽器訪問網(wǎng)頁)
這篇文章主要介紹了Android開發(fā)之瀏覽器用法,結(jié)合實(shí)例形式詳細(xì)分析了Android調(diào)用瀏覽器的具體步驟與相關(guān)使用技巧,需要的朋友可以參考下2016-01-01
Android入門之SubMenu的實(shí)現(xiàn)詳解
這篇文章主要為大家詳細(xì)介紹了Android如何實(shí)現(xiàn)SubMenu子菜單的效果,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Android有一定的幫助,感興趣的可以了解一下2022-11-11
Flutter開發(fā)setState能否在build中直接調(diào)用詳解
這篇文章主要為大家介紹了Flutter開發(fā)setState能否在build中直接調(diào)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
Android將Glide動態(tài)加載不同大小的圖片切圓角與圓形的方法
這篇文章主要給大家介紹了關(guān)于Android如何將Glide動態(tài)加載不同大小的圖片切圓角與圓形的方法,文中通過示例代碼介紹的非常吸納關(guān)系,對各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
TextView實(shí)現(xiàn)跑馬燈效果 就這么簡單!
TextView實(shí)現(xiàn)跑馬燈效果,就這么簡單輕松實(shí)現(xiàn),這篇文章介紹了TextView制作跑馬燈效果的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08
android imageview圖片居中技巧應(yīng)用
做UI布局,尤其是遇到比較復(fù)雜的多重LinearLayout嵌套,常常會被一些比較小的問題困擾上半天,可是無論怎樣設(shè)置layout_gravity屬性,都無法達(dá)到效果2012-11-11
Android仿360懸浮小球自定義view實(shí)現(xiàn)示例
本篇文章主要介紹了Android仿360懸浮小球自定義view實(shí)現(xiàn)示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-03-03
在AndroidManifest.xml中uses-sdk內(nèi)屬性意思
本文為大家講解下minSdkVersion、targetSdkVersion、maxSdkVersion、target API level四個數(shù)值的意思與區(qū)別,感興趣的朋友可以參考下哈2013-06-06
android獲取音樂文件的內(nèi)置專輯圖片實(shí)現(xiàn)思路及代碼
獲取音樂文件的內(nèi)置專輯圖片這是在播放音樂時的一個很不錯的功能,下面與大家分享下具體的實(shí)現(xiàn)思路,有類似需求的朋友可以參考下哈2013-06-06

