首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

Webkit-Cookies分析篇

2012-08-31 
Webkit--Cookies分析篇最近对android的webkit的cookies进行学习,下面是我的简单总结:1,CookiesManager.jav

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得来的
voidJavaBridge::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

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

1 楼 4007qwer 2011-07-18   bbbbb 2 楼 追求幸福 2011-07-19   4007qwer 写道bbbbb
?????? 3 楼 junux 2011-09-06   太好了,我正入门,希望有更多分析。谢谢分享! 4 楼 junux 2011-09-06   请问博主,有什么办法能够获取所有的cookie吗? 需要在哪些地方修改呢? 5 楼 追求幸福 2011-09-08   junux 写道请问博主,有什么办法能够获取所有的cookie吗? 需要在哪些地方修改呢?
Hi Junux, 我很久没有研究这方面的东西了。用public String getCookie (String url)这个api不可以吗?若不可以的话,你就需要在framework增加需要你的function了,我建议你去看CookieManager.java, CookieSyncManager.java和WebViewDatabase.java对它们进行修改就可以了。 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方式上网,这部分代码有点理不清楚,所以想请指点一下。 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。这些是我目前了解到的。呵呵... 8 楼 junux 2011-09-29   追求幸福 写道
看来你的需求很复杂啊!webkit是通过database来维护cookies的。而httpclient和HttpURLConnection好像是通过特定的api :getCookieStore().getCookies();来获取Cookie。这些是我目前了解到的。呵呵...

谢谢博主!我的问题还得去解决。。。。

热点排行