Android WebView通过动态的修改js去拦截后请求参数实例

  

<强>需求背景:

  

需要在用户点击提交按钮的时候拦截用户提交的数据。

  

<强>遇到的问题:

  

1。页面不是自家前端做的,不能修改网页中的代码

  

2。要拦截的请求不是得到请求,而是一个帖子请求(难点在于:如果拦截的请求是得到请求的话,我只需要拿到url,将后面拼接的参数键值对取出来就好了,但是帖子请求的参数键值对我们是看不到的…)

  

<>强解决重点:

  

重写webViewClient的shouldInterceptRequest这个方法

  

1。这个方法是API21以后才出现的,还有一个过时的方法也要重写,不要忘了!

  

2。在加载网页时,所有的资源都会经过shouldInterceptRequest这个方法,我们可以通过shouldInterceptRequest和抓包工具(支撑材,查尔斯)去获取你想要获取信息的网址和资源文件

  

3。这个方法是执行在子线程的,如果你想要更新UI的话,记得切换线程

  

<>强解决方案:

  

我这里找到了两种解决方案(总有一款适合你)

  

  

<强> 1。拦截页面上按钮的点击事件,将点击事件的操作进行替换

        $ (' # J_submit ') .off(“点击”);//1 .将id为J_submit的按钮点击事件关闭   $ (' # J_submit ')。(“点击”,函数(){//2。将id为J_submit的按钮点击事件重新打开,并执行函数里的内容   如果($ ().hasClass (“btn-disabled”)){//- - - - - -此处为原页面代码,不做解释- - - - - -   返回;   }      尝试{   trackDealerEvent (dlr_order_page_form_submit_click, {   “esfrom”: _mediaId,   “业务”:“从”,   “系列”:_seriesId,   “城市”:_cityId   });   }捕捉(e) {   console.log (e);   }//- - - - - -此处为原页面代码,不做解释- - - - - -   var pageFormData=https://www.yisu.com/zixun/validateAllField (alertDiv);   如果(pageFormData){//3。获取到页面内的数据   美元。ajax ({//4. ajax方式上传到服务器中   url:“https://gouche.jxedt.com/gouche/clue/submit”,   数据:{   cityid: _cityId,   brandid: _brandId,   seriesid: _seriesId,   classesid: _specId,   名称:$ (“[name='用户名']”).val (),   电话:$ (' # phoneNumber) .val (),   类型:4   }   });   后根次序(pageFormData);   }   })      

<强> 2。动态的加载一段js代码

        mCommonWebView。setCommonWebViewClient(新CommonWebViewClient(){//添加自定义的WebViewClient   @Override   公共空间>//以下为具体操作,我把具体的方法贴了上去,如果不太懂的可以看看代码,我写了注释//初始化WebView   私人空间initWebView () {   mWebView.getSettings () .setDomStorageEnabled(真正的);   mWebView.getSettings () .setDefaultTextEncodingName (“utf - 8”);   如果(Build.VERSION。SDK_INT祝辞=21){//添加在API级别21   mWebView.getSettings () .setMixedContentMode (android.webkit.WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);   }   mWebView.getSettings () .setJavaScriptEnabled(真正的);   mWebView.getSettings () .setUseWideViewPort(真正的);//设置webview推荐使用的窗口,使html界面自适应屏幕   mWebView.getSettings () .setLoadWithOverviewMode(真正的);      mWebView.getSettings () .setGeolocationEnabled(真正的);      mWebView.getSettings () .setAllowFileAccess(真正的);      如果(Build.VERSION。SDK_INT祝辞=16){//屏蔽Webview的跨域漏洞   mWebView.getSettings () .setAllowFileAccessFromFileURLs(假);   mWebView.getSettings () .setAllowUniversalAccessFromFileURLs(假);   }      mWebView.getSettings () .setPluginState (WebSettings.PluginState.ON);   如果(Build.VERSION。SDK_INT祝辞=11){   mWebView.getSettings () .setAllowContentAccess(真正的);   }      mWebView.loadUrl (currUrl);   mWebView。setWebViewClient(新MyWebViewClient ());//与js通讯的桥梁   mWebView。addJavascriptInterface(新StubClass(),“存根”);      }      公开课MyWebViewClient延伸WebViewClient {/*两个shouldInterceptRequest方法体中的内容大致相同,因为是演示,我也没有抽取方法*/@Override   公共WebResourceResponse shouldInterceptRequest (WebView视图中,字符串url) {//获取的请求参数的映射集合   String> HashMap<字符串;参数;      Uri Uri=Uri.parse (url);//获取网址对应的Uri      如果(rightUrl (uri.toString ())) {/*得到请求获取参数*/params=paramForGET (uri);/*重头戏,后请求获取参数*//*   *获取后请求参数的思路就是:   *找到其网址中进行网络请求的js代码,对这段js代码进行替换   *我采取的是拦截第三方网址上请求数据的js资源,将本地的资源提交上去替换原资源   */如果(uri.toString () .contains (“index.js”)){//拦截该网页下对应的js资源并进行替换   尝试{//WebResourceResponse的构造器三个参数作用字符串mimeType:指定替换资源的类型字符串编码:字符集InputStream输入:输入流   返回新WebResourceResponse(“应用程序/x-javascript”、“utf - 8”, getAssets () .open (index.js "));   }捕捉(IOException e) {   e.printStackTrace ();   }   }   }   超级回报。shouldInterceptRequest(视图、url);   }//API21及21以后才支持此方法   @RequiresApi (api=Build.VERSION_CODES.LOLLIPOP)   @Override   公共WebResourceResponse shouldInterceptRequest (WebView看来,WebResourceRequest请求){//获取的请求参数的映射集合   String> HashMap

Android WebView通过动态的修改js去拦截后请求参数实例