WebView小技巧

WebView用到最多的就是loadurl,一句代码皆大欢喜,但是没办法,需求来了我们就得动手解决。

1.web页面是需要加密信息才能显示,这时候需要我们带参数过去验证

例如需要登录信息才能浏览,2个方法

a.保证WebView页面的session与登录接口返回的session值一致

清除web浏览器中的session

CookieSyncManager.createInstance(getContext());

CookieSyncManager.getInstance().startSync();

CookieManager.getInstance().removeSessionCookie();

给http设置拦截器 可以捕获request和response信息,从而我们可以获得我们需要的session值

OkHttpClient.Builder clientBuilder =new OkHttpClient.Builder();

clientBuilder.addInterceptor(new HttpLoggingInterceptor());

重写拦截器的Response  intercept(Chain chain)方法

Request request = chain.request();

Response response = chain.proceed(request);

response.header("Set-Cookie")即获得 session值

设置session

try {

    CookieSyncManager.createInstance(context);

    CookieManager cookieManager = CookieManager.getInstance();

    cookieManager.setAcceptCookie(true);

    cookieManager.removeSessionCookie();// 移除

    cookieManager.removeAllCookie();

    String oldCookie = cookieManager.getCookie(url);

    URL aURL =new URL(url);

    StringBuilder sbCookie =new StringBuilder();

    sbCookie.append(PreferencesHelper.getData("COOKIE"));

    //webview在使用cookie前会前判断保存cookie的domain和当前要请求的domain是否相同,相同才会 发送cookie

  //注意,是getHost(),不是getAuthority(),

    sbCookie.append(String.format(";domain=%s", aURL.getHost()));

    String cookieValue = sbCookie.toString();

    cookieManager.setCookie(url, cookieValue);

    CookieSyncManager.getInstance().sync();

    String newCookie = cookieManager.getCookie(url);

    webView.loadUrl(url);

}catch (Exception e) {

}

b.使用Webview.postUrl();传递验证参数

SearchBodyBean bean =new SearchBodyBean();

bean.sid = PreferencesHelper.getData(Constan.SID);

bean.userName = PreferencesHelper.getData(Constan.ACOUNT);

 bean.token = AESUtil.shaEncrypt(bean.userName + bean.sid + Constan.AES_KEY);

 webView.postUrl(url, new Gson().toJson(bean).toString().getBytes());

这个方式比较简单,但是要注意出现特殊字符导致数据缺失的问题,出现较多的有数据中存在“+”号,到后台了,“+”号全部都不见了。

由于数据是加密过的BASE64,会不时出现一些符合,如

webview.postUrl("www.testurl.com","data=abcdefg");

加密过后变成了。

webview.postUrl("www.testurl.com","data=dhfakjsdfhksdhf+dfasjkdhf+adsfkhasld");

传到后台解析:

key:data

value:dhfakjsdfhksdhf dfasjkdhf adsfkhasld

解决方案如下

try {

postData  = URLEncoder.encode(data.toString(),"utf-8");

} catch (UnsupportedEncodingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

URLEncoder就对字符进行了比较好的处理了。

最后。。。。

webView.postUrl(“www.testurl.com”,("data="+postData).getBytes());

2 WebView高度显示不全或者无法滑出最底部

这个问题的根本原因是我们给出WebView控件的宽高和加载完页面之后页面实际的宽高有出入,这里让我感觉webview这个控件有点缺陷。没关系我们还是有办法解决。

还原场景的布局

给webview设置weight希望它自己控制高度

这里的在点击Webview内部链接时会用JS调用页面隐藏显示头布局和底部布局,设置weight希望webview自己控制高度.但是实际上会出现隐藏头尾的时候页面显示不全,或者回退显示头尾时,页面在最下面无法滑动出来(发现实际上webview的高度还是全屏,被底布局遮挡),马丹,这个问题困扰了我一天,实际解决却很简单,不多废话,说方案。

在页面加载完成之后重新按当前需求设置webview的高度。是不是很简单!其实只是我们不知道哪里出了问题而已。

3.Webview加载自签名的https网址问题

Https自定义证书引入问题(2)

你可能感兴趣的:(WebView小技巧)