清除 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。您找到解决方案了吗? 对不起,上次没用。 小心使用这是一个受限制的 API com.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

JavaFX WebView:使用loadContent()链接到文档中的锚点不起作用

JavaFX 中 WebView 的性能

javafx webview js交互问题

在JavaFX中静音一个WebView,有可能吗?