android 中对于采用okhttp时获取cookie并放入webview实现跳过登陆显示页面的功能

最近项目需要将网页的一些信息展示到app当中,由于采用的是okhttp进行网络的访问,并采用了cookie对于每次的访问请求都做了验证,所以在加入webview显示网页的时候会需要进行一下验证,为了跳过这一验证,直接进入到我们需要的页面,所以就需要我们在获取到cookie后,将cookie传入到webview当中,从而使得页面不需要再次的验证。

获取cookie的方式有很多,对于这一块的问题并不是很大,由于我们的项目需求时间较为紧迫,我在构建项目的时候采用的是已经被封装好的okhttputil来作为网络的框架实现服务器的交互,在这个框架中,已经为我们实现了cookie的每次请求的加入,所以并不需要自己花费时间去实现,其配置cookie的方式如下:

             CookieJarImpl cookieJar = new CookieJarImpl(new PersistentCookieStore(getApplicationContext()));
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cookieJar(cookieJar)
//其他配置
.build();
OkHttpUtils.initClient(okHttpClient);
在定义的application当中,加入以上的配置就可以了。
所以从这里的cookieJar当中我们自然也能获取到相应的cookie,
           CookieJarImpl cookieJar1 = new CookieJarImpl(new PersistentCookieStore(getActivity().getApplicationContext()));
CookieStore cookieStore1= cookieJar1.getCookieStore();
List<Cookie> cookies1=cookieStore1.getCookies();
Cookie cookie1=cookies1.get(0); 上面的代码在进行网络请求后可以让我们获取到cookie,通过获取到的cookie,我们就能将其加入到webview当中,从而避免webview的重复登陆。 我们在webview当中实现
         CookieSyncManager.getInstance();
CookieSyncManager.createInstance(this);//创建一个cookie管理器
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeSessionCookie();// 移除以前的cookie
cookieManager.removeAllCookie();
cookieManager.setCookie("your url",cookie);//为url设置cookie
CookieSyncManager.getInstance().sync();//同步cookie
在我们load()之前,我们需要调用上面的方法,将我们获取到的cookie添加到需要访问的url当中,随后就可以进行访问了。

不过在实现当中我还是遇到了问题,可以很明确的发现获取的cookie并不对,这个时候我开始怀疑自己获取的cookie方法是否有问题,于是我点开了其实现cookie加入的源码当中,
在其实现获取cookie的方法当中,我发现了这样的一个问题,
                 cookiePrefs = context.getSharedPreferences(COOKIE_PREFS, 0);
cookies = new HashMap<String, ConcurrentHashMap<String, Cookie>>(); // Load any previously stored cookies into the store
Map<String, ?> prefsMap = cookiePrefs.getAll();
我发现其对于cookie是放在sharedpreferences当中来实现的,于是我对于获取的cookieJar进行了遍历,发现竟然有三个cookie,这个时候我才明白,
之前因为调试的时候换了三个不同ip的服务器,所以导致app缓存了三个cookie,只是我不明白为什么在我shutdown的时候这些cookie没有被清除呢?
所以我清除了app的缓存,最后再次获取并放入webview之后,功能就能正常的运行和实现了。
上一篇:Manifest merger failed : Attribute application@icon value=(@mipmap/ic_launcher) from AndroidManifest


下一篇:react的类型检查PropTypes自React v15.5起已弃用,请使用prop-types