1

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

我正在尝试创建一个简单的网络浏览器,因此有一个网络视图,我可以在其中登录网站并访问图片区域。在 DefaultHttpClient 的帮助下,我希望能够在安全区域下载图片。因此,我试图从 webview 共享 cookie 并将它们传递给 HttpClient,以便它经过身份验证并能够下载。但是无论我尝试做什么,我总是会得到 403 响应...

基本上步骤如下:

1)输入URL,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)

--> 永远不会发生,总是得到 403

.) 问题之一是 webview 为主机 * www 保存了一些 cookie。*example.com,但要下载的图像 URL (params[0]) 是 *静态的。*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,但它永远无法下载图像。我完全迷失了......虽然我猜它要么与 cookie 域有关,要么我仍然缺少其他 cookie。

但是,当我必须指定特定的 URL 来获取 cookie 时,我应该从哪里知道 web 视图中存在哪些 cookie?:-(

有什么建议吗?

4

2 回答 2

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,你将使用 params[ 1 ],

3)在你的 http 请求中设置这个 cookie -

if (cookie != null)
    con.setRequestProperty("cookie", cookie);

con在哪里HttpURLConnection con;

因此您可以根据需要设置它,在HttpGet.

于 2013-07-24T10:07:11.860 回答
0

您可能已经想出了答案,因为这是一个很晚的答案。但是,以防万一……

尝试这个。当您从 WebView 检索 cookie 时,只需example.com在域名中使用。在设置cookieBasicClientCookie和设置域时,将域名设置为.example.com. 注意“。” 在一开始的时候。现在,我认为会话应该在您的应用程序中的所有子域中工作。

于 2013-01-22T00:16:13.263 回答