清除JavaFX WebView中的会话/缓存/ cookie

时间:2014-05-01 13:55:14

标签: java swing webview javafx oauth-2.0

我有一个Swing对话框,它使用JavaFX WebView显示来自Google服务器的oAuth 2.0网址。

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获取以下网址。我将使用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

第一次期间,将显示以下用户界面。

Screen One

enter image description here

第二屏

enter image description here

之后
  1. 在第一屏幕上成功登录。
  2. 与屏幕二呈现。
  3. 点击接受。
  4. 关闭网络浏览器对话框。
  5. 再次,生成与第一次完全相同的URL。
  6. 创建一个全新的SimpleSwingBrowser实例,以加载在步骤
  7. 生成的网址

    我希望Google会再次向我展示Screen One,因为这是一个新的浏览会话。但是,我第二次得到的是Screen Two。

    似乎在WebView中存在一些存储的会话/缓存/ cookie,即使它是一个全新的实例。

    我希望自己能够回到Screen One,这样我就可以支持多个用户帐户。

    如何清除WebView中的会话/缓存/ cookie?

2 个答案:

答案 0 :(得分:20)

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());

答案 1 :(得分:8)

我使用JavaFX 8 WebView显示来自Google和Dropbox的OAuth 2.0。原来设置java.net.CookieManager()的新实例默认适用于Google(当然还删除了会话Cookie),但我已经无法使用我的Dropbox帐户登录了。 &#34;唱歌&#34;按钮只是没有用。

我调试并发现默认使用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)作为项目的系统库。