13

我正在使用 android DownloadManagerAPI 从我学校的服务器下载文件。我有权通过登录访问这些文件,但我无法弄清楚如何使用我DownloadManager.Request的下载代码提交 cookie。dm是一个全局的DownloadManager,并且url是一个 php 下载脚本,它重定向到一个文件,通常是 pdf/doc/etc。

dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
Request request = new Request(Uri.parse(url));
dm.enqueue(request);

Intent i = new Intent();
i.setAction(DownloadManager.ACTION_VIEW_DOWNLOADS);
startActivity(i);

这工作正常,但我下载了一个 html 文件,这是我学校网站的登录页面。显然我需要以某种方式提交用户的会话 cookie,但我在文档中看不到任何这样做的方法。

4

2 回答 2

26

Cookie 是通过 HTTP 标头(恰当地命名为“Cookie”)发送的,幸运的是,DownloadManager.Request具有添加您自己的标头的方法。

所以你想要做的是这样的:

Request request = new Request(Uri.parse(url)); 
request.addRequestHeader("Cookie", "contents");
dm.enqueue(request);

当然,您必须将“内容”替换为实际的 cookie 内容。CookieManager类对于获取站点的当前 cookie 应该很有用,但如果失败,另一种选择是让您的应用程序发出登录请求并获取返回的 cookie。

于 2012-06-07T21:51:42.100 回答
1

您可以使用 CookieManager 检索 cookie,如下所示(我使用 webview):

    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);

            String cookieString = CookieManager.getInstance().getCookie(url);

        }
    });

    //Enable Javascript
    webView.getSettings().setJavaScriptEnabled(true);
    //Clear All and load url
    webView.loadUrl(URL_TO_SERVE);

然后将其传递给 DownloadManager:

  //Create a DownloadManager.Request with all the information necessary to start the download
    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url))
            .setTitle("File")// Title of the Download Notification
            .setDescription("Downloading")// Description of the Download Notification
            .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE)// Visibility of the download Notification
            .setDestinationUri(Uri.fromFile(file))// Uri of the destination file
            .setAllowedOverMetered(true)// Set if download is allowed on Mobile network
            .setAllowedOverRoaming(true);
    request.addRequestHeader("cookie", cookieString);
    /*request.addRequestHeader("User-Agent", cookieString);*/
    DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
    downloadID = downloadManager.enqueue(request);// enqueue puts the download request in the queue.
于 2020-02-29T19:15:28.277 回答