清除 JavaFX WebView 中的 session/cache/cookie
Posted
技术标签:
【中文标题】清除 JavaFX WebView 中的 session/cache/cookie【英文标题】:Clear the session/cache/cookie in the JavaFX WebView 【发布时间】:2014-06-18 00:23:32 【问题描述】:我有一个 Swing 对话框,它使用 JavaFX WebView
显示来自 Google 服务器的 oAuth 2.0 URL。
public class SimpleSwingBrowser extends JDialog
private final JFXPanel jfxPanel = new JFXPanel();
private WebEngine engine;
private final JPanel panel = new JPanel(new BorderLayout());
public SimpleSwingBrowser()
super(MainFrame.getInstance(), JDialog.ModalityType.APPLICATION_MODAL);
initComponents();
private void initComponents()
createScene();
panel.add(jfxPanel, BorderLayout.CENTER);
getContentPane().add(panel);
java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-460)/2, (screenSize.height-680)/2, 460, 680);
private void createScene()
Platform.runLater(new Runnable()
@Override
public void run()
final WebView view = new WebView();
engine = view.getEngine();
engine.titleProperty().addListener(new ChangeListener<String>()
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, final String newValue)
SwingUtilities.invokeLater(new Runnable()
@Override
public void run()
SimpleSwingBrowser.this.setTitle(newValue);
);
);
engine.getLoadWorker()
.exceptionProperty()
.addListener(new ChangeListener<Throwable>()
public void changed(ObservableValue<? extends Throwable> o, Throwable old, final Throwable value)
if (engine.getLoadWorker().getState() == FAILED)
SwingUtilities.invokeLater(new Runnable()
@Override public void run()
JOptionPane.showMessageDialog(
panel,
(value != null) ?
engine.getLocation() + "\n" + value.getMessage() :
engine.getLocation() + "\nUnexpected error.",
"Loading error...",
JOptionPane.ERROR_MESSAGE);
);
);
// http://***.com/questions/11206942/how-to-hide-scrollbars-in-the-javafx-webview
// hide webview scrollbars whenever they appear.
view.getChildrenUnmodifiable().addListener(new ListChangeListener<Node>()
@Override
public void onChanged(Change<? extends Node> change)
Set<Node> deadSeaScrolls = view.lookupAll(".scroll-bar");
for (Node scroll : deadSeaScrolls)
scroll.setVisible(false);
);
jfxPanel.setScene(new Scene(view));
);
public void loadURL(final String url)
Platform.runLater(new Runnable()
@Override
public void run()
String tmp = toURL(url);
if (tmp == null)
tmp = toURL("http://" + url);
engine.load(tmp);
);
private static String toURL(String str)
try
return new URL(str).toExternalForm();
catch (MalformedURLException exception)
return null;
每次,我都会从 Google 获得以下 URL。我将使用SimpleSwingBrowser
来加载以下网址。
https://accounts.google.com/o/oauth2/auth?client_id=xxx&redirect_uri=http://localhost:55780/Callback&response_type=code&scope=email%20https://www.googleapis.com/auth/drive.appdata%20profile
在第一次期间,将显示以下 UI。
屏幕一
屏幕二
我之后
-
在第一个屏幕上执行成功登录。
与屏幕二一起呈现。
点击接受。
关闭网络浏览器对话框。
再次生成与第一次完全相同的 URL。
创建一个全新的
SimpleSwingBrowser
实例,以加载步骤中生成的 URL
我希望 Google 会再次向我显示 Screen One,因为这是一个新的浏览会话。但是,我第二次得到的是第二个屏幕。
看起来,WebView
中存储了一些会话/缓存/cookie,即使它是一个全新的实例。
我希望我能回到第一屏,这样我就可以支持多个用户帐户。
如何清除WebView
中的会话/缓存/cookie?
【问题讨论】:
查看相关Setting a cookie using JavaFX's WebEngine/WebView。它与您的问题并不完全相同,但也许它为您提供了一种方向性的方法,您可以从中得出答案。 谢谢。读完问题后,我仍然找不到清除所有cookie的方法。 它使用内存缓存。您可以通过关闭应用程序来清除它。也许不是对话框,而是生成一个可以关闭的新应用程序。 【参考方案1】:JavaFX WebView 的会话 cookie 存储在 java.net.CookieHandler
。
要自行管理 cookie,请创建 java.net.CookieManager
的新实例:
java.net.CookieManager manager = new java.net.CookieManager();
然后将其设置为默认值:
java.net.CookieHandler.setDefault(manager);
要清除 cookie,只需调用 removeAll 方法:
manager.getCookieStore().removeAll();
或者只是创建 cookie 管理器的新实例并将其设置为默认值:
java.net.CookieHandler.setDefault(new java.net.CookieManager());
【讨论】:
我一整天都在为此烦恼。非常感谢!! 技术上你是不正确的。默认情况下,它们存储在 com.sun.webpane.webkit.network.CookieHandler 中,它有一个私有的 final com.sun.webpane.webkit.network.CookieStore。 这些类实现了错误的标准。新的似乎没有公共 API。见这里***.com/a/14519837/478765 Java 9 的任何解决方案? 请注意,如***.com/a/14519837/72437 中所述,此答案已被破坏(不要浪费时间尝试使用 java.net.CookieManager 和 java.net.CookieStore。它们可能会导致问题与许多网站,因为他们实施了错误的标准。)【参考方案2】:我使用 JavaFX 8 WebView 来显示来自 Google 和 Dropbox 的 OAuth 2.0。结果将java.net.CookieManager()
的新实例设置为默认与Google 合作(当然删除了会话cookie),但我无法再使用我的Dropbox 帐户登录。 “唱歌”按钮不起作用。
我调试并发现默认情况下使用com.sun.webkit.network.CookieManager
的实例。所以,我用了
java.net.CookieHandler.setDefault(new com.sun.webkit.network.CookieManager());
这解决了我的问题。由于其 javadoc,它符合 RFC 6265,这是 HTTP Cookie 和 Set-Cookie 标头字段的当前定义。
由于 JRE 中的一些访问限制,您需要使用 JDK(不仅仅是 JRE)作为项目的系统库。
【讨论】:
你的回答帮助我能够使用 dropbox Api.thankyou 这需要被赞成。花了几个小时调试才发现 java.net.CookieManager() 没有在请求中发送 cookie。使用 com.sun.webkit.network.CookieManager() 修复了所有问题。 您还在使用它通过 OAuth2 登录 Google 吗?它似乎不再起作用了。几天前它仍然有效,但现在我收到一条错误消息,说我的浏览器(webview)不支持 Cookie。您找到解决方案了吗? 对不起,上次没用。 小心使用这是一个受限制的 APIcom.sun.webkit.network.CookieManager()
,它可能在 Java 9 中被完全删除 Access restriction: The type 'CookieManager' is not API (restriction on required library 'C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\jfxrt.jar')
以上是关于清除 JavaFX WebView 中的 session/cache/cookie的主要内容,如果未能解决你的问题,请参考以下文章
JavaFX WebView 中的 Html/Javascript 调试
JavaFX : 使用 JavaFX 嵌入浏览器而不是可用的 webview