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.
在第一次,将显示以下UI.


在我之后
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)
我使用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)作为项目的系统库.
| 归档时间: |
|
| 查看次数: |
11193 次 |
| 最近记录: |