`

Webkit--Cookies分析篇

阅读更多
最近对android的webkit的cookies进行学习,下面是我的简单总结:
1,CookiesManager.java-->CookiesSyncManager.java-->WebviewDatabases.java
CookiesManager.java是对cookies的总体管理,它会调用CookiesSyncManager将Ram里面的Cookies存入到databases.所以CookiesSyncManager是对将cookies同步到database的管理,而WebviewDatabases里面的Webview.db的cookies表是对cookies的存储。

2,CookiesSyncManager.java-->WebSyncManager.java
CookiesSyncManager里面正在维护cookies从ram到databases的是WebSyncManager来做的,这里面是开一个thread来维护。

3,JWebCoreJavaBridge.java-->CookiesSyncManager.java
CookiesManager是对cookies的总体管理,那ram的cookies首先是这里传递给CookiesSyncManager的。那个CookiesManager的ram cookies又是从何处得来的呢?那就是从JWebCoreJavaBridge得到的。
    private void setCookies(String url, String docUrl, String value) {
        if (value.contains("\r") || value.contains("\n")) {
            // for security reason, filter out '\r' and '\n' from the cookie
            int size = value.length();
            StringBuilder buffer = new StringBuilder(size);
            int i = 0;
            while (i != -1 && i < size) {
                int ir = value.indexOf('\r', i);
                int in = value.indexOf('\n', i);
                int newi = (ir == -1) ? in : (in == -1 ? ir : (ir < in ? ir
                        : in));
                if (newi > i) {
                    buffer.append(value.subSequence(i, newi));
                } else if (newi == -1) {
                    buffer.append(value.subSequence(i, size));
                    break;
                }
                i = newi + 1;
            }
            value = buffer.toString();
        }
        CookieManager.getInstance().setCookie(url, value);
    }


CookieManager.getInstance().setCookie(url, value);

4,JavaBridge.cpp-->JWebCoreJavaBridge.java
JWebCoreJavaBridge的cookies是从JavaBridge.cpp得来的
void
JavaBridge::setCookies(WebCore::KURL const& url, WebCore::KURL const& docUrl, WebCore::String const& value)
{
    JNIEnv* env = JSC::Bindings::getJNIEnv();
    const WebCore::String& urlStr = url.string();
    jstring jUrlStr = env->NewString(urlStr.characters(), urlStr.length());
    const WebCore::String& docUrlStr = docUrl.string();
    jstring jDocUrlStr = env->NewString(docUrlStr.characters(), docUrlStr.length());
    jstring jValueStr = env->NewString(value.characters(), value.length());

    AutoJObject obj = getRealObject(env, mJavaObject);
    env->CallVoidMethod(obj.get(), mSetCookies, jUrlStr, jDocUrlStr, jValueStr);
    env->DeleteLocalRef(jUrlStr);
    env->DeleteLocalRef(jDocUrlStr);
    env->DeleteLocalRef(jValueStr);
}


mSetCookies = env->GetMethodID(clazz, "setCookies", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
env->CallVoidMethod(obj.get(), mSetCookies, jUrlStr, jDocUrlStr, jValueStr);


5,CookieClient.h-->JavaBridge.cpp
JavaBridger.cpp是继承CookiesClient
6,Cookies.cpp-->CookiesClien.h

就分析到这里,就没往下追了,有空我继续分析。

分享到:
评论
8 楼 junux 2011-09-29  
追求幸福 写道

看来你的需求很复杂啊!webkit是通过database来维护cookies的。而httpclient和HttpURLConnection好像是通过特定的api :getCookieStore().getCookies();来获取Cookie。这些是我目前了解到的。呵呵...


谢谢博主!我的问题还得去解决。。。。
7 楼 追求幸福 2011-09-13  
junux 写道
追求幸福 写道
junux 写道
请问博主,有什么办法能够获取所有的cookie吗? 需要在哪些地方修改呢?

Hi Junux, 我很久没有研究这方面的东西了。用public String getCookie (String url)这个api不可以吗?若不可以的话,你就需要在framework增加需要你的function了,我建议你去看CookieManager.java, CookieSyncManager.java和WebViewDatabase.java对它们进行修改就可以了。


利用getCookie()可以获得当前应用(比如我写了一个应用,登陆开心网)的cookies,但我是想将所有应用(包括浏览器)的cookie都抓起来,也就是要跨应用。而且我还要一起抓取用户上网的URL、domain等信息,只修改CookieManager.java似乎不够。当然抓取Cookies是比较难的一点。
还有应用上网可以通过webview控件、httpclient或HttpURLConnection方式上网,这部分代码有点理不清楚,所以想请指点一下。


看来你的需求很复杂啊!webkit是通过database来维护cookies的。而httpclient和HttpURLConnection好像是通过特定的api :getCookieStore().getCookies();来获取Cookie。这些是我目前了解到的。呵呵...
6 楼 junux 2011-09-13  
追求幸福 写道
junux 写道
请问博主,有什么办法能够获取所有的cookie吗? 需要在哪些地方修改呢?

Hi Junux, 我很久没有研究这方面的东西了。用public String getCookie (String url)这个api不可以吗?若不可以的话,你就需要在framework增加需要你的function了,我建议你去看CookieManager.java, CookieSyncManager.java和WebViewDatabase.java对它们进行修改就可以了。


利用getCookie()可以获得当前应用(比如我写了一个应用,登陆开心网)的cookies,但我是想将所有应用(包括浏览器)的cookie都抓起来,也就是要跨应用。而且我还要一起抓取用户上网的URL、domain等信息,只修改CookieManager.java似乎不够。当然抓取Cookies是比较难的一点。
还有应用上网可以通过webview控件、httpclient或HttpURLConnection方式上网,这部分代码有点理不清楚,所以想请指点一下。
5 楼 追求幸福 2011-09-08  
junux 写道
请问博主,有什么办法能够获取所有的cookie吗? 需要在哪些地方修改呢?

Hi Junux, 我很久没有研究这方面的东西了。用public String getCookie (String url)这个api不可以吗?若不可以的话,你就需要在framework增加需要你的function了,我建议你去看CookieManager.java, CookieSyncManager.java和WebViewDatabase.java对它们进行修改就可以了。
4 楼 junux 2011-09-06  
请问博主,有什么办法能够获取所有的cookie吗? 需要在哪些地方修改呢?
3 楼 junux 2011-09-06  
太好了,我正入门,希望有更多分析。谢谢分享!
2 楼 追求幸福 2011-07-19  
4007qwer 写道
bbbbb

??????
1 楼 4007qwer 2011-07-18  
bbbbb

相关推荐

    Python代码源码-实操案例-框架案例-解决直接访问请求地址返回403错误的问题,.zip

    本篇将深入探讨如何使用Python来解决此类问题,通过实际操作案例和框架应用来提供解决方案。 首先,403错误可能由于多种原因产生,如浏览器cookies问题、服务器端的权限设置、使用了禁止的HTTP头、或者尝试访问的...

    网络爬虫-解决直接访问请求地址返回403错误的问题-Python实例源码.zip

    本篇将深入探讨如何解决这个问题。 首先,我们需要了解403错误的原因。常见的原因包括: 1. **缺少头部信息**:网站可能会检查请求头中的User-Agent,如果识别为爬虫,可能会禁止访问。 2. **IP被限制**:频繁的...

    互联网精准广告定向技术说明

    #### 一、基础知识篇 **1. Http Header之User-Agent** - **定义**: User-Agent(用户代理)是HTTP请求头部的一个字段,用于标识客户端软件的一些基本信息,如浏览器类型、操作系统等。这些信息有助于服务器识别...

    抓取速卖通商品信息完整源码

    本篇文章将详细讲解如何利用编程技术实现抓取速卖通商品信息的完整源码,帮助你掌握这一实用技能。 首先,我们需要了解速卖通的商品页面结构。速卖通是阿里巴巴集团旗下的全球B2C电商平台,其商品页面包含大量丰富...

    python爬虫请求—post

    Python爬虫技术是数据获取的重要手段,特别是在大数据时代,它被广泛应用于数据分析、网站信息抓取等领域。在Python中,`requests`库是进行HTTP请求的首选工具,它提供了简单易用的接口来发送GET、POST等不同类型的...

    用httpclient写的登录开心网

    x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"); httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded"); ``` 4. **设置请求体**:POST请求通常包含表单...

    Python常用模块之requests模块用法分析

    ### Python常用模块之requests模块用法分析 #### 概述 `requests`是Python中一个非常流行的库,用于处理HTTP请求。它简化了许多常见的HTTP任务,例如GET和POST请求,并且支持用户认证、自动解压等特性。这篇文章将...

    Python3使用requests登录人人影视网站的方法

    本篇文章将详细介绍如何使用Python中的`requests`库来实现对人人影视网站的自动登录过程,并完成相应的操作,如签到等。 #### 二、准备工作 在开始之前,请确保已经安装了Python环境以及`requests`库。如果尚未...

    Python3.4编程实现简单抓取爬虫功能示例

    本篇内容将围绕如何使用Python 3.4来实现一个简单的网页抓取爬虫进行详细介绍。 #### 一、概述 在介绍具体的代码实现之前,我们先了解一下网页抓取的基本概念和技术要点。 **1.1 网页抓取基础** 网页抓取是指从...

    学习python爬虫看一篇就足够了之爬取《太平洋汽车》论坛及点评实战爬虫大全

    WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36"} ``` 或使用`fake_useragent`库: ```python from fake_useragent import UserAgent ua = UserAgent() headers = {"User-...

Global site tag (gtag.js) - Google Analytics