从WebView到HttpClient共享cookie /会话不起作用

时间:2012-08-29 21:35:33

标签: android cookies webview httpclient share

我知道这个问题已被问过一百次了,我现在已经阅读并尝试了2个小时,但我找不到我的错误: - (

我正在尝试创建一个简单的webbrowser,因此有一个webview,我在网站上登录并访问图片区域。借助DefaultHttpClient,我希望能够在安全区域下载图片。 因此,我试图从webview共享cookie并将它们传递给HttpClient,以便它经过身份验证并能够下载。但无论我尝试做什么,我都会得到403回复......

基本上步骤如下:

1)输入网址,webview加载网站

2)以表格

输入登录详细信息

3)导航到图片并长按上下文菜单

4)检索图像URL并将其传递给AsynTask进行下载

以下是带有Cookie内容的AsyncTask的代码:

protected String doInBackground(String... params) {

//params[0] is the URL of the image

            try
            {

                CookieManager cookieManager = CookieManager.getInstance();

                String c = cookieManager.getCookie(new URL(params[0]).getHost());               

                BasicCookieStore cookieStore = new BasicCookieStore();
                BasicHttpContext localContext = new BasicHttpContext();
                localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
                String[] cookieParts = null; 
                String cookies[] = null;

                cookies = c.split(";");

                for(int i=0;i<cookies.length;i++)
                {                   
                    cookieParts = cookies[i].split("=");
                    BasicClientCookie sessionCookie = new BasicClientCookie(cookieParts[0].trim(), cookieParts[1].trim());
                    sessionCookie.setDomain(new URL(params[0]).getHost());

                    cookieStore.addCookie(sessionCookie);                   
                }


                DefaultHttpClient httpClient = new DefaultHttpClient();

                httpClient.setCookieStore(cookieStore);

                HttpGet pageGet = new HttpGet(new URL(params[0]).toURI());


                HttpResponse response = httpClient.execute(pageGet, localContext);
                if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK)

- &GT;永远不会发生,总是得到403

。)其中一个问题是webview为主机* www。 * example.com保存了一些cookie,但要下载的图像URL(params [0])是* < EM>静态的。 * example.com。这条线 cookieManager.getCookie(new URL(params[0]).getHost()); 返回null,因为static.example.com没有cookie,但仅适用于www.example.com。

。)当我手动说出cookieManager.getCookie(“www.example.com”);我收到了一些cookie,我将其添加到HttpClient cookie商店: 添加了5个cookie - testcookie = 0 - PHPSESSID = 320947238someGibberishSessionId - email = my@email.net - pass = 32423te32someEncodedPassGibberish - user = 345542

因此,虽然这些cookie,会话ID和其他内容被添加到HttpClient,但它永远无法下载图像。我完全迷失了......虽然我猜它或者与cookies域有关,或者我还在遗漏其他cookie。

但是我应该知道webview中存在哪些cookie,当我必须指定一个特定的URL来获取cookie时? : - (

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

我想我们在上面的片段中已经太复杂了。 使用这些简单的步骤 -

1)从webView中检索cookie - 无论您的webview是什么,请使用此代码重新

String cookie = CookieManager.getInstance().getCookie(
                        url.toString());
                Log.d("mytcs", "cookie downloadlistner " + cookie);

2)使用参数 -

在下载asyncTask时传递此信息
downloadImageTask = new DownloadImage();
                    downloadPDFTask.execute(url, cookie);

(我假设您知道要在asyncTask中检索此Cookie,您将使用参数[ 1 ],

3)使用 -

在您的http请求中设置此Cookie
if (cookie != null)
    con.setRequestProperty("cookie", cookie);

其中con为HttpURLConnection con;

因此您可以在HttpGet

中根据需要进行设置

答案 1 :(得分:0)

你可能已经找到了答案,因为这是一个很晚的答案。但是,以防万一...

试试这个。从WebView检索cookie时,只需在域名中使用example.com即可。在BasicClientCookie中设置Cookie并设置域名时,请将域名设置为.example.com。注意“。”在一开始的时候。现在,我认为会话应该适用于您应用程序中的所有子域。