我知道这个问题已被问过一百次了,我现在已经阅读并尝试了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时? : - (
有什么建议吗?
答案 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请求中设置此Cookieif (cookie != null)
con.setRequestProperty("cookie", cookie);
其中con为HttpURLConnection con;
因此您可以在HttpGet
。
答案 1 :(得分:0)
你可能已经找到了答案,因为这是一个很晚的答案。但是,以防万一...
试试这个。从WebView检索cookie时,只需在域名中使用example.com
即可。在BasicClientCookie
中设置Cookie并设置域名时,请将域名设置为.example.com
。注意“。”在一开始的时候。现在,我认为会话应该适用于您应用程序中的所有子域。