精华内容
下载资源
问答
  • httpClient请求和服务器session保持同步,webViewcookie的管理 httpClient请求和服务器session保持同步,webViewcookie的管理
  • 主要介绍了解决Android webview设置cookiecookie丢失的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 现有系统已经有一套完整的接口,用户状态、验证都是基于 cookie 的。 部分业务要上小程序版本,众所周知,微信小程序不支持 cookie 的。要上线的业务,最好的方式还是基于现有这套接口做,改动不大,也最快。 模拟 ...
  • iOS 获取 cookie webView中使用Cookie

    千次阅读 2016-01-28 17:23:04
    【获取Cookie】 + (void)deleteCookie {  // 清空 cookie  NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStoragesharedHTTPCookieStorage];  NSArray *_tmpArray = [NSArray arrayWithArray:[co

    【获取Cookie】

    + (void)deleteCookie {

        // 清空 cookie

        NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStoragesharedHTTPCookieStorage];

        NSArray *_tmpArray = [NSArray arrayWithArray:[cookieJar cookies]];

        for (id obj in _tmpArray) {

            [cookieJar deleteCookie:obj];

        }

        

    }


    +(void)YYZQSQObtainCookieBlock:(cookieBlock)block {

        // 现在服务器 直接返回了 cookie 这里就不需要用了

    // 自己设置 cookie    

    //    NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];

    //    [cookieProperties setObject:@"username" forKey:NSHTTPCookieName];

    //    [cookieProperties setObject:@"rainbird" forKey:NSHTTPCookieValue];

    //    [cookieProperties setObject:@"cnrainbird.com" forKey:NSHTTPCookieDomain];

    //    [cookieProperties setObject:@"cnrainbird.com" forKey:NSHTTPCookieOriginURL];

    //    [cookieProperties setObject:@"/" forKey:NSHTTPCookiePath];

    //    [cookieProperties setObject:@"0" forKey:NSHTTPCookieVersion];

    //    

    //    NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];

    //    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];

    //    NSString *token = [[NSUserDefaults standardUserDefaults]objectForKey:@"access_token"];


        NSString *imuserid = [[NSUserDefaultsstandardUserDefaults]objectForKey:@"imuserid"];//统一平台uid

        NSString * uid =  [YYUserManager sharedObject].user.uid;

        

        NSMutableDictionary *dict = WebServiceDictionary(CurrentUserID());

     

        NSString *urlStr = [NSStringstringWithFormat:@"%@&uid=%@&token=%@",WebServiceZQSQURL(@"m=Login&a=getCookies", dict),imuserid,uid];

        

        NSURL *url = [NSURL URLWithString:urlStr];

        

        NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheDatatimeoutInterval:30.0f];


        NSOperationQueue *queue = [[NSOperationQueue alloc]init];


        [NSURLConnection sendAsynchronousRequest:request

                                           queue:queue

                               completionHandler:^(NSURLResponse *response, NSData*data, NSError *error){

                                   

                                   

                                   NSString * responseString = [[NSString allocinitWithBytes:[data byteslength:[data lengthencoding:NSUTF8StringEncoding];

                                   NSLog(@"responseString === %@",responseString);

                                   

                                   

                                   //转换NSURLResponse成为HTTPResponse

                                   NSHTTPURLResponse *HTTPResponse = (NSHTTPURLResponse *)response;

                                   //获取headerfields

                                   NSDictionary *fields = [HTTPResponse allHeaderFields];//原生NSURLConnection写法

                                   

                                   NSLog(@"fields = %@",[fields description]);

                                   

                                   NSURL *urlCookie = [NSURL URLWithString:@"api-zqt-seller-test.cifco.net"];

                                   //获取cookie方法1

                                   NSArray *cookies1 = [NSHTTPCookiecookiesWithResponseHeaderFields:fields forURL:urlCookie];

                                   NSLog(@"cookies1 == %@",cookies1);

                                   //获取cookie方法2

                                   NSString *cookieString = [[HTTPResponse allHeaderFieldsvalueForKey:@"Set-Cookie"];

                                   NSLog(@"cookieString == %@",cookieString);

                                   

                                   //获取cookie方法3

                                   NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 


                               }];


    }




    //方法2

    + (BOOL)GetCookieData:(NSString *) urlString{

        

        NSString *  cookie = nil;

        

        NSURL *url = [NSURL URLWithString:urlString];

        NSMutableURLRequest *getRequest = [NSMutableURLRequestrequestWithURL:url];

        [getRequest setHTTPMethod:@"GET"];

        

        NSURLResponse *response;

        

        NSData *myReturn =[NSURLConnection sendSynchronousRequest:getRequest returningResponse:&response error:nil];

        NSHTTPURLResponse *HTTPResponse = (NSHTTPURLResponse *)response;

        NSDictionary *fields = [HTTPResponse allHeaderFields];

        NSLog(@"取得我要的cookie %@",[fields description]);

        //取得我要的cookie

        if (cookie == nil) {

            cookie =[[NSString allocinitWithString: [[[fields valueForKey:@"Set-Cookie"componentsSeparatedByString:@";"objectAtIndex:0]];

        }

        else{

            cookie = [[[fields valueForKey:@"Set-Cookie"componentsSeparatedByString:@";"objectAtIndex:0];

        }

        NSLog(@"取得我要的cookiecookie = %@",cookie);

        NSString *strRet = [[NSString allocinitWithData:myReturn encoding:NSASCIIStringEncoding];

        NSLog(@"取得我要的cookie %@",strRet);

        

        if([cookie length]<25)

            return NO;

        else

            return YES;

    } 


    【在WebView中使用Cookie】

     NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];

        if (self.isCookie) {

            

            // 网络请求头  稍后用于判断是不是我们需要的cookie

            NSString *strHttp = [XHWebServiceBaseAddresssubstringWithRange:NSMakeRange(716)];

            

            NSHTTPCookie *cookie = nil;

            // 这个是所有的Cookie

            NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStoragesharedHTTPCookieStorage];

            // 现在服务器 直接返回了 cookie 这里就不需要用了

            for (NSHTTPCookie *ck in [cookieJar cookies]) {

                NSString * domain = [ck domain];

                NSString * value = [ck value];

                NSLog(@"domain 现在服务器 直接返回了======%@", domain);

                

                // 根据domain 来区分,那个是我们需要的cookie

                

                if ([domain hasPrefix:strHttp]) {

                    NSLog(@"现在服务器 直接返回了= %@ == %@",domain,value);

                    cookie = ck;

                }

            }

            

            NSLog(@"这条是我要的cookie ===%@",cookie);

            

            //    NSString * cookieName = [cookie name];

            NSString * cookieVal = [cookie value];

            //    NSString * domain = [cookie domain];

            

            //        // 手动添加 cookie

            //        NSDictionary *properties = [[NSMutableDictionary alloc] init];

            //        [properties setValue:@"PHPSESSID" forKey:NSHTTPCookieValue];

            //        [properties setValue:cookieVal forKey:NSHTTPCookieName];

            //        [properties setValue:@"" forKey:NSHTTPCookieDomain];

            //        [properties setValue:[NSDate dateWithTimeIntervalSinceNow:60*60] forKey:NSHTTPCookieExpires];

            //        [properties setValue:@"/" forKey:NSHTTPCookiePath];

            //        NSHTTPCookie *cookie11 = [[NSHTTPCookie alloc] initWithProperties:properties];


            // 根据服务器 需要的内容,自行拼接

            //    NSString *cookieString = [[NSString alloc] initWithFormat:@"name=PHPSESSID;value=%@;path=/;domain=%@;httponly",cookieVal,domain];

            NSString *cookieString = [[NSString allocinitWithFormat:@"PHPSESSID=%@",cookieVal];

            // 这里 可以传递多个 cookie

            //        NSArray *cookies11=[NSArray arrayWithObjects:cookie11,nil];

            //        NSDictionary *headers11=[NSHTTPCookie requestHeaderFieldsWithCookies:cookies11];

            

            // Cookie 需要根据服务器接收对象 进行自行修改  默认会加上 HTTP_

            [request setValue:cookieString forHTTPHeaderField:@"Cookie"];

        }

        

        return request;


    展开全文
  • android中okhttp与webviewcookie共享

    千次阅读 2018-11-26 16:52:47
    1.在WebView中同步cookie import android.os.Build; import android.text.TextUtils; import android.webkit.CookieManager; import android.webkit.CookieSyncManager; import android.webkit.WebView; import ...

     

    1.在WebView中同步cookie

    import android.os.Build;
    import android.text.TextUtils;
    import android.webkit.CookieManager;
    import android.webkit.CookieSyncManager;
    import android.webkit.WebView;
    import java.util.ArrayList;
    import java.util.List;
    import okhttp3.Cookie;
    import okhttp3.HttpUrl;
    
    public class CookieUtil {
    
        private static CookieUtil instance;
        private PersistentCookieStore mPersistentCookieStore;
    
        public static CookieUtil getInstance() {
            if (instance == null) {
                instance = new CookieUtil();
            }
            return instance;
        }
    
        private CookieUtil() {
            mPersistentCookieStore = new PersistentCookieStore(BaseApplication.getInstance());
        }
    
        /**
         * 注意事项:
         * 1.如果需要传第三方cookie,请调用方法setAcceptThirdPartyCookies
         * 2.如果这里有多个cookie,不要使用分号手动拼接,请多次调用setCookie方法
         * 3.请在调用loadUrl方法前执行
         * 
         * <p>
         *
         * @param webView
         * @param url
         */
        public void syncCookie(WebView webView, String url) {
            try {
                if (!TextUtils.isEmpty(url) && url.startsWith("http")) {
                    // 在上下文中创建单个CookieSyncManager
                    CookieSyncManager.createInstance(BaseApplication.getInstance());
                    // 获取单例CookieManager实例
                    CookieManager cookieManager = CookieManager.getInstance();
                    // 设置应用程序的WebView实例是否应发送和接受cookie
                    cookieManager.setAcceptCookie(true);
                    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
                        // 删除所有会话cookie
                        cookieManager.removeSessionCookie();
                        // 此方法在API级别21中已弃用.WebView会自动处理删除过期的Cookie。
                        cookieManager.removeExpiredCookie();
                        // 删除所有cookie
                        // cookieManager.removeAllCookie();
                    } else {
                        if (webView != null) {
                            // 设置是否WebView应允许设置第三方cookie
                            cookieManager.setAcceptThirdPartyCookies(webView, true);
                        }
                        // 删除所有会话cookie
                        cookieManager.removeSessionCookies(null);
                        // 删除所有cookie
                        // cookieManager.removeAllCookies(null);
                    }
                    List<Cookie> cookies = mPersistentCookieStore.get(HttpUrl.parse(url));
                    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
                        // 设置原生cookie
                        if (cookies != null && cookies.size() > 0) {
                            for (int i = 0; i < cookies.size(); i++) {
                                Cookie cookie = cookies.get(i);
                                cookieManager.setCookie(url, cookie.name() + "=" + cookie.value());
                            }
                        }
                        // 设置第三方cookie
                        cookieManager.setCookie(url, String.format("这里填写cookie的名称=%s", "这里填写cookie的值"));
                        // 确保当前可通过getCookie API访问的所有cookie都写入持久存储
                        CookieSyncManager.getInstance().sync();
                    } else {
                        // 设置原生cookie
                        if (cookies != null && cookies.size() > 0) {
                            for (int i = 0; i < cookies.size(); i++) {
                                Cookie cookie = cookies.get(i);
                                cookieManager.setCookie(url, cookie.name() + "=" + cookie.value(), null);
                            }
                        }
                        // 设置第三方cookie
                        cookieManager.setCookie(url, String.format("这里填写cookie的名称=%s", "这里填写cookie的值"),null);
                        // 确保当前可通过getCookie API访问的所有cookie都写入持久存储
                        cookieManager.flush();
                    }
                }
            } catch (Exception e) {
            }
        }
    
        /**
         * 添加cookie
         * 在WebViewClient的onPageFinished函数中调用
         *
         * @param url
         */
        public void addCookie(String url) {
            try {
                if (!TextUtils.isEmpty(url) && url.startsWith("http")) {
                    String cookies = CookieManager.getInstance().getCookie(url);
                    if (!TextUtils.isEmpty(cookies)) {
                        HttpUrl httpUrl = HttpUrl.parse(url);
                        List<Cookie> list = new ArrayList<>();
                        list.add(Cookie.parse(httpUrl, cookies));
                        mPersistentCookieStore.add(httpUrl, list);
                    }
                }
            } catch (Exception ex) {
            }
        }
    
        /**
         * 删除所有cookies
         */
        public void removeAllCookies() {
            try {
                // 在上下文中创建单个CookieSyncManager
                CookieSyncManager.createInstance(BaseApplication.getInstance());
                // 获取单例CookieManager实例
                CookieManager cookieManager = CookieManager.getInstance();
                // 设置应用程序的WebView实例是否应发送和接受cookie
                cookieManager.setAcceptCookie(true);
                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
                    // 删除所有会话cookie
                    cookieManager.removeSessionCookie();
                    // 此方法在API级别21中已弃用.WebView会自动处理删除过期的Cookie。
                    cookieManager.removeExpiredCookie();
                    // 删除所有cookie
                    cookieManager.removeAllCookie();
                    // 确保当前可通过getCookie API访问的所有cookie都写入持久存储
                    CookieSyncManager.getInstance().sync();
                } else {
                    // 删除所有会话cookie
                    cookieManager.removeSessionCookies(null);
                    // 删除所有cookie
                    cookieManager.removeAllCookies(null);
                    // 确保当前可通过getCookie API访问的所有cookie都写入持久存储
                    cookieManager.flush();
                }
                mPersistentCookieStore.removeAll();
            } catch (Exception ex) {
            }
        }
    
    }

     

    2.PersistentCookieStore 类

    import android.content.Context;
    import android.content.SharedPreferences;
    import android.text.TextUtils;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Locale;
    import java.util.Map;
    import java.util.concurrent.ConcurrentHashMap;
    import okhttp3.Cookie;
    import okhttp3.HttpUrl;
    
    public class PersistentCookieStore implements CookieStore {
    
        private static final String COOKIE_NAME_PREFIX = "cookie_";
        private static final String COOKIE_PREFS = "CookiePrefsProjectName";
    
        private final SharedPreferences cookiePrefs;
        private final HashMap<String, ConcurrentHashMap<String, Cookie>> cookies;
    
        /**
         * Construct a persistent cookie store.
         *
         * @param context Context to attach cookie store to
         */
        public PersistentCookieStore(Context context) {
            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();
            for (Map.Entry<String, ?> entry : prefsMap.entrySet()) {
                if ((entry.getValue()) != null && !((String) entry.getValue()).startsWith(COOKIE_NAME_PREFIX)) {
                    String[] cookieNames = TextUtils.split((String) entry.getValue(), ",");
                    for (String name : cookieNames) {
                        String encodedCookie = cookiePrefs.getString(COOKIE_NAME_PREFIX + name, null);
                        if (encodedCookie != null) {
                            Cookie decodedCookie = decodeCookie(encodedCookie);
                            if (decodedCookie != null) {
                                if (!cookies.containsKey(entry.getKey()))
                                    cookies.put(entry.getKey(), new ConcurrentHashMap<String, Cookie>());
                                cookies.get(entry.getKey()).put(name, decodedCookie);
                            }
                        }
                    }
    
                }
            }
        }
    
        private static boolean isCookieExpired(Cookie cookie) {
            return cookie.expiresAt() < System.currentTimeMillis();
        }
    
        protected void add(HttpUrl uri, Cookie cookie) {
            String name = getCookieToken(cookie);
            boolean hasExpired = cookie.persistent() ? isCookieExpired(cookie) : false;
            if (!hasExpired) {
                if (!cookies.containsKey(uri.host())) {
                    cookies.put(uri.host(), new ConcurrentHashMap<String, Cookie>());
                }
                cookies.get(uri.host()).put(name, cookie);
            } else {
                if (cookies.containsKey(uri.host())) {
                    cookies.get(uri.host()).remove(name);
                } else {
                    return;
                }
            }
    
            // Save cookie into persistent store
            SharedPreferences.Editor prefsWriter = cookiePrefs.edit();
            prefsWriter.putString(uri.host(), TextUtils.join(",", cookies.get(uri.host()).keySet()));
            prefsWriter.putString(COOKIE_NAME_PREFIX + name, encodeCookie(new SerializableHttpCookie(cookie)));
            prefsWriter.apply();
        }
    
        protected String getCookieToken(Cookie cookie) {
            return cookie.name() + cookie.domain();
        }
    
        @Override
        public void add(HttpUrl uri, List<Cookie> cookies) {
            for (Cookie cookie : cookies) {
                add(uri, cookie);
            }
        }
    
        @Override
        public List<Cookie> get(HttpUrl uri) {
            ArrayList<Cookie> ret = new ArrayList<Cookie>();
            for (Map.Entry<String, ConcurrentHashMap<String, Cookie>> entry : cookies.entrySet()) {
                Collection<Cookie> cookies = this.cookies.get(entry.getKey()).values();
                for (Cookie cookie : cookies) {
                    if (cookie.matches(uri)) {
                        if (isCookieExpired(cookie)) {
                            remove(uri, cookie);
                        } else {
                            ret.add(cookie);
                        }
                    }
                }
            }
            return ret;
        }
    
        @Override
        public boolean removeAll() {
            SharedPreferences.Editor prefsWriter = cookiePrefs.edit();
            prefsWriter.clear();
            prefsWriter.apply();
            cookies.clear();
            return true;
        }
    
    
        @Override
        public boolean remove(HttpUrl uri, Cookie cookie) {
            String name = getCookieToken(cookie);
    
            if (cookies.containsKey(uri.host()) && cookies.get(uri.host()).containsKey(name)) {
                cookies.get(uri.host()).remove(name);
    
                SharedPreferences.Editor prefsWriter = cookiePrefs.edit();
                if (cookiePrefs.contains(COOKIE_NAME_PREFIX + name)) {
                    prefsWriter.remove(COOKIE_NAME_PREFIX + name);
                }
                prefsWriter.putString(uri.host(), TextUtils.join(",", cookies.get(uri.host()).keySet()));
                prefsWriter.apply();
    
                return true;
            } else {
                return false;
            }
        }
    
        protected String encodeCookie(SerializableHttpCookie cookie) {
            if (cookie == null)
                return null;
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            try {
                ObjectOutputStream outputStream = new ObjectOutputStream(os);
                outputStream.writeObject(cookie);
            } catch (IOException e) {
                return null;
            }
            return byteArrayToHexString(os.toByteArray());
        }
    
        protected Cookie decodeCookie(String cookieString) {
            byte[] bytes = hexStringToByteArray(cookieString);
            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
            Cookie cookie = null;
            try {
                ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
                cookie = ((SerializableHttpCookie) objectInputStream.readObject()).getCookie();
            } catch (IOException e) {
            } catch (ClassNotFoundException e) {
            }
            return cookie;
        }
    
        /**
         * Using some super basic byte array &lt;-&gt; hex conversions so we don't have to rely on any
         * large Base64 libraries. Can be overridden if you like!
         *
         * @param bytes byte array to be converted
         * @return string containing hex values
         */
        protected String byteArrayToHexString(byte[] bytes) {
            StringBuilder sb = new StringBuilder(bytes.length * 2);
            for (byte element : bytes) {
                int v = element & 0xff;
                if (v < 16) {
                    sb.append('0');
                }
                sb.append(Integer.toHexString(v));
            }
            return sb.toString().toUpperCase(Locale.US);
        }
    
        /**
         * Converts hex values from strings to byte arra
         *
         * @param hexString string of hex-encoded values
         * @return decoded byte array
         */
        protected byte[] hexStringToByteArray(String hexString) {
            int len = hexString.length();
            byte[] data = new byte[len / 2];
            for (int i = 0; i < len; i += 2) {
                data[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4) + Character.digit(hexString.charAt(i + 1), 16));
            }
            return data;
        }
    
    }

     

    3.SerializableHttpCookie类 

    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    import okhttp3.Cookie;
    
    public class SerializableHttpCookie implements Serializable {
    
        private transient final Cookie cookie;
        private transient Cookie clientCookie;
    
        public SerializableHttpCookie(Cookie cookie) {
            this.cookie = cookie;
        }
    
        public Cookie getCookie() {
            Cookie bestCookie = cookie;
            if (clientCookie != null) {
                bestCookie = clientCookie;
            }
            return bestCookie;
        }
    
        private void writeObject(ObjectOutputStream out) throws IOException {
            out.writeObject(cookie.name());
            out.writeObject(cookie.value());
            out.writeLong(cookie.expiresAt());
            out.writeObject(cookie.domain());
            out.writeObject(cookie.path());
            out.writeBoolean(cookie.secure());
            out.writeBoolean(cookie.httpOnly());
            out.writeBoolean(cookie.hostOnly());
            out.writeBoolean(cookie.persistent());
        }
    
        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
            String name = (String) in.readObject();
            String value = (String) in.readObject();
            long expiresAt = in.readLong();
            String domain = (String) in.readObject();
            String path = (String) in.readObject();
            boolean secure = in.readBoolean();
            boolean httpOnly = in.readBoolean();
            boolean hostOnly = in.readBoolean();
            boolean persistent = in.readBoolean();
            Cookie.Builder builder = new Cookie.Builder();
            builder = builder.name(name);
            builder = builder.value(value);
            builder = builder.expiresAt(expiresAt);
            builder = hostOnly ? builder.hostOnlyDomain(domain) : builder.domain(domain);
            builder = builder.path(path);
            builder = secure ? builder.secure() : builder;
            builder = httpOnly ? builder.httpOnly() : builder;
            clientCookie = builder.build();
        }
    
    }

     

    4.okHttp中cookie的实现

    OkHttpClient.Builder builder = new OkHttpClient.Builder();
    CookieJarImpl cookieJarImpl = new CookieJarImpl(new PersistentCookieStore(context));
    builder.cookieJar(cookieJarImpl);
    OkHttpClient okHttpClient = builder.build();

     

    5. CookieJarImpl的实现

    import java.util.List;
    
    import okhttp3.Cookie;
    import okhttp3.CookieJar;
    import okhttp3.HttpUrl;
    
    public class CookieJarImpl implements CookieJar {
    
        private CookieStore cookieStore;
    
        public CookieJarImpl(CookieStore cookieStore) {
            if (cookieStore == null) new IllegalArgumentException("cookieStore can not be null.");
            this.cookieStore = cookieStore;
        }
    
        /**
         * 服务端给客户端发送Cookie时调用
         *
         * @param url
         * @param cookies
         */
        @Override
        public synchronized void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
            cookieStore.add(url, cookies);
        }
    
        /**
         * 当访问到某个域名时,会通过此方法获取保存的Cookie,并且发送给服务器
         *
         * @param url
         * @return
         */
        @Override
        public synchronized List<Cookie> loadForRequest(HttpUrl url) {
            return cookieStore.get(url);
        }
    
    }
    

     

     6.CookieStore接口

    import java.util.List;
    
    import okhttp3.Cookie;
    import okhttp3.HttpUrl;
    
    public interface CookieStore {
    
        void add(HttpUrl uri, List<Cookie> cookie);
    
        List<Cookie> get(HttpUrl uri);
    
        boolean remove(HttpUrl uri, Cookie cookie);
    
        boolean removeAll();
    
    }

     

    okHttp依赖配置(app/build.gradle)

    implementation 'com.squareup.okio:okio:1.14.0'
    implementation 'com.squareup.okhttp3:okhttp:3.11.0'

     

    展开全文
  • iOS WebView设置Cookie

    千次阅读 2018-09-06 17:52:49
    NSDictionary*properties = [[NSMutableDictionary alloc] init];...[self.webview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://xxx.xxx.com/xxx/xxx/xxx"]]];  
    NSDictionary*properties = [[NSMutableDictionary alloc] init];
    [propertiessetValue:@"cokerttyttt" forKey:NSHTTPCookieValue];//value值
    [propertiessetValue:@"token" forKey:NSHTTPCookieName];//kay
    [propertiessetValue:[[NSURL URLWithString:@"http://xxx.xxx.com/xxx/xxx/xxx"] host] forKey:NSHTTPCookieDomain];
    [propertiessetValue:[[NSURL URLWithString:@"http://xxx.xxx.com/xxx/xxx/xxx"] path] forKey:NSHTTPCookiePath];
    [propertiessetValue:[NSDate dateWithTimeIntervalSinceNow:60*60] forKey:NSHTTPCookieExpires];
    NSHTTPCookie*cookie = [[NSHTTPCookie alloc] initWithProperties:properties];
    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
    [self.webview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://xxx.xxx.com/xxx/xxx/xxx"]]];

     

    展开全文
  • 主要介绍了Android中webView加载H5绑定cookie实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • Android WebView设置Cookie

    千次阅读 2020-05-11 08:24:06
    Android WebView设置Cookie 场景 最近公司项目需求,要求H5可以直接通过cookie得到相关信息 业务场景1: 网页登录:记录用户登录信息,下次进去不需要重复登录 业务场景2: 获取相关参数信息,比如...

    Android WebView设置Cookie

     

    场景

    最近公司项目需求,要求H5可以直接通过cookie得到相关信息

    • 业务场景1:

      网页登录:记录用户登录信息,下次进去不需要重复登录

    • 业务场景2:

      获取相关参数信息,比如:app版本号等信息

    HTTP Cookie管理机制

    实现Cookie参数注入,先来了解一下相关的配置

    1、domain(host)

    表示cookie所在的域,默认为请求地址

    例如:www.zyb.com/test/index.php

    domian默认为: www.zyb.com

    这里还有跨域问题: 域A: test1.zyb.com 域B: test2.zyb.com

    那么在域A生产一个可以使域A和域B都能访问的Cookie,就需要将Cookie的domain设置为.zyb.com;

    如果要在域A生产一个令域A不能访问而域能访问的Cookie 就要将Cookie设置为test2.zyb.com。

    2、path

    表示cookie所在的目录,定义服务器上的路径,默认为/,即根目录。

    同一服务器上的目录有/test/,/test/aa/,/test/bb/,现设一个cookie1的path为/test/,cookie2的path为/test/aa/,那么test下的所有页面都可以访问到cookie1,而/test/、/test/bb/的子页面不能访问cookie2,只有/test/aa/的子页面可以访问cookie2。

    这是因为cookie只允许其path路径下的页面访问。

    因此一般如果访问一级域名,只需要将path设置为根目录就可以。

    3、Set-Cookie响应头格式

    Set-Cookie: <name>=<value>[; <name>=<value>]...
       [; expires=<date>][; domain=<domain_name>]
       [; path=<some_path>][; secure][; httponly]
    

    如果出现Cookie偶尔失效是什么原因呢?

    只有cookie的domainpath与请求的URL匹配,这个cookie才是有效的。替换cookie时,要保证替换的Cookie具有相同的 host 、 pathname

    Cookie 默认保存位置

    如果项目中使用WebView,自动将Cookie保存在本地数据库中。保存位置:data/data/package_name/app_WebView/Cookies.db

    Cookie保存位置

    cookie内容

    如何设置

    • 针对项目中 一级域名 设置cookie
    /**
     * 同步cookie
     *
     * @param url 地址
     * @param cookieList 需要添加的Cookie值,以键值对的方式:key=value
     */
    private void syncCookie (String url, ArrayList<String> cookieList) {
        CookieSyncManager.createInstance(context);
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptCookie(true);
        if (cookieList != null && cookieList.size() > 0) {
            for (String cookie : cookieList) {
                    cookieManager.setCookie(url, cookie);
            }
        }
        cookieManager.setCookie(url, "Domain="+url);
        cookieManager.setCookie(url, "Path=/");
        String cookies = cookieManager.getCookie(url);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            cookieManager.flush();
        } else {
            CookieSyncManager.getInstance().sync();
        }
    }
    

    这里的url指的是一级域名,比如:.zyb.com

    • 自定义Cookie值
    private static DOMAIN = ".zyb.com"
    private void setAppInfoCookies () {
        ArrayList<String> cookieList = new ArrayList<>();
        cookieList.add("site=android");
        cookieList.add("wak_version=" + getAppVersion);
        syncCookie(DOMAIN, cookieList);
    }
    
    • 相关参数说明

    CookieSyncManager 是个过时的类,Api21 中 WebView 可以自动同步。

    CookieSyncManager.getInstance().sync(); 方法的替代方法是 cookieManager.flush();

    注意: 如果更新Cookie,只有host、name、path都相同时才会更新成功,否则只会在数据库中新添加。

    Cookie的过期机制

    可以设置Cookie的生效时间字段名为: expires 或 max-age

    expires:过期的时间点
    
    max-age:生效的持续时间,单位为秒。
    
    1. 若将Cookie的 max-age 设置为负数,或者 expires 字段设置为过期时间点,数据库更新后这条Cookie将从数据库中被删除。
    2. 如果将Cookie的 max-age 和 expires 字段设置为正常的过期日期,则到期后再数据库更新时会删除该条数据。

    JS获取Cookies

    function getCookie(cookie_name) {
            //获取所有的cookie
            var allcookies = document.cookie;
            //索引长度,开始索引的位置
            var cookie_pos = allcookies.indexOf(cookie_name);
    
            // 如果找到了索引,就代表cookie存在,否则不存在
            if (cookie_pos != -1) {
                // 把cookie_pos放在值的开始,只要给值加1即可
                //计算取cookie值得开始索引,加的1为“=”
                cookie_pos = cookie_pos + cookie_name.length + 1; 
                //计算取cookie值得结束索引
                var cookie_end = allcookies.indexOf(";", cookie_pos);
                
                if (cookie_end == -1) {
                    cookie_end = allcookies.length;
                }
                //得到想要的cookie的值
                var value = unescape(allcookies.substring(cookie_pos, cookie_end)); 
            }
            return value;
    }
    

    最后,希望此篇博客对大家有所帮助,欢迎提出问题及建议共同探讨,如有兴趣可以关注我的博客,谢谢!

    展开全文
  • app主页的页面都是web开发的,只有登录页是原生的,这就需要Android在调用了登录接口并成功后,把登录信息作为cookie存起来。 网上有存cookie的方法: public void cookie(Context context,String url,String ...
  • cookie的避免重复登录问题
  • ) 百度进行转码之后呢,他自己是会带一些cookie进去的。如果想将自己的cookie绑定到其中的话。需要明白: 1.cookie是绑定在一个domain下的。 2,公司的domain在百度转码之后是会产生跳转的,一般会变成一个wap.**
  • Android WebView获取cookie

    万次阅读 2017-09-04 17:19:38
    重写WebViewClient方法 public class MyWebViewClient extends WebViewClient { ... public boolean shouldOverrideUrlLoading(WebView webview, String url) { webview.loadUrl(url); return true;
  • 在微信WebView下的页面中登录后,关闭WebView返回后再次进入页面,发现登录态还存在,原因是微信不会主动清除cookie以及其他的缓存。 期望是关闭窗口后会清除cookie,重新进入页面过程中引导登录。在浏览器下cookie...
  • Android中WebView加载网页,有时候需要通过cookie向网页传递信息,如免登录保存登录状态等 设置cookie 在调用loadUrl(url);前一句调用以下synCookies()方法进行 Cookie 同步操作。 /** * 给WebView同步Cookie ...
  • Android webView 获取、设置 cookie的方法

    千次阅读 2019-03-30 23:19:53
    做android项目难免遇到这种情况,需使用webview加载网页,并且获取cookie。或者需要设置自己的请求cookie正常加载网页。下面分别介绍一下android 中 webview的使用方法。 1.获取url中的cookie: 方法一:我们...
  • WebViewcookie机制 】轻松搞定WebView cookie同步问题

    万次阅读 多人点赞 2016-05-31 22:46:21
    这种情况在Android开发中比较常见,因为Android不会自动同步cookieWebView。做iOS开发则不用担心这个问题,因为iOS内部已经实现了cookie同步。本文将会介绍两种cookie同步的方式,并重点分析Web
  • webview里面的网页做了登录功能, 登录后保存cookie, 但是一刷新页面cookie就丢了, 请问有人碰到吗?
  • WebView 保存HttpResponse 中的Cookie
  • Android WebView 注入Cookie

    万次阅读 2021-10-28 09:58:53
    WebView怎么注入Cookie呢? /** * 注入Cookie * * @param url WebView 需要打开的链接 */ void injectionCookie(String url) { try { String StringCookie; if (........) {//未登录清空Cook
  • Android WebView设置cookie

    千次阅读 2019-10-28 17:43:21
    问题:原生登录之后将cookie存起来,在 WebView.loadUrl("");之前设置cookie,针对每个项目cookie它的格式都不相同。 如果你不知道你们url的cookie格式的话,你可以将url复制到pc端的浏览器中,打开开发者模式如....
  • * 给WebView同步Cookie * * @param context 上下文 * @param url 可以使用[domain][host] */ private void syncCookie(Context context, String url) { CookieSyncManager.createInstance(context); CookieM...
  • 问题描述:因为需要在app里加入html,所以使用了webView,但是第一次进入webview...入下的方法是通过设置cookie来解决在 webView.loadUrl(url) 前加入如下代码String cookieString = "cookie_name=cookie_value; path=/
  • webView设置cookie

    千次阅读 2016-06-14 11:39:59
    公司的项目中采用原生加上H5的方式进来开发,遇到的第一个个问题就是给我们的webview设置cookie保存状态。就是将token保存到cookie中去。代码如下: 加载url @Override public void loadUrl() { String index_url ...
  • iOS Cookie WebView 自动登录
  • webview添加cookie有时失效

    千次阅读 2014-07-11 19:09:46
    Passing cookie to webview In few following lines I will describe my solution, how to pass cookies from DefaultHttpClient to WebView component. I was following many tutorials, but cookies weren...
  • Android中的Cookies和WebView缓存

    千次阅读 2016-12-16 09:18:12
    原来以为两个是一样的概念,后来做需求发现不是的,webview不加载缓存时,却加载了用户信息记录,后来发现是没有清除cookies。 一、清除cookie public static void clearCookies(Context context) { @...
  • 原生登录cookie保持提供webview使用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,770
精华内容 2,708
关键字:

cookiewebview