最近项目中接触到一个麻烦的登录接口,需要用native方法请求登录接口后,返回的链接列表再请求一遍。照做后发现WebView还是不会自动登录。询问ios同事发现他也是这样做,但是能自动登录。后来我发现了这篇文章【WebView的cookie机制 】轻松搞定WebView cookie同步问题,里面提到“因为Android不会自动同步cookie到WebView。做IOS开发则不用担心这个问题,因为IOS内部已经实现了cookie同步”。
于是我按照他的方式二去实现,发现还是不行。期间我跟后台的同事沟通,用加载JS的方式去解决问题,发现在电脑的浏览器上可以成功,但是在手机浏览器上不成功,进度又回到了原地。
重点来了!!!
通过数据库查看软件打开Cookies发现,保存到数据库里的name-value键值对只保存了一个,而从电脑浏览器看有三个。
问题就出现在取Cookie的时候没有取全,下面是网上取Cookie的方法
String cookieStr = conn.getHeaderField("Set-Cookie");
下面代码是我通过HttpURLConnection取Cookie的方法,其他网络框架的自行Google。
URL url =new URL(url);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.connect();
if(conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
Map<String, List<String>> headFields = conn.getHeaderFields();
List<String> cookieList = headFields.get("Set-Cookie");
}
然后通过CookieManager的setCookie方法把url跟cookie绑定下就好了。
CookieManager cookieManager = CookieManager.getInstance();
for(String cookie: cookieList) {
cookieManager.setCookie(url, cookie);
}
如果API是21以下的话,需要在CookieManager前
CookieSyncManager.createInstance(context);
在for循环结束后
CookieSyncManager.getInstance().sync();
花了两天终于把这个问题解决了,WebView已经能自动登录。
如有什么错误或者不足的地方,请指正。