【发布时间】: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://stackoverflow.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 来加载以下网址。
在第一次期间,将显示以下 UI。
屏幕一
屏幕二
我之后
- 在第一个屏幕上执行成功登录。
- 与屏幕二一起呈现。
- 点击接受。
- 关闭网络浏览器对话框。
- 再次生成与第一次完全相同的 URL。
- 创建一个全新的
SimpleSwingBrowser实例,以加载步骤中生成的 URL
我希望 Google 会再次向我显示 Screen One,因为这是一个新的浏览会话。但是,我第二次得到的是第二个屏幕。
看起来,WebView 中存储了一些会话/缓存/cookie,即使它是一个全新的实例。
我希望我能回到第一屏,这样我就可以支持多个用户帐户。
如何清除WebView 中的会话/缓存/cookie?
【问题讨论】:
-
查看相关Setting a cookie using JavaFX's WebEngine/WebView。它与您的问题并不完全相同,但也许它为您提供了一种方向性的方法,您可以从中得出答案。
-
谢谢。读完问题后,我仍然找不到清除所有cookie的方法。
-
它使用内存缓存。您可以通过关闭应用程序来清除它。也许不是对话框,而是生成一个可以关闭的新应用程序。
标签: java swing webview javafx oauth-2.0