• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Android WebView 使用Authorization、Cookie

武飞扬头像
ll木木彡木木彡ll
帮助1

初始化Webview

void initWebView() {
        webview = viewBinding.webDetail;
        webview.setBackgroundColor(0); //背景透明
      //webview.setLayerType(View.LAYER_TYPE_SOFTWARE,null); //关闭硬件加速
        WebSettings webSettings = webview.getSettings();//声明WebSettings子类
      //如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript
      // 若加载的 html 里有JS 在执行动画等操作,会造成资源浪费(CPU、电量)
      // 在 onStop 和 onResume 里分别把 setJavaScriptEnabled() 给设置成 false 和 true 即可
        webSettings.setJavaScriptEnabled(true);
        webSettings.setDomStorageEnabled(true);
/**
 * 用WebView显示图片,可使用这个参数 设置网页布局类型:
 * 1、LayoutAlgorithm.NARROW_COLUMNS : 适应内容大小
 * 2、LayoutAlgorithm.SINGLE_COLUMN:适应屏幕,内容将自动缩放
 */
        webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
//设置自适应屏幕,两者合用
        webSettings.setUseWideViewPort(true);
        webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
//缩放操作
        webSettings.setSupportZoom(false); //支持缩放,默认为true。是下面那个的前提。
        webSettings.setBuiltInZoomControls(false); //设置内置的缩放控件。若为false,则该WebView不可缩放
        webSettings.setDisplayZoomControls(true); //隐藏原生的缩放控件
//其他细节操作
        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); //关闭webview中缓存
        webSettings.setAllowFileAccess(true); //设置可以访问文件
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
        webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
        webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式
        webSettings.setAllowFileAccessFromFileURLs(true); // 允许通过 file url 加载的 Javascript 读取其他的本地文件,包括其他的文件和 http,https 等其他的源,Android 4.1 之前默认是true,在 Android 4.1 及以后默认是false,也就是禁止
        webSettings.setAllowUniversalAccessFromFileURLs(true); // 如果此设置是允许,则 setAllowFileAccessFromFileURLs 不起做用
        webview.setWebViewClient(new WebViewClient() {

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            //这部分代码好像并不会触发
                Map<String, String> Headers = request.getRequestHeaders();
                for (String value : Headers.values()) {
                    Log.e("myweb", "Value = "   value);
                }//
                String bearer = "Bearer "   httpConfig.access_token;
                HashMap headerMap = new HashMap<String, String>();
                headerMap.put("Authorization", bearer);
                Log.e("myweb", "url:"   request.getUrl().toString());
                Log.e("myweb", "Authorization :"   bearer);
                view.loadUrl(request.getUrl().toString(), headerMap);
                return super.shouldOverrideUrlLoading(view, request);
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
              //这部分代码好像并不会触发
                String bearer = "Bearer "   httpConfig.access_token;
                HashMap headerMap = new HashMap<String, String>();
                headerMap.put("Authorization", bearer);
                Log.e("myweb", "url:"   url);
                Log.e("myweb", "Authorization :"   bearer);
                view.loadUrl(url, headerMap);
                return false;
            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
//设定加载开始的操作
                showLoading();//自定义加载框
            }

            @Override
            public void onPageFinished(WebView view, String url) {
//设定加载结束的操作
                hideLoading();//自定义加载框
            }

            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                super.onReceivedError(view, request, error);
                Log.e("myweb", "错误url:"   request.getUrl().toString());
                Log.e("myweb", "错误代码:"   error.getErrorCode());
                Log.e("myweb", "错误代码:"   error.getDescription());
            }


            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
//该方法处理https请求
                handler.proceed();    //表示等待证书响应
// handler.cancel();      //表示挂起连接,为默认方式
// handler.handleMessage(null);    //可做其他处理
            }

            //
            @Nullable
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
               //请求中携带Authorization的关键二
                Log.i("myweb", "请求资源 "   request.getUrl());
                WebResourceRequest request1 = new WebResourceRequest() {
                    @Override
                    public Uri getUrl() {
                        return request.getUrl();
                    }

                    @Override
                    public boolean isForMainFrame() {
                        return request.isForMainFrame();
                    }

                    @Override
                    public boolean isRedirect() {
                        return request.isRedirect();
                    }

                    @Override
                    public boolean hasGesture() {
                        return request.hasGesture();
                    }

                    @Override
                    public String getMethod() {
                        return request.getMethod();
                    }

                    @Override
                    public Map<String, String> getRequestHeaders() {
                        Map<String, String> Headers = request.getRequestHeaders();
                        String bearer = "Bearer "   httpConfig.access_token;
                        Headers.put("Authorization", bearer);
                        return Headers;
                    }
                };
                for (Map.Entry<String, String> entry : request1.getRequestHeaders().entrySet()) {
                    Log.w("myweb", entry.getKey()   ":"   entry.getValue());
                }
//请求携带Cookie的关键代码
                CookieSyncManager.createInstance(TransactionDetailActivity.this);
                CookieManager cookieManager = CookieManager.getInstance();
                cookieManager.setAcceptCookie(true);
                cookieManager.setCookie(request.getUrl().toString(), httpConfig.SESSION);
                CookieSyncManager.getInstance().sync();
                return super.shouldInterceptRequest(view, request1);
            }


        });
        webview.setWebChromeClient(new WebChromeClient() {


            //获取网站标题
            @Override
            public void onReceivedTitle(WebView view, String title) {
                Log.i("myweb", "标题:"   title);
            }


            //获取加载进度
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                if (newProgress < 100) {
                    String progress = newProgress   "%";
                    System.out.println(progress);
                } else if (newProgress == 100) {
                    String progress = newProgress   "%";
                    System.out.println(progress);
                }
            }
        });
    }
学新通

关键代码:设置拦截连接中的Authorization、Cookie

@Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
               //请求中携带Authorization的关键二
                Log.i("myweb", "请求资源 "   request.getUrl());
                WebResourceRequest request1 = new WebResourceRequest() {
                    @Override
                    public Uri getUrl() {
                        return request.getUrl();
                    }

                    @Override
                    public boolean isForMainFrame() {
                        return request.isForMainFrame();
                    }

                    @Override
                    public boolean isRedirect() {
                        return request.isRedirect();
                    }

                    @Override
                    public boolean hasGesture() {
                        return request.hasGesture();
                    }

                    @Override
                    public String getMethod() {
                        return request.getMethod();
                    }

                    @Override
                    public Map<String, String> getRequestHeaders() {
                        Map<String, String> Headers = request.getRequestHeaders();
                        String bearer = "Bearer "   httpConfig.access_token;
                        Headers.put("Authorization", bearer);
                        return Headers;
                    }
                };
                for (Map.Entry<String, String> entry : request1.getRequestHeaders().entrySet()) {
                    Log.w("myweb", entry.getKey()   ":"   entry.getValue());
                }
//请求携带Cookie的关键代码
                CookieSyncManager.createInstance(TransactionDetailActivity.this);
                CookieManager cookieManager = CookieManager.getInstance();
                cookieManager.setAcceptCookie(true);
                cookieManager.setCookie(request.getUrl().toString(), httpConfig.SESSION);
                CookieSyncManager.getInstance().sync();
                return super.shouldInterceptRequest(view, request1);
            }


        });
学新通

使用

 @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initWebView();
        String bearer = "Bearer "   httpConfig.access_token;
        Map headerMap = new HashMap<String, String>();
        headerMap.put("Authorization", bearer);
        String param = getIntent().getStringExtra("param");
        String URL = "http://"   api.DomainName   "/oct/oct_apply?"   param;
        webview.loadUrl(URL, headerMap);
    }
    @Override
    protected void onDestroy() {
// TODO Auto-generated method stub
        if (webview != null) {
            webview.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
            webview.clearHistory();
            webview.clearCache(true);
            ((ViewGroup) webview.getParent()).removeView(webview);
            webview.destroy();
            webview = null;
        }
        super.onDestroy();
    }


    @Override
    protected void onResume() {
// TODO Auto-generated method stub
        super.onResume();
        if (webview != null) {
            webview.getSettings().setJavaScriptEnabled(true);
            webview.reload();
        }
    }

    @Override
    protected void onStop() {
// TODO Auto-generated method stub
        super.onStop();
        if (webview != null)
            webview.getSettings().setJavaScriptEnabled(false);
    }

    @Override
    protected void onStart() {
        super.onStart();
    }

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfagic
系列文章
更多 icon
同类精品
更多 icon
继续加载