精华内容
下载资源
问答
  • Android Webview虽然提供了页面加载及资源请求的钩子,但是对于h5的ajax请求并没有提供干涉的接口,这意味着我们不能在webview中干涉javascript发起的http请求,而有时候我们确实需要能够截获ajax请求并实现一些功能...
  • 主要介绍了Android拦截并获取WebView内部POST请求参数 的实现方法,本文通过两种方案给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
  • Android Webview虽然提供了页面加载及资源请求的钩子,但是对于h5的ajax请求并没有提供干涉的接口,这意味着我们不能在webview中干涉javascript发起的http请求,而有时候我们确实需要能够截获ajax请求并实现一些功能...

    Android Webview虽然提供了页面加载及资源请求的钩子,但是对于h5的ajax请求并没有提供干涉的接口,这意味着我们不能在webview中干涉javascript发起的http请求,而有时候我们确实需要能够截获ajax请求并实现一些功能如:统一的网络请求管理、cookie同步、证书校验、访问控制等。

    那么究竟有没有办法能在Webview中拦截ajax请求呢?

    我百度谷歌一圈后,找到了这篇文章,你可以参考一下:http://blog.csdn.net/kpioneer123/article/details/51438204 。如果没有看懂,那就不用理会了,毕竟本文绝不会撩起你的兴趣,然后却戛然而至的。我们还是直奔主题吧。

    思路

    虽然在 Webview中无法直接拦截 ajax请求(其实在shouldInterceptRequest 中是可以收到ajax请求的,但是遗憾的是取不到请求参数,这样也是没有意义的), 我们可以转换思路,能不能在js中将所有的请求转发到native中,这样也就达到了相同的目的。如果可以,那就需要一种在javascript和native之间通信的桥梁(javascript bridge),通过它,javascript将请求信息传递给native, native完成真正的请求后再将结果数据传递给javascript。那么我们的思路就是:

    在javascript中拦截所有ajax请求,然后通过javascript bridge将请求信息传递给native

    native收到请求信息后,进行一些与处理逻辑,然后完成本次请求,将请求结果通过javascript bridge再回传给javascript.

    这样,在第二步native上收到请求信息后,我们就可以进行统一的网络请求管理、cookie同步、证书校验、访问控制。思路虽然简单,但实现起来却是比较麻烦,因为需要前端和native都需要做不少的工作。那么有什么简单的方法吗?当然有!

    轮子

    fly.js 是一个支持请求重定向的轻量级、跨平台的Javascript http请求库 ,前端可以使用它轻松发起网络请求,它会自动将请求转发至native. 现在解决了第一个问题,接下来我们需要选一个javascript bridge, 而现在开源的javascript bridge挺多,你可以选择任意一个你喜欢的。但是,在此强烈推荐一下 DSBridge 它是一个使用非常简单并支持同步的跨平台javascript birdge, 最关键的是, DSBridge 的demo中就有接收处理fly.js转发的http请求的示例,并且给出了okhttp的实现,并且,fly.js](https://github.com/wendux/fly) 官方也提供了DSBridge 的adapter. 下面我们以DSBridge为例,演示一下整个过程:

    实例

    前端

    //引入dsbridge adapter

    var adapter = require("flyio/dist/npm/adapter/dsbridge")

    var EngineWrapper = require("flyio/dist/npm/engine-wrapper")

    var dsEngine = EngineWrapper(adapter)

    var fly = new Fly(dsEngine);

    //接下来,通过fly发起的ajax请求都会转发到native上

    fly.post('/user', {

    name: 'Doris',

    age: 24

    phone:"18513222525"

    })

    .then(function (response) {

    console.log(response);

    })

    .catch(function (error) {

    console.log(error);

    });

    Native端

    @JavascriptInterface

    public void onAjaxRequest(JSONObject jsonObject, final CompletionHandler handler){

    //jsonObject 为fly adapter 传给端的requerst对象

    //端上完成请求后,将响应对象通过hander返回给fly adapter

    //hanlder(response)

    }

    fly.js中dsbridge的adapter会调用Native的 onAjaxRequest方法,native只需实现这个方法即可,完整的请求实现可以参照 DSbridge demo中 AjaxHandler 的实现.

    值得注意的是, fly.js并不是只支持DSBridge ,它可以支持任何javascript bridge,只是不同的javascript bridge的数据传输协议不同,需要分别提供一个adapter, 详情请参考:fly.js之http engine及adapter .

    最后

    贴出fly.js和DSBridge的github地址,欢迎star ! 有什么问题也可以关注我或留言。

    展开全文
  • Android webview拦截请求

    2021-09-09 10:52:18
    如果想做webview的本地缓存或者拦截请求做其他的事情就设计到了拦截webview请求。 二、解决方案 在Android自带的WebView中,如果需要对访问的URL或者资源进行拦截,主要涉及到WebViewClient中的三个方法:...

    一、需求背景

    如果想做webview的本地缓存或者拦截请求做其他的事情就设计到了拦截webview的请求。

    二、解决方案

    在Android自带的WebView中,如果需要对访问的URL或者资源进行拦截,主要涉及到WebViewClient中的三个方法:onPageStarted、shouldOverrideUrlLoading、shouldInterceptRequest。首先来分析onPageStarted方法和shouldOverrideUrlLoading方法,分别在两个方法以及onPageFinished方法中打印log

    • 当用户使用WebView的loadUrl方法开启一个网页时,其中onPageStarted方法会执行,而shouldOverrideUrlLoading则不会执行
    • 当用户继续点击网页内的链接时,onPageStarted和shouldOverrideUrlLoading均会执行,并且shouldOverrideUrlLoading要先于onPageStarted方法执行
    • 当用户点击网页中的链接后,点击back,返回历史网页时,onPageStarted会执行,而shouldOverrideUrlLoading不会执行

    综上所述,当需要对访问的网页进行策略控制时,需要在onPageStarted方法中进行拦截,如下示例代码:

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {  
        Log.d(TAG, "onPageStarted url is " + url);
        boolean res = checkUrl(url);
        //根据对URL的检查结果,进行不同的处理,
        //例如,当检查的URL不符合要求时,
        //可以加载本地安全页面,提示用户退出
        if (!res) {
            //停止加载原页面
            view.stopLoading();
            //加载安全页面
            view.loadUrl(LOCAL_SAFE_URL);
        }
    }
    

    然后,来分析一下shouldInterceptRequest(WebView view, String url),此方法从Android API 11(3.0)开始提供,位于WebViewClient 内,当用户使用WebView的loadUrl方法打开网页、点击网页中的链接、返回历史网页时,所有资源的加载均会调用shouldInterceptRequest方法

    进行资源替换时,可以将网页资源,例如html、css、js、图片等存放在本地,在shouldInterceptRequest对WebView加载的资源进行拦截,当符合某种策略时,替换为本地的资源,资源的MIME类型可以采用以下方法获取: MimeTypeMap.getSingleton().getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(url))
    示例:

    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
        Log.d(TAG, "shouldInterceptRequest : " + url);
        Uri uri = Uri.parse(url);
        String localPath = "file://" + Environment.getExternalStorageDirectory().getAbsoluteFile() + "/www" + uri.getPath();
        File file = new File(localPath);
        try {
            URL localUri = new URL(localPath);
            if (localUri != null) {
                InputStream is = localUri.openConnection().getInputStream();
                WebResourceResponse resourceResponse = new WebResourceResponse(
                            MimeTypeMap.getSingleton().getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(url))
                            , "UTF-8", is);
                Log.d(TAG, "replace " + MimeTypeMap.getFileExtensionFromUrl(url));
                return resourceResponse;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return super.shouldInterceptRequest(view, url);
    }
    
    展开全文
  • 我想截取对这些图像的请求(通过URL模式)并返回我自己的内容(即另一个图像),或者根据内部应用程序逻辑保持请求不变.有可能吗?编辑:目前的问题状态……WebView具有设置WebViewClient的能力(如Axarydax所述). ...

    我的应用程序中有一个WebView,其中一些站点被打开(总是相同的,它是我自己的页面).该站点有一些JS代码,可以从远程主机加载一些图像.

    我想截取对这些图像的请求(通过URL模式)并返回我自己的内容(即另一个图像),或者根据内部应用程序逻辑保持请求不变.

    有可能吗?

    编辑:目前的问题状态……

    WebView具有设置WebViewClient的能力(如Axarydax所述). WebViewClient有两个有用的方法

    > shouldOverrideUrlLoading

    > onl oadResource

    shouldOverrideUrlLoading能够拦截任何URL加载,如果加载是由页面交互触发的(即单击页面上的链接,则WebView.loadURL(“”)不会触发此方法).它还可以通过返回false来取消URL加载.这种方法不可用,导致’它无法拦截页面资源的加载(和图像,我需要拦截的是这样的页面资源).

    onLoadResource每次加载页面资源(和图像!thx到jessyjones)时都会触发,但是没有办法取消它.这使得这种方法也不适合我的任务.

    解决方法:

    标签:android,android-webview,webviewclient

    来源: https://codeday.me/bug/20190925/1817091.html

    展开全文
  • 接到这样一个需求,需要在 WebView 的所有网络请求中,在请求的url中,加上一个xxx=1的标志位。 例如 http://www.baidu.com 加上标志位就变成了 http://www.baidu.com?xxx=1 寻找解决方案 从 Android API 11 ...
  • webview拦截请求

    2020-05-21 18:49:36
    需求背景是有些H5上的请求需要拦截掉,直接返回失败/空。留给笔记… // mWebview.setWebChromeClient(new NChromeClient()); private final class NWebViewClient extends WebViewClient { ... @Override ...

    需求背景是有些H5上的请求需要拦截掉,直接返回失败/空。

    这里留个笔记。

    // mWebview.setWebChromeClient(new NChromeClient());
    
    private final class NWebViewClient extends WebViewClient {
    	
    	...
    
    	@Override
        public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
            if (VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && request != null && request.getUrl() != null) {
                WebResourceResponse response = check(request.getUrl().toString());
                if (response != null) return response;
            }
            return super.shouldInterceptRequest(view, request);
        }
    
        @Override
        public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
            WebResourceResponse response = check(url);
            return response != null ? response : super.shouldInterceptRequest(view, url);
        }
    
        private WebResourceResponse check(String url) {
            if (url.length() <= 8) return null;
            int indexHost = url.indexOf("/", 8);
            int indexPort = url.indexOf(":", 8);
            int indexUrl = url.indexOf("?", 8);
            if (indexHost < 0) return null;
            if (indexPort > 0) indexHost = Math.min(indexHost, indexPort);
            if (indexUrl > 0) indexHost = Math.min(indexHost, indexUrl);
            String host = url.substring(0, indexHost);
            if (!host.endsWith("yeshen.org")) {
                return new WebResourceResponse("text/html", "utf-8",
                        new ByteArrayInputStream("".getBytes()));
            }
            return null;
        }
    }        
    

    拦截替换URL地址,比如将 test.yeshen.org 替换成 yeshen.org

    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
        if (VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && request != null
                && request.getUrl() != null && request.getUrl().getHost() != null) {
    
            String host = request.getUrl().getHost();
            String url = request.getUrl().toString();
            if (host.equals("yeshen.org")) {
                return super.shouldInterceptRequest(view, request);
            } else if (host.equals("test.yeshen.org")) {
                Uri uri = Uri.parse(url.replace("test.yeshen.org", "yeshen.org"));
                return super.shouldInterceptRequest(view, new YeshenWebResourceRequest(uri, request));
            }
        }
        return super.shouldInterceptRequest(view, request);
    }
    
    @Nullable
    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
        String host = getHost(url);
        if (host.equals("yeshen.org")) {
            return super.shouldInterceptRequest(view, url);
        } else if (host.equals("test.yeshen.org")) {
            return super.shouldInterceptRequest(view,
                    url.replace("test.yeshen.org", "yeshen.org"));
        }
        return super.shouldInterceptRequest(view, url);
    }
    
    @NonNull
    private String getHost(String url) {
        if (TextUtils.isEmpty(url)) return "";
        int hostStart = url.indexOf("://") + 3;
        if (hostStart < 0) return "";
        int indexHost = url.indexOf("/", hostStart);
        int indexPort = url.indexOf(":", hostStart);
        int indexUrl = url.indexOf("?", hostStart);
        if (indexHost < 0) return "";
        if (indexPort > 0) indexHost = Math.min(indexHost, indexPort);
        if (indexUrl > 0) indexHost = Math.min(indexHost, indexUrl);
        return url.substring(hostStart, indexHost);
    }
    
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    private static final class YeshenWebResourceRequest implements WebResourceRequest {
    
        private final Uri mUri;
        private final WebResourceRequest mOld;
    
        private YeshenWebResourceRequest(@NonNull Uri uri, @NonNull WebResourceRequest old) {
            mUri = uri;
            mOld = old;
        }
    
        @Override
        public Uri getUrl() {
            return mUri;
        }
    
        @Override
        public boolean isForMainFrame() {
            return mOld.isForMainFrame();
        }
    
        @TargetApi(Build.VERSION_CODES.N)
        @Override
        public boolean isRedirect() {
            return mOld.isRedirect();
        }
    
        @Override
        public boolean hasGesture() {
            return mOld.hasGesture();
        }
    
        @Override
        public String getMethod() {
            return mOld.getMethod();
        }
    
        @Override
        public Map<String, String> getRequestHeaders() {
            return mOld.getRequestHeaders();
        }
    }
    
    
    展开全文
  • 背景介绍 项目环境:Android 9.0 ... 技术总结 由于OEM 产品操作系统中进行了...“使用webview 既定机制完成Html5 内部的网络访问拦截,并利用H5 容器将拦截下来的url地址按照操作系统的访问规则访问出去,并...
  • 1、WebView基本用法WebView的基本用法相信大多数android开发者都是会使用的,最简单的就是调用个loadUrl方法,但是记得要在清单文件中添加网络权限。我也简单了写了一个加载百度的代码如是:mWebview=(WebView)...
  • 接到这样一个需求,需要在 WebView 的所有网络请求中,在请求的url中,加上一个sign=xxxx 的标志位,同时添加手机本地的数据比如 sessionToken=sd54f5sd4ffsdf45454564 、deviceId=863970025919887 例如 ...
  • 接到这样一个需求,需要在 WebView 的所有网络请求中,在请求的url中,加上一个sign=xxxx 的标志位,同时添加手机本地的数据比如 sessionToken=sd54f5sd4ffsdf45454564 、deviceId=863970025919887 文章链接:...
  • Android WebView通过动态的修改js去拦截post请求参数实例发布时间:2020-09-15 22:55:25来源:脚本之家阅读:280作者:xp_code需求背景:需要在用户点击提交按钮的时候拦截用户提交的数据。遇到的问题:1.页面不是自家...
  • Android中如何拦截WebView请求 文章来自cnzx219在Github上的分享,这里先对他表示感谢。附地址:https://github.com/cnzx219/my-note/blob/master/2015/android-webview-intercept-request.md 1、需求背景 接到...
  • 我正在开发一个Android应用程序过滤请求(使用白名单)和使用自定义SSLSocketFactory。为此,我开发了一个自定义的WebViewClient,我已经覆盖了...那么,有没有办法拦截WebView中的POST请求?这里是shouldInterceptReq...
  • Android中WebView拦截js请求

    千次阅读 2015-05-08 19:31:08
    Android中处理网页时我们必然用到WebView,这里我们有这样一个需求,我们想让WebView在处理网络请求的时候将某些请求拦截替换成某些特殊的资源。具体一点儿说,在WebView加载 http://m.sogou.com 时,会加载一个...
  • Android WebView拦截请求详解

    千次阅读 2016-09-29 08:00:20
    你所不知道的一些WebView的小技巧。
  • android webview 网络请求拦截

    千次阅读 2018-07-20 23:51:59
    最近接到一个需求,需要拦截webview的网络请求,通过okhttp代发 通过webview设置WebViewClient,重写如下方法 @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest ...
  • webView 拦截网络请求

    千次阅读 2015-12-17 21:56:40
    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {  // 1.获得url  NSString *url = request.URL
  • Android中WebView拦截替换网络请求数据

    千次阅读 2015-12-21 17:03:29
    转载自:http://droidyue.com/blog/2014/11/23/block-web-resource-in-webview/?droid_refer=random_recommend
  • 本发明涉及解决拦截转发androidwebview请求后页面加载变慢的方法。背景技术:手机移动端网页开发过程中,在某些场景下,需要拦截webview所有的请求,并针对请求的响应做相应的处理。url的拦截是由webview提供的...
  • 主要介绍了详解Android Webview加载网页时发送HTTP头信息的相关资料,需要的朋友可以参考下
  • Webviewhttp或者https的网络请求拦截

    万次阅读 2016-12-29 13:51:39
    webview调起拨打电话,支付宝,微信,qq等 url拦截关键步骤1,extends WebViewClient2,复写其方法shouldOverrideUrlLoading (webview.loadURL的时候才会调用)具体代码实现:@Overridepublic boolean ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,765
精华内容 1,906
关键字:

webview拦截http请求