问题描述
我在Mac中使用JxBrowser v7.10,在持久保存它们时存在一些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决定如何从Web服务器下载cookie,如何从HTTP标头中提取cookie并将它们存储在本地文件系统(持久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`
解决方法
之所以会出现这种现象,是因为您没有使用用户数据目录配置Engine
实例。因此,每次创建一个新的Engine
实例时,都会创建一个临时目录,并在此初始化cookie存储。结果,所有先前创建的cookie将不再可用。
请访问https://jxbrowser-support.teamdev.com/docs/guides/engine.html#user-data-directory
中的指南该指南中的
用户数据目录
表示目录的绝对路径,在该目录中将存储诸如高速缓存,cookie,历史记录,GPU高速缓存,本地存储,访问的链接,Web数据,拼写检查字典文件等数据。例如:
Engine engine = Engine.newInstance(EngineOptions.newBuilder(...)
.userDataDir(Paths.get("/Users/Me/.jxbrowser"))
.build());
如果不提供用户数据目录路径,则JxBrowser将在用户的temp文件夹中创建并使用一个temp目录。
仅供参考:以防万一,我也将在Cookies指南中提及此信息。