Как настроить JxBrowser на автоматическое сохранение файлов cookie и автоматическое их использование для входа на сайт?

#jxbrowser

#jxbrowser

Вопрос:

Я использую JxBrowser версии 7.10 на Mac, и у меня возникли некоторые проблемы с сохранением файлов cookie, и я автоматически использую их для автоматического входа на сайт при перезапуске приложения. Кажется, что файлы cookie каким-то образом не сохраняются.

Я искал и читал документацию в https://jxbrowser-support.teamdev.com/docs/guides/cookies.html#working-with-cookies
https://jxbrowser-support.teamdev.com/javadoc/7.2/com/teamdev/jxbrowser/cookie/CookieStore.html

и все же не удалось найти, как использовать файл cookie.

В документе упоминается «JxBrowser делегирует работу с файлами cookie движку Chromium. Chromium решает, как загружать файлы cookie с веб-сервера, извлекать их из заголовков HTTP и сохранять в локальной файловой системе (постоянные файлы cookie) или в памяти (сеансовые файлы cookie).»

Исходя из этого понимания, файл cookie должен автоматически сохраняться и иметь возможность использовать их при перезапуске приложения, но вместо этого мне нужно повторно входить в систему при каждом перезапуске приложения.

Ниже приведен тестовый код. Я должен иметь возможность войти в gmail, и jxbrowser автоматически сохранит файл cookie (кодирование не требуется) и автоматически запустит gmail при перезапуске, однако следующий код этого не делает.

Это то, что мне нужно сделать, чтобы реализовать это?

 import com.teamdev.jxbrowser.browser.Browser;
import com.teamdev.jxbrowser.engine.Engine;
import com.teamdev.jxbrowser.engine.EngineOptions;
import com.teamdev.jxbrowser.view.swing.BrowserView;

import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import static com.teamdev.jxbrowser.engine.RenderingMode.HARDWARE_ACCELERATED;

public final class CookieBrowser {

  public static void main(String[] args) {

    // Creating and running Chromium engine
    final Engine engine = Engine.newInstance(
      EngineOptions.newBuilder(HARDWARE_ACCELERATED).build());

    Browser browser = engine.newBrowser();
    // Loading the required web page
    browser.navigation().loadUrl("www.gmail.com");

    // No cookie printed out, why ?
    engine.cookieStore().cookies().forEach(System.out::println);

    SwingUtilities.invokeLater(() -> {
      // Creating Swing component for rendering web content
      // loaded in the given Browser instance
      BrowserView view = BrowserView.newInstance(browser);

      // Creating and displaying Swing app frame
      JFrame frame = new JFrame("JxBrowser AWT/Swing");
      // Closing the engine when app frame is about to close
      frame.addWindowListener(new WindowAdapter() {
        @Override
        public void windowClosing(WindowEvent e) {
          System.out.println("Cookie persist"); // but unable to use them automatically on restart
          engine.cookieStore().persist();
          engine.close();
        }
      });

      frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
      frame.add(view, BorderLayout.CENTER);
      frame.setSize(800, 600);
      frame.setVisible(true);
    });
  }
}`enter code here`
  

Комментарии:

1. Почему вы думаете, что предоставления требуемых постоянных / сеансовых файлов cookie достаточно, чтобы сообщить Google об автоматическом входе в систему? Даже если это правда, вы должны знать, какие файлы cookie следует установить. Чтобы распечатать файлы cookie, загрузите URL-адрес с помощью loadUrlAndWait().

2. Привет, Владимир, спасибо за ответ. Позвольте мне перефразировать это так. Как я могу заставить JxBrowser вести себя как стандартный браузер, при котором он может входить на сайты (не только gmail), если при перезапуске уже есть постоянный файл cookie. Таким образом, на стороне пользователя им не нужно знать, как обрабатывать файлы cookie, они просто включают cookie в браузере, и браузер позаботится об этом. Если JxBrowser ведет себя иначе, какой именно шаг мне нужно выполнить для автоматического входа в систему?

3. разве browsercontext недостаточно для достижения этого результата?

Ответ №1:

Вы получаете такое поведение, потому что вы не настраиваете Engine экземпляр с каталогом пользовательских данных. Итак, каждый раз, когда вы создаете новый Engine экземпляр, будет создан временный каталог, и в нем будет инициализировано хранилище файлов cookie. В результате все ранее созданные файлы cookie больше не будут доступны.

Пожалуйста, ознакомьтесь с руководством по адресу https://jxbrowser-support.teamdev.com/docs/guides/engine.html#user-data-directory

Из этого руководства:

Каталог пользовательских данных

Представляет абсолютный путь к каталогу, в котором хранятся такие данные, как кэш, файлы cookie, история, кэш графического процессора, локальное хранилище, посещенные ссылки, веб-данные, файлы словаря проверки орфографии и т. Д. Например:

 Engine engine = Engine.newInstance(EngineOptions.newBuilder(...)
        .userDataDir(Paths.get("/Users/Me/.jxbrowser"))
        .build());
  

Если вы не укажете путь к каталогу пользовательских данных, JxBrowser создаст и будет использовать временный каталог во временной папке пользователя.

К вашему сведению: на всякий случай я также упомяну эту информацию в руководстве по использованию файлов cookie.

Комментарии:

1. Привет, Владимир, я установил userDataDir и теперь это желаемое поведение работает. спасибо за решение.