日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Android WebView通過動態的修改js去攔截post請求參數實例

瀏覽:256日期:2022-09-25 13:40:43

需求背景:

需要在用戶點擊提交按鈕的時候攔截用戶提交的數據。

遇到的問題:

1.頁面不是自家前端做的,不能修改網頁中的代碼

2.要攔截的請求不是get請求,而是一個post請求 (難點在于:如果攔截的請求是get請求的話,我只需要拿到url,將后面拼接的參數鍵值對取出來就好了,但是post請求的參數鍵值對我們是看不到的。。。)

解決重點:

重寫webViewClient的shouldInterceptRequest這個方法

1.這個方法是API21以后才出現的,還有一個過時的方法也要重寫,不要忘了!

2.在加載網頁時,所有的資源都會經過shouldInterceptRequest這個方法,我們可以通過shouldInterceptRequest和抓包工具(Fidder,Charles)去獲取你想要獲取信息的網址和資源文件

3.這個方法是執行在子線程的,如果你想要更新UI的話,記得切換線程

解決方案:

我這里找到了兩種解決方案(總有一款適合你)

方案A : 適合 精通js 的大大們

1.攔截頁面上按鈕的點擊事件,將點擊事件的操作進行替換

$(’#J_submit’).off(’click’); //1.將id為J_submit的按鈕點擊事件關閉$(’#J_submit’).on(’click’,function(){ //2.將id為J_submit的按鈕點擊事件重新打開,并執行function里的內容 if ($(this).hasClass('btn-disabled')) { // ----- 此處為原頁面代碼,不做解釋 ----- return; } try { trackDealerEvent(’dlr_order_page_form_submit_click’, { ’esfrom’: _mediaId, ’business’: ’songshu’, ’series’: _seriesId, ’city’: _cityId }); } catch (e) { console.log(e); } // ----- 此處為原頁面代碼,不做解釋 ----- var pageFormData = validateAllField(alertDiv); if (pageFormData) { //3.獲取到頁面內的數據 $.ajax({ //4.ajax方式上傳到服務器中 url: ’https://gouche.jxedt.com/gouche/clue/submit’, data: { cityid: _cityId, brandid: _brandId, seriesid: _seriesId, classesid: _specId, name: $('[name=’userName’]').val(), phone: $(’#phoneNumber’).val(), type: 4 } }); postOrder(pageFormData); }})

2.動態的加載一段js代碼

mCommonWebView.setCommonWebViewClient(new CommonWebViewClient() { //添加自定義的 WebViewClient @Override public void onPageFinished(WebView view, String url) { //重寫onPageFinished方法 super.onPageFinished(view, url); //請求js的網址 runRemoteJs(Constant.QueryCarPrice.loadJsUrl_CarHome); } private void runJs(String remoteJs){ //把獲取到的js代碼添加到當前網頁 if(TextUtils.isEmpty(remoteJs)) { return; } String js = 'javascript:'; //作用:指明字符串后面的都是js代碼 js+= 'var script = document.createElement(’script’);'; // 作用:創建script節點 js+= 'script.type = ’text/javascript’;'; js+=remoteJs; mCommonWebView.callJsFunction(js); //加載js代碼 } private void runRemoteJs(String url) {//前端大大提供的一個網址,網址里面就是上面的js代碼,將網頁中的代碼獲取下來 RxRequest<String> request = new RxRequest<String>() .setUrl(url) .setMethod(Request.Method.GET); RxHttpEngineWrapper.commonExec(request) .subscribeOn(AndroidSchedulers.mainThread()) .subscribe(new UtilsRx.DefaultSubscriber<String>(){ @Override public void onNext(String s) { runJs(s); } }); }});

3.到時候只要前端的大大修改頁面中的js就可以了

此方案的坑:

1.要加載的js代碼中不能包含script節點

2.要加載的js代碼中不能有注釋

3.要加載的js代碼一定要加上分號

*如果不滿足上面的三點要求,要加載的js都不能正確的執行

方案B : 原生的Android方式,相對于上一種方案,這種方案比較麻煩

1.重寫shouldInterceptRequest去攔截資源

2.將第三方網頁上進行網絡請求的js頁面下載下來(就是把網頁的所有下載下來,找到進行網絡請求的js頁),對js頁進行修改

3.將處理好的js頁加載到本地,以后加載時就利用本地的js替換第三方的js(我會在本地的js頁面中添加與webview溝通的橋梁)

//以下為具體操作,我把具體的方法貼了上去,如果不太懂的可以看看代碼,我寫了注釋 //初始化WebViewprivate void initWebView() { mWebView.getSettings().setDomStorageEnabled(true); mWebView.getSettings().setDefaultTextEncodingName('utf-8'); if(Build.VERSION.SDK_INT >=21){//Added in API level 21 mWebView.getSettings().setMixedContentMode(android.webkit.WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); } mWebView.getSettings().setJavaScriptEnabled(true); mWebView.getSettings().setUseWideViewPort(true); //設置webview推薦使用的窗口,使html界面自適應屏幕 mWebView.getSettings().setLoadWithOverviewMode(true); mWebView.getSettings().setGeolocationEnabled(true); mWebView.getSettings().setAllowFileAccess(true); if (Build.VERSION.SDK_INT >= 16) { //屏蔽Webview的跨域漏洞 mWebView.getSettings().setAllowFileAccessFromFileURLs(false); mWebView.getSettings().setAllowUniversalAccessFromFileURLs(false); } mWebView.getSettings().setPluginState(WebSettings.PluginState.ON); if (Build.VERSION.SDK_INT >= 11) { mWebView.getSettings().setAllowContentAccess(true); } mWebView.loadUrl(currUrl); mWebView.setWebViewClient(new MyWebViewClient()); //與js通訊的橋梁 mWebView.addJavascriptInterface(new StubClass(),'stub'); } public class MyWebViewClient extends WebViewClient { /*兩個shouldInterceptRequest方法體中的內容大致相同,因為是demo,我也沒有抽取方法*/ @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { //獲取的請求參數的 Map 集合 HashMap<String,String> params; Uri uri=Uri.parse(url); //獲取網址對應的Uri if (rightUrl(uri.toString())) { /*get請求獲取參數*/ params=paramForGET(uri); /*重頭戲,post請求獲取參數*/ /* * 獲取post請求參數的思路就是: * 找到其網址中進行網絡請求的js代碼,對這段js代碼進行替換 * 我采取的是攔截第三方網址上請求數據的js資源,將本地的資源提交上去替換原資源 */ if (uri.toString().contains('index.js')) { //攔截該網頁下對應的js資源并進行替換 try { //WebResourceResponse的構造器三個參數作用 String mimeType:指定替換資源的類型 String encoding:字符集 InputStream input:輸入流 return new WebResourceResponse('application/x-javascript','UTF-8',getAssets().open('index.js')); } catch (IOException e) { e.printStackTrace(); } } } return super.shouldInterceptRequest(view, url); } //API21及21以后才支持此方法 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { //獲取的請求參數的 Map 集合 HashMap<String,String> params; String method=request.getMethod(); //當前網址的提交方式 Map<String, String> requestHeaders = request.getRequestHeaders(); //獲取請求頭 Uri uri=request.getUrl(); //獲取網址對應的Uri if (rightUrl(uri.toString())) { /*get請求獲取參數*/ params=paramForGET(uri); /*重頭戲,post請求獲取參數*/ /* * 獲取post請求參數的思路就是: * 找到其網址中進行網絡請求的js代碼,對這段js代碼進行替換 * 我采取的是攔截第三方網址上請求數據的js資源,將本地的資源提交上去替換原資源 */ if (uri.toString().contains('index.js')) { //攔截該網頁下對應的js資源并進行替換 try { //WebResourceResponse的構造器三個參數作用 String mimeType:指定替換資源的類型 String encoding:字符集 InputStream input:輸入流 return new WebResourceResponse('application/x-javascript','UTF-8',getAssets().open('index.js')); } catch (IOException e) { e.printStackTrace(); } } } return super.shouldInterceptRequest(view, request); } private boolean rightUrl(String url){ if (url.contains(COLLECT_URL)) //判斷資源網址是否是我需要的 return true; return false; } private HashMap<String,String> paramForGET(Uri uri){ HashMap<String,String> params=new HashMap<>(); Set<String> paramNames = uri.getQueryParameterNames(); //獲取此get請求中所有的參數名 /*我這里是將所有的參數都填了進去,大家在獲取的時候可以進行篩選和過濾*/ for (String param : paramNames) { params.put(param,uri.getQueryParameter(param)); //存儲鍵值對 } return params; }} public class StubClass{ @JavascriptInterface public void getData(String json){ Log.i('xxx','json -> '+json); }}

這是我本地的js,對原來的js進行了修改,添加了與Android通訊的橋梁,來截取數據。

補充知識:android WebView使用Post請求和設置瀏覽器彈框

這里要注意:post請求參數只能傳byte數組,而且必須是鍵值對字符串形式的byte數組,其中的key是后臺服務器接收key,后臺規定key是什么值就是什么值,不能隨意更改,沒有key=value格式或者key不正確,都會請求不到數據網頁打不開。

下面代碼直接看initWebView()方法就好

package com.xxxxx.xxx.activity.banksign; import org.json.JSONException;import org.json.JSONObject; import android.app.AlertDialog;import android.content.DialogInterface;import android.graphics.Bitmap;import android.os.Bundle;import android.util.Log;import android.view.KeyEvent;import android.view.View;import android.view.View.OnClickListener;import android.webkit.JsResult;import android.webkit.WebChromeClient;import android.webkit.WebSettings;import android.webkit.WebView;import android.webkit.WebViewClient; import com.xinzong.etc.R;import com.xinzong.xx.base.BaseGestureActivty;import com.xinzong.xxx.utils.ShowReloadUtil;/** * * @author * */public class WebViewActivity extends BaseGestureActivty implements OnClickListener{private ShowReloadUtil reloadUtil; private String url = 'http://120.1.1.1/xx/xxxx';private WebView webView;private String urlParameter = '';@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_sign_webview);findViewById(R.id.ibBack).setOnClickListener(this); //獲取傳過來的支付參數urlParameter = getIntent().getStringExtra('urlParameter');Log.i('TAG', urlParameter);//初始化重新加載框reloadUtil = new ShowReloadUtil(this);reloadUtil.setReloadView(this, R.id.ll_show_data_mc,R.id.rl_reload_parent_mc);//刷新界面,加載webviewrefresh();} private void refresh() { if(isNetworkConnected()){ findView(R.id.webview1).setVisibility(View.VISIBLE); reloadUtil.showDataView(); initWebView(); }else{ findView(R.id.webview1).setVisibility(View.GONE); reloadUtil.showReload(); } } private void initWebView() { webView = (WebView) findViewById(R.id.webview1); //初始化webview //啟用支持javascript WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true);//支持javaScript settings.setDefaultTextEncodingName('utf-8');//設置網頁默認編碼 settings.setJavaScriptCanOpenWindowsAutomatically(true); Log.d('TAG', 'url:'+url); //post請求(使用鍵值對形式,格式與get請求一樣,key=value,多個用&連接) urlParameter = 'JSONpriKey=' +urlParameter; webView.postUrl(url, urlParameter.getBytes());// webView.loadUrl(url);//get webView.setWebChromeClient(new MyWebChromeClient());// 設置瀏覽器可彈窗 //覆蓋WebView默認使用第三方或系統默認瀏覽器打開網頁的行為,使網頁用WebView打開 webView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { //返回值是true的時候控制去WebView打開,為false調用系統瀏覽器或第三方瀏覽器 Log.d('TAG', 'url:'+url); view.loadUrl(url); return true; } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { Log.d('TAG', 'onPageStarted--url:'+url); //支付完成后,點返回關閉界面 if(url.endsWith('http://120.1.1.1/xxx/xx/xxx')){ finish(); } super.onPageStarted(view, url, favicon); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); } }); } @Overridepublic void onClick(View v) {if (v.getId() == R.id.btnReload) {// 點擊 ‘重新加載’reloadUtil.showClickloadingView();Log.d('TAG', 'RELOAD');if (this.isNetworkConnected()) {webView.loadUrl(url);} else {reloadUtil.showReload();}}else if(v.getId() == R.id.ibBack){if(webView !=null && webView.canGoBack()){webView.goBack();}else{finish();}}}@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK && webView !=null && webView.canGoBack()){ webView.goBack(); return true; } return super.onKeyDown(keyCode, event); } /** * 瀏覽器可彈窗 * * @author Administrator * */ final class MyWebChromeClient extends WebChromeClient { @Override public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) { new AlertDialog.Builder(CTX) .setTitle('App Titler') .setMessage(message) .setPositiveButton(android.R.string.ok,new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { result.confirm(); }}) .setNegativeButton(android.R.string.cancel,new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { result.cancel(); }}).create().show(); return true; } } }

以上這篇Android WebView通過動態的修改js去攔截post請求參數實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产视频一区二区在线播放| 国产伦精品一区二区三区在线播放| 国产亚洲欧美日韩精品一区二区三区 | 波多野结衣久久精品| 国产伦精品一区二区三区在线播放| 亚洲专区视频| 亚洲欧美日韩一区在线观看| 高清久久一区| 福利欧美精品在线| 精品99在线| 日韩欧美一区二区三区在线观看| 日本不卡视频在线| 国产精品日韩精品中文字幕| 国产精品亚洲欧美日韩一区在线| 国产欧美成人| 韩日一区二区| 新版的欧美在线视频| 欧美日韩尤物久久| 激情婷婷欧美| 老鸭窝毛片一区二区三区| 六月天综合网| 日韩av一二三| 精品国产乱码久久久| 美女一区网站| 国产视频一区免费看| 亚洲精品裸体| 久久国产精品美女| 一区二区精品伦理...| 激情综合自拍| 日本在线一区二区三区| 欧美a一区二区| 久久九九电影| 亚洲一区二区日韩| 国产精品极品国产中出| 久久精品免费一区二区三区| 一区在线免费| 日韩欧美中文字幕一区二区三区| 嫩草伊人久久精品少妇av杨幂| 美女福利一区二区三区| 国产一区91| 国产精品白丝一区二区三区| 久久青草久久| 日本精品国产| 日韩在线二区| 视频一区日韩精品| 亚洲精品成人图区| 丝袜美腿亚洲一区二区图片| 国产精品1区| 欧美 日韩 国产精品免费观看| 亚洲免费毛片| 国产成人久久精品一区二区三区| 欧美日韩三区| 国产精品亚洲产品| 1024精品一区二区三区| 日韩一区二区三免费高清在线观看| 久久精品国产福利| 美女91精品| 欧美www视频在线观看| 玖玖玖国产精品| 日本激情一区| 日韩国产欧美视频| 欧美精选一区二区三区| 欧美精品91| 美日韩精品视频| 日韩av在线中文字幕| 一区二区三区网站| 国产美女高潮在线| 91成人在线网站| 亚洲伦乱视频| 久久精品72免费观看| 欧美精品自拍| 久久wwww| 亚洲免费毛片| 亲子伦视频一区二区三区| 日韩不卡一区二区| 欧美特黄一区| 久久亚洲人体| 亚洲精品大片| 好看不卡的中文字幕| 精品国产乱码久久久久久樱花 | 一区在线观看| 精品国产欧美日韩| 日韩精品亚洲专区| 久久99伊人| av亚洲免费| 日韩在线中文| 精品精品99| 国产精品高清一区二区| 亚洲精品伊人| 亚洲欧美日韩国产一区二区| 日韩av一级| 福利一区和二区| 国产精品v日韩精品v欧美精品网站| 亚洲人成网77777色在线播放| 国产超碰精品| 色乱码一区二区三区网站| 欧美交a欧美精品喷水| 欧美一级一区| 日韩av二区在线播放| 亚洲精品综合| 蜜臀a∨国产成人精品| 亚洲欧洲一区二区天堂久久| 久久精品电影| 日韩在线观看一区| 在线中文字幕播放| 国产网站在线| 日韩av自拍| 精品国产乱码| 精品在线网站观看| 久久gogo国模啪啪裸体| 国产精品115| 麻豆精品视频在线观看视频| 国产精品色在线网站| 国产精品亚洲欧美一级在线| 欧美一区91| 欧美日韩一区二区三区不卡视频| 日韩欧美中文字幕一区二区三区| 亚洲ab电影| 日韩动漫一区| 久久精品xxxxx| 国产精品亚洲综合久久| 久久不见久久见免费视频7 | 欧美午夜精彩| 999精品色在线播放| 91精品99| 免费视频最近日韩| 视频一区日韩精品| 日韩av在线播放中文字幕| 日韩福利视频一区| 国产精品一区二区美女视频免费看 | 蜜臀精品一区二区三区在线观看| 免费日韩视频| 亚洲精品字幕| 热久久久久久| 精品视频在线一区二区在线| 国产一区不卡| 久久视频国产| 久久国产精品亚洲77777| 亚洲欧美在线综合| 国产欧美高清| 91综合视频| 亚洲五月婷婷| 蜜臀久久久久久久| 91成人在线精品视频| 欧美国产极品| 精品捆绑调教一区二区三区| 精品一区欧美| 蜜臀va亚洲va欧美va天堂| 日韩中出av| 国产精品1区在线| 日本а中文在线天堂| 国产综合色产| 少妇精品久久久一区二区三区| 国产亚洲人成a在线v网站| 精品视频免费| 欧美69视频| 日韩精品a在线观看91| 久久女人天堂| 蜜臀91精品国产高清在线观看| 免费人成网站在线观看欧美高清| 久久国产婷婷国产香蕉| 麻豆视频在线观看免费网站黄| 国产一区日韩欧美| 亚洲ww精品| www.51av欧美视频| 视频一区中文字幕国产| 国产精品成人自拍| 99久久99视频只有精品| 亚洲精品麻豆| 国产成人精品一区二区三区视频| 精品一区在线| 国产精品一在线观看| 免费不卡中文字幕在线| 日本特黄久久久高潮| 日韩成人亚洲| 91九色综合| 国产综合激情| 欧美日韩 国产精品| 免费福利视频一区二区三区| 亚洲一区二区免费在线观看| 精品国产中文字幕第一页| 国产偷自视频区视频一区二区| 久久99精品久久久久久园产越南 | 乱人伦精品视频在线观看| 国产精品videosex极品| 国产字幕视频一区二区| 国产欧美日韩在线一区二区| 亚洲www啪成人一区二区| 日韩国产精品久久久久久亚洲| 亚洲不卡系列| 日韩精品亚洲aⅴ在线影院| 91精品韩国| 国产亚洲欧美日韩在线观看一区二区| 色爱av综合网| 国产精品嫩草影院在线看| 午夜久久一区| 高清久久一区| 日韩av字幕| 蘑菇福利视频一区播放| 吉吉日韩欧美|