Загрузка файла с помощью JavaScript Cookie в Java - PullRequest
0 голосов
/ 27 апреля 2019

Используя браузер, если я захожу на определенную прямую загрузку URL, он автоматически загружает файл.Однако, когда я использую код Java для загрузки файла, вместо содержимого файла я получаю код HTML:

<html>
<body>
<script type="text/javascript" src="/aes.js"></script>
<script>function toNumbers(d) {
    var e = [];
    d.replace(/(..)/g, function (d) {
        e.push(parseInt(d, 16))
    });
    return e
}

function toHex() {
    for (var d = [], d = 1 == arguments.length && arguments[0].constructor == Array ? arguments[0] : arguments, e = "", f = 0; f < d.length; f++) e += (16 > d[f] ? "0" : "") + d[f].toString(16);
    return e.toLowerCase()
}

var a = toNumbers("f655ba9d09a112d4968c63579db590b4"), b = toNumbers("98344c2eee86c3994890592585b49f80"),
    c = toNumbers("b5eb8dc5c53e5107faa7ec1c1f3e3dc7");
document.cookie = "__test=" + toHex(slowAES.decrypt(c, 2, a, b)) + "; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/";
location.href = "http://example.com/Test.txt?i=1";</script>
<noscript>This site requires Javascript to work, please enable Javascript in your browser or use a browser with
    Javascript support
</noscript>
</body>
</html>

Мой код загрузки файла, например, следующий:

URL url = new URL("...");
try (InputStream inputStream = url.openStream())
{
    Files.copy(inputStream, downloadedFilePath, REPLACE_EXISTING);
}

Как можно было бы загрузить файл программно в Java? Есть способы выполнить JavaScript, но как именно он должен работать?Похоже, document.cookie должен быть установлен (правильно) для загрузки.

1 Ответ

0 голосов
/ 30 апреля 2019

Загрузка выполняется путем передачи правильного значения cookie вместе с запросом.Значение cookie можно получить с помощью, например, Google Chrome DevTools -> Application -> Cookies.Так как в моем примере значение cookie не изменяется, код, подобный следующему, справился бы с задачей:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class DownloadWithCookieExample
{
    public static void main(String[] arguments)
    {
        try
        {
            URL url = new URL("...");
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestProperty("Cookie", "blabla"); // Hard-coded correct cookie value
            String readStream = readStream(con.getInputStream());
            System.out.println(readStream);
        } catch (Exception exception)
        {
            exception.printStackTrace();
        }
    }

    private static String readStream(InputStream inputStream) throws IOException
    {
        StringBuilder stringBuilder = new StringBuilder();
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)))
        {
            String line;
            while ((line = reader.readLine()) != null)
            {
                stringBuilder.append(line);
                stringBuilder.append(System.lineSeparator());
            }
        }
        return stringBuilder.toString().trim();
    }
}

Еще лучшим решением было бы выполнить JavaScript, чтобы получить значение cookie и передатьрезультат.Это задание оставлено в качестве упражнения для другого ответа для тех, кто знает, как сделать это элегантно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...