Cookie是服务器为客户端分配的一个键值对的表,和session不同的是cookie存储在客户端。服务器通过Response.addCookie()为客户端添加Cookie数据,再从Request.getCookie()中获取数据。
在Android开发中,有时我们需要调用http的接口登录帐号,然后使用cookie作为登录标记来进行网页浏览。此时就需要从http请求中取到cookie数据并保存起来,在使用webView进行页面访问时再将cookie数据设置到webview上。本文以OKHttp为讨论对象,下面是从OKHttp中取到Cookie数据的过程:
一.定义cookie接收监听器
/** * This Interceptor add all received Cookies to the app DefaultPreferences. * Your implementation on how to save the Cookies on the Preferences MAY VARY. * <p> * Created by tsuharesu on 4/1/15. */ public class ReceivedCookiesInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Response originalResponse = chain.proceed(chain.request()); List<String> cookieList = originalResponse.headers("Set-Cookie"); if(cookieList != null) { for(String s:cookieList) {//Cookie的格式为:cookieName=cookieValue;path=xxx //保存你需要的cookie数据 } } return originalResponse; } }
二.使用OKHttp发送简单Get请求
Request request = new Request.Builder().url("Your URL").build(); OkHttpClient client = new OkHttpClient(); client.interceptors().add(new ReceivedCookiesInterceptor()); //你定义的cookie接收监听器 Response response = client.newCall(request).execute();
三.初始化webview设置
/** * init WebView Settings * */ private void initWebViewSettings(){ // 设置可以访问文件 getSettings().setAllowFileAccess(true); //如果访问的页面中有Javascript,则webview必须设置支持Javascript getSettings().setJavaScriptEnabled(true); getSettings().setAllowFileAccess(true); getSettings().setAppCacheEnabled(true); getSettings().setDomStorageEnabled(true); getSettings().setDatabaseEnabled(true); }
四.将cookie设置到webview中去
public void syncCookie(Context context, String url){ 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(String.format(CookieName + "=%s","Your saved Cookie Value.")); //webview在使用cookie前会前判断保存cookie的domain和当前要请求的domain是否相同,相同才会发送cookie sbCookie.append(String.format(";domain=%s",aURL.getHost())); //注意,是getHost(),不是getAuthority(), sbCookie.append(String.format(";path=%s","/")); String cookieValue = sbCookie.toString(); cookieManager.setCookie(url, cookieValue); CookieSyncManager.getInstance().sync(); String newCookie = cookieManager.getCookie(url); }catch(Exception e){ } }
注意,在loadUrl()之前,设置cookie。
相关推荐
Android——okhttp的封装,Android——okhttp的封装,Android——okhttp的封装,Android——okhttp的封装,Android——okhttp的封装
Android Cookie存储Android InMemory和用于HttpURLConnection和OkHttp的持久性Cookie存储,具有扩展功能,可以轻松地在Android WebViews中同步Cookie。 为什么? HttpURLConnection和Ok Android Cookie都没有,...
这个是关于android的OkHttp3框架的代码实例,里面包括POST和GET请求,请大家多多指教。
通过OkHttp拦截器、自定义CookieJar有效完成客户端与H5端的Cookie同步管理 监听WebView的加载进度 滚动条的设置(隐藏或者显示,内侧显示还是外侧显示) 优化X5WebView的预加载问题(使用IntentService规避风险) ...
Android okHttp Jar 包;Android okHttp Jar 包;Android okHttp Jar 包;Android okHttp Jar 包;Android okHttp Jar 包;Android okHttp Jar 包
OkHttp的拦截器可以存储失败的请求,并将重试请求直到成功或重试次数超过限制,或请求超时时间超过限制
Android网络请求OkHttp的使用demo代码
OKHttp3是如今非常流行的Android网络请求框架,那么如何利用Android实现断点续传呢,今天写了个Demo尝试了一下,感觉还是有点意思 准备阶段 我们会用到OKHttp3来做网络请求,使用RxJava来实现线程的切换,并且开启Java8...
android网络okhttp3的demo,是老罗那个
Android 版本更新 对话框,强制更新,使用OKHttp3工具进行下载,监听下载进度,适配7.0手机,权限配置等
OkHttp3.0封装框架,内部使用gson解析json数据
Android-okhttp.zip,一个用于Android、Kotlin和Java的HTTP客户端。,安卓系统是谷歌在2008年设计和制造的。操作系统主要写在爪哇,C和C 的核心组件。它是在linux内核之上构建的,具有安全性优势。
OkHttp的请求拦截器,实现请求拦截,打印日志到logcat,链接已经拼接好
Android 使用OkHttp3报错处理:经过本人亲自试验:这三个包(okio、okhttp-3.9.0、okhttputils-2.6.2)一起使用不会报任何错误有用请收藏给星星让更多人看到
Android 用Service+OKHttp实现应用后台检测更新示例代码; Android 用Service+OKHttp实现应用后台检测更新示例代码 Android 用Service+OKHttp实现应用后台检测更新示例代码 Android 用Service+OKHttp实现应用后台...
调用方法传入url和一个类型,请求后,直接将‘返回的数据’映射到‘该类型的对象’中,并返回相应的请求状态
Android经常会用到网络请求,对okhttp网络请求框架的使用和封装
对Okhttp3进行二次封装,对外提供了POST请求、GET请求、PATCH请求、PUT请求、DELETE请求、上传文件、下载文件、取消请求、Raw/Json/Gson返回、后台下载管理等功能
1、首先,OKHttp官方要求我们最好用单例模式去使用OKHttpClient类的,因此我们自定义一个OKHttpHelper类,并且使用单例模式。
android OkHttp上传文件并带进度条