Android小白

Android WebView原生与网页交互常用知识点

2017-12-03  本文已影响1人  独孤流

1、android WebView拦截请求详解
2、android webview一篇文章全面了解(基本使用,url拦截,js跟java交互)
3、APP精细化HTTP分析(一):别再只是代理抓个包了

一、设置User-Agent


    private WebView webview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ano);

        webview = (WebView) this.findViewById(R.id.id_wv_ua);
        // 得到WebSettings对象
        WebSettings settings = webview.getSettings();
        // 如果访问的页面中有JavaScript,则WebView必须设置支持JavaScript,否则显示空白页面
        webview.getSettings().setJavaScriptEnabled(true);
        // 获取到UserAgentString
        String userAgent = settings.getUserAgentString();
        // 打印结果
        Log.i("TAG", "User Agent:" + userAgent);

        // 修改ua使得web端正确判断  
        String ua = webview.getSettings().getUserAgentString();  
        webview.getSettings().setUserAgentString(ua+"; 自定义标记");
    }
}

二、 cookie

2.1 获取cookie
【WebView】Android WebView中的Cookie操作

 @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_temp_web_view);  
        wvTempShow = (WebView) findViewById(R.id.wv_tempShow);  
        Intent intent = this.getIntent();  
        receiveUrl = intent.getStringExtra("openUrl");  
       //获得cookie管理者  
        CookieManager cookieManager = CookieManager.getInstance();  
        //获取登陆时的cookie  
        String oldCookie =  "xxxx=aaaa";
        cookieManager.setCookie(receiveUrl, oldCookie);  
    }

三、伪造Referrer、增加中间页空白跳转

android WebView拦截请求详解
demo下载

如果需要构造特定的referrer请求的,比如盗图这种特殊业务时实践过程
实际访问地址:https://www.baidu.com
实际访问地址要校验的referrer:https://www.google.com
1、将要访问的实际地址抓换为访问referrer的地址

// 如果是要访问有校验的Referrer,则请求这个Referrer地址
if (mReferer != null){
    mWebView.loadUrl(mReferer);

 }else {
    // 不需要构造Referrer的直接访问目标地址
     mWebView.loadUrl(mUrl);
  }

2、设置Android的浏览器支持JavaScript对Referrer的获取

public boolean shouldOverrideUrlLoading(WebView view, String url) {
          // 要支持Referrer的请求,直接返回false,什么处理都不做
          return false;
        }

3、设置如果请求的是构造的那个Referrer的这个请求,则创建一个本地的伪造response

@Override
        public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
          mRefererMap.get
            if (mReferer == null){
                // 如果不需要构造Referrer,也就是本地构造的mReferer
                return super.shouldInterceptRequest(view, request);
            }else {
                if (mReferer == null){
                return super.shouldInterceptRequest(view, request);
            }else {
                mReferer = null;
                String response = "<html>" +
                        " <META content=\"always\" name=\"referrer\">" +
                        "<script>" +
                        "try{" +
                        "if(window.opener&&window.opener.bds&&window.opener.bds.pdc&&window.opener.bds.pdc.sendLinkLog){" +
                        "window.opener.bds.pdc.sendLinkLog();}" +
                        "}catch(e) {};" +
                        "window.location.replace(\"" +mUrl+
                        "\")" +
                        "</script> " +
                        "<noscript>" +
                        "<META http-equiv=\"refresh\" content=\"0;URL='" +mUrl+
                        "'\">" +
                        "</noscript>" +
                        "</META>" +
                        "</html>";

                WebResourceResponse webResourceResponse = new WebResourceResponse("text/html", "utf-8", new ByteArrayInputStream(response.getBytes()));


                return webResourceResponse;
            }

        }

完整例子

public class WebActivity extends Activity {

    private final String TAG = "WebActivity";
    
    String mUrl,mReferer;

    WebView webView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web);
        webView = (WebView) findViewById(R.id.webView);

        webView.setDefaultHandler(new DefaultHandler());

        webView.setWebViewClient(new WebViewClient(){
            
           @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                return false;
            }


            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                if (mReferer == null){
                    return super.shouldInterceptRequest(view, request);
                }else {
                    mReferer = null;
                    String response = "<html>" +
                            " <META content=\"always\" name=\"referrer\">" +
                            "<script>" +
                            "try{" +
                            "if(window.opener&&window.opener.bds&&window.opener.bds.pdc&&window.opener.bds.pdc.sendLinkLog){" +
                            "window.opener.bds.pdc.sendLinkLog();}" +
                            "}catch(e) {};" +
                            "window.location.replace(\"" +mUrl+
                            "\")" +
                            "</script> " +
                            "<noscript>" +
                            "<META http-equiv=\"refresh\" content=\"0;URL='" +mUrl+
                            "'\">" +
                            "</noscript>" +
                            "</META>" +
                            "</html>";

                    WebResourceResponse webResourceResponse = new WebResourceResponse("text/html", "utf-8", new ByteArrayInputStream(response.getBytes()));


                    return webResourceResponse;
                }

            }
        });

        webView.setWebChromeClient(new WebChromeClient() {});
        
         // 测试数据
          mUrl = "https://www.baidu.com";
          mReferer = "https://www.google.com";
          if (mReferer != null && !mReferer.isEmpty()){
              mWebView.loadUrl(mReferer);
          }else {
              mWebView.loadUrl(mUrl);
          }

    }
      
     

}

四、js与原生交互

WebViewJavascriptBridge
wechat_JSBridage
wechat_JSBridage_fork

上一篇 下一篇

猜你喜欢

热点阅读