Android webView使用详解(Cookies)

前段时间的项目关系一直在和android的webview打交道,网上查了很多资料,发现关于webview的详细介绍都比较少,于是决定自己做个小总结。当然因为本人比较懒的缘故,可能这个总结也不会做的太全面,要想详细了解webview的话还是推荐直接去看Android Developer官方网站给的API文档,我在这里只是粗略介绍一下要想开发一个完整的webview需要用到的一些主要的class,以及提一下在使用webview时需要注意的一些point。
关于Webview几个比较重要的class是WebView, WebSettings, WebViewClient以及CookieManager。
WebView类就相当于一个小型浏览器,使用它就可以根据URL浏览某个网页;但在使用webview之前我们需要先对webview做一些基本的全局配置,这就需要用到WebSettings。然后WebViewClient相当于WebView这个简易浏览器的内核,设置黑白名单,对特定URL,scheme采取哪种响应方式,操作cookie都在(应该在)这个类里面进行相应方法的重载实现。这里不得不吐一下槽就是Android的CookieManager略难用,使用它去获得cookie时,只能得到所有cookie的“key=value”字符串,cookie的有效时间,domain啥的一律取不到,要想取得Cookie对象的话貌似目前只能通过HttpClient(具体我没实践过)。下面是示例代码,具体代码意义请看注释。


//假设你已经在Activity或者Fragment对应的layout文件中定义了一个id为webview的WebView组件。
WebView webview = (WebView) findViewById(R.id.webview);
//设定webview的useragent,这个主要用来服务器端进行验证,如果server端没有特殊要求的话可以不用管。
webview.getSettings().setUserAgentString("string");
WebSettings webViewSetting = webview.getSettings();
//下面这两行代码让webview在打开网页时自动进行大小匹配,让网页大小fit上屏幕大小
webview.getSettings().setUseWideViewPort(true);
webview.getSettings().setLoadWithOverviewMode(true);
//设置webview支持放大缩小功能,try部分的代码可能难理解,这是为了消去我们用手指进行放大缩小时屏幕中出现的“放大缩小按钮”
webview.getSettings().setBuiltInZoomControls(true);
webview.getSettings().setSupportZoom(true);
try {
    Field webViewField = webViewSetting.getClass()
              .getDeclaredField("mBuiltInZoomControls");
    webViewField.setAccessible(true);
    webViewField.set(webViewSetting, false);
} catch (Exception e) {
    e.printStackTrace();
    webViewSetting.setBuiltInZoomControls(false);
}
webview.setWebViewClient(newWebViewClient);
//WebViewClient是重头戏,很多自定义的逻辑控制功能都要借助这个类来实现。
//定义一个新的WebViewClient
private WebViewClient newWebViewClient = new WebViewClient() {
    @Override
    //这个函数用来决定每当webview打开一个新的URL时的动作,
    //return true的话表示webview不会继续对URL进行操作,此时你需要指定来对该URL进行操作的应用或是其他组件;
    //如果不指定,直接返回true的相当于该条URL不响应;
    //return false的话表示webview会继续对该URL进行处理。
    //如果要对特定的domain进行限定,也就是我们说的黑白名单,
    //就需要重载这个方法,判断URL是否需要过滤,然后直接返回true
    public boolean shouldOverrideUrlLoading(
        final WebView view, final String url) {
            for (int k = 0; k < blockList.length; k++) {
                 if (url.contains(blockList[k])) {
                     return true;
                 }
            }
            if (url.startsWith("http://")) {
                return false;
            } else if (url.startsWith("https://")) {
                return false;
            return true;
    }

    /**
     * 之前我在使用webview时出现了当打开https的link时webview一片空白的情况 
     * 网上查了一下,说是重载这个函数并让他返回handler.proceed()就行。
     * 试了之后确实可以解决问题,但这样子存在安全隐患。
     * 因为这个函数的意思是忽略HTTPS错误,即当出现HTTPS错误,比如最常见的
     * 没有签名的安全错误,webview也还是照样打开该网站,这就让钓鱼网站有机可乘,
     * 所以一般做法时当出现HTTPS错误时,调用cancel()终止网页继续载入。
     * 那如何解决HTTPS链接空白的问题呢?参考上面shouldOverrideUrlLoading()的定义
     */
    @Override
    public void onReceivedSslError(final WebView view, 
                    final SslErrorHandler handler, final SslError error) {
        //handler.proceed();
        handler.cancel();
    }

    @Override
    //当发生了HTTP错误,比如404错误啊,503错误啊等就调用这个函数,
    //可以在这里获得errorCode并对errorCode进行对应处理
    public void onReceivedError(final WebView view, 
                final int errorCode, final String description, final String url) {
    }

    /**
     * 打开一个URL时会被调用的函数,在这里可以进行一些初始化操作,比如载入cookie等
     */
    @Override
    public void onPageStarted(final WebView view, final String url, 
               final Bitmap favicon) {
        URL realUrl;
        try {
             realUrl = new URL(url);
             host = realUrl.getHost();
             domain = host.substring(host.indexOf("."));
        } catch (MalformedURLException e) {
             e.printStackTrace();
        }
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptCookie(true);
        //注意我们在set cookie时不能直接针对URL进行cookie的set操作,而是应该要针对该URL的domain来进行设置
        //domain的格式一定为".google.com"类似。
        cookieManager.setCookie(domain, cookieKeyName);
        if (cookieManager.hasCookies()) {
             //但是在获取cookie时使用的参数是url,这里的区别要注意
             String cookies = cookieManager.getCookie(url);
        } 
    }
    /**
     * 当网页载入完毕时一定会调用的函数,可以在这里进行一些参数保存操作
     */
    @Override
    public void onPageFinished(final WebView view, final String url) {
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值