使用HTTPUrlConnection时如何保留cookie?

发布于 2021-01-31 15:13:43

我已经开始使用推荐的广告,HTTPUrlConnection并从移走了DefaultHTTPClient。我无法重新粘合在一起的一件事是使用持久性Cookie存储。我想简单地将自定义cookie处理程序/管理器附加到我的连接中以存储cookie。Android文档并不是很有帮助,因为它将Cookie主题分为两行。

我以前使用过LoopJ PersistentCookieStore,效果很好。

关于如何在Android中设置可以附加到我的HTTPUrlConnection自动保存和检索cookie 的持久性cookie存储的想法?

谢谢

关注者
0
被浏览
63
1 个回答
  • 面试哥
    面试哥 2021-01-31
    为面试而生,有面试问题,就找面试哥。

    我花了几个小时,但我自己设法建立了一个自定义cookie存储。

    您必须通过执行以下操作来附加它:

    public class application extends Application {
        @Override
        public void onCreate() {
            super.onCreate();
           CookieManager cmrCookieMan = new CookieManager(new MyCookieStore(this.objContext), CookiePolicy.ACCEPT_ALL);
           CookieHandler.setDefault(cmrCookieMan);
           }
        }
    

    这是实际的存储空间:

    /*
     * This is a custom cookie storage for the application. This
     * will store all the cookies to the shared preferences so that it persists
     * across application restarts.
     */
    class MyCookieStore implements CookieStore {
    
        /*
         * The memory storage of the cookies
         */
        private Map<URI, List<HttpCookie>> mapCookies = new HashMap<URI, List<HttpCookie>>();
        /*
         * The instance of the shared preferences
         */
        private final SharedPreferences spePreferences;
    
        /*
         * @see java.net.CookieStore#add(java.net.URI, java.net.HttpCookie)
         */
        public void add(URI uri, HttpCookie cookie) {
    
            System.out.println("add");
            System.out.println(cookie.toString());
    
            List<HttpCookie> cookies = mapCookies.get(uri);
            if (cookies == null) {
                cookies = new ArrayList<HttpCookie>();
                mapCookies.put(uri, cookies);
            }
            cookies.add(cookie);
    
            Editor ediWriter = spePreferences.edit();
            HashSet<String> setCookies = new HashSet<String>();
            setCookies.add(cookie.toString());
            ediWriter.putStringSet(uri.toString(), spePreferences.getStringSet(uri.toString(), setCookies));
            ediWriter.commit();
    
        }
    
       /*
        * Constructor
        * 
        * @param  ctxContext the context of the Activity
        */
        @SuppressWarnings("unchecked")
        public MyCookieStore(Context ctxContext) {
    
            spePreferences = ctxContext.getSharedPreferences("CookiePrefsFile", 0);
            Map<String, ?> prefsMap = spePreferences.getAll();
    
            for(Map.Entry<String, ?> entry : prefsMap.entrySet()) {
    
                for (String strCookie : (HashSet<String>) entry.getValue()) {
    
                    if (!mapCookies.containsKey(entry.getKey())) {
    
                        List<HttpCookie> lstCookies = new ArrayList<HttpCookie>();
                        lstCookies.addAll(HttpCookie.parse(strCookie));
    
                        try {
    
                            mapCookies.put(new URI(entry.getKey()), lstCookies);
    
                        } catch (URISyntaxException e) {
    
                            e.printStackTrace();
    
                        }
    
                    } else {
    
                        List<HttpCookie> lstCookies = mapCookies.get(entry.getKey());
                        lstCookies.addAll(HttpCookie.parse(strCookie));
    
                        try {
    
                            mapCookies.put(new URI(entry.getKey()), lstCookies);
    
                        } catch (URISyntaxException e) {
    
                            e.printStackTrace();
    
                        }
    
                    }
    
                    System.out.println(entry.getKey() + ": " + strCookie);
    
                }
    
            }
    
        }
    
        /*
         * @see java.net.CookieStore#get(java.net.URI)
         */
        public List<HttpCookie> get(URI uri) {
    
            List<HttpCookie> lstCookies = mapCookies.get(uri);
    
            if (lstCookies == null)
                mapCookies.put(uri, new ArrayList<HttpCookie>());
    
            return mapCookies.get(uri);
    
        }
    
        /*
         * @see java.net.CookieStore#removeAll()
         */
        public boolean removeAll() {
    
            mapCookies.clear();
            return true;
    
        }
    
        /*
         * @see java.net.CookieStore#getCookies()
         */
        public List<HttpCookie> getCookies() {
    
            Collection<List<HttpCookie>> values = mapCookies.values();
    
            List<HttpCookie> result = new ArrayList<HttpCookie>();
            for (List<HttpCookie> value : values) {                
                result.addAll(value);                
            }
    
            return result;
    
        }
    
        /*
         * @see java.net.CookieStore#getURIs()
         */
        public List<URI> getURIs() {
    
            Set<URI> keys = mapCookies.keySet();
            return new ArrayList<URI>(keys);
    
        }
    
        /*
         * @see java.net.CookieStore#remove(java.net.URI, java.net.HttpCookie)
         */
        public boolean remove(URI uri, HttpCookie cookie) {
    
            List<HttpCookie> lstCookies = mapCookies.get(uri);
    
            if (lstCookies == null)
                return false;
    
            return lstCookies.remove(cookie);
    
        }
    
    }
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看