我知道这个问题已经被问了一百次,我已经阅读并尝试了 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?:-(
有什么建议吗?