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

Che*_*eng 7 java swing javafx webview oauth-2.0

我有一个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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

每次,我都会从Google获取以下网址.我将使用SimpleSwingBrowser加载以下URL.

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.

屏幕一

在此输入图像描述

屏幕二

在此输入图像描述

在我之后

  1. 在Screen One执行成功登录.
  2. 提供屏幕二.
  3. 单击"接受".
  4. 关闭Web浏览器对话框.
  5. 同样,生成与第一次完全相同的URL.
  6. 创建一个全新的实例SimpleSwingBrowser,以加载在步骤生成的URL

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

看来WebView,即使它是一个全新的实例,也存在一些存储的会话/缓存/ cookie .

我希望我能回到Screen One,这样我就可以支持多个用户帐户了.

如何清除会话/缓存/ cookie WebView

Sim*_*mY4 20

JavaFX WebView的会话cookie存储在java.net.CookieHandler.

要自己管理cookie,请创建以下新实例java.net.CookieManager:

java.net.CookieManager manager = new java.net.CookieManager();
Run Code Online (Sandbox Code Playgroud)

然后将其设置为默认值:

java.net.CookieHandler.setDefault(manager);
Run Code Online (Sandbox Code Playgroud)

要清除cookie,只需调用removeAll方法:

manager.getCookieStore().removeAll();
Run Code Online (Sandbox Code Playgroud)

或者只是创建cookie管理器的新实例并将其设置为默认值:

java.net.CookieHandler.setDefault(new java.net.CookieManager());
Run Code Online (Sandbox Code Playgroud)

  • 这些类实现了错误的标准。新 API 似乎没有公共 API。请参阅此处 /sf/answers/1016388621/ (2认同)

gfk*_*kri 8

我使用JavaFX 8 WebView来显示来自Google和Dropbox的OAuth 2.0.原来设置一个新的java.net.CookieManager()默认实例与谷歌合作(当然删除了会话cookie),但我无法再使用我的Dropbox帐户登录了."唱歌"按钮不起作用.

我调试并发现默认使用的com.sun.webkit.network.CookieManager是一个实例.所以,我用过

java.net.CookieHandler.setDefault(new com.sun.webkit.network.CookieManager());
Run Code Online (Sandbox Code Playgroud)

这解决了我的问题.由于它的javadoc符合RFC 6265,这是HTTP Cookie和Set-Cookie头字段的当前定义.

由于JRE中的某些访问限制,您需要使用JDK(而不仅仅是JRE)作为项目的系统库.

  • 小心使用这是一个受限制的API`com.sun.webkit.network.CookieManager()`,也许它在Java 9中被完全删除了.访问限制:类型'CookieManager'不是API(对所需库'C的限制:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\jfxrt.jar')` (4认同)