我有一个applet,在尝试访问网页时会抛出java.security.AccessControlException。我知道applet只允许访问他们自己下载的同一主机。有问题的网页位于同一主机上 - 但我仍然收到此错误。
第一次运行applet时不会发生错误。重新启动浏览器并重新运行applet时,将引发异常。如果重新加载页面,则异常消失。
错误来自此代码:
JTextPane.setPage(URL);
在此代码之前,applet正在下载其他网络资源,他们不会抛出任何异常。
抛出异常:
java.security.AccessControlException: access denied
(java.net.SocketPermission 131839-QR1WS02:18080 connect,resolve)
java.lang.RuntimeException: java.security.AccessControlException: access
denied (java.net.SocketPermission 131839-QR1WS02:18080 connect,resolve)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getHeaderField(Unknown Source)
at java.net.HttpURLConnection.getResponseCode(Unknown Source)
at javax.swing.JEditorPane.getStream(Unknown Source)
at javax.swing.JEditorPane.setPage(Unknown Source)
at Browser.setPage(Browser.java:76)
在抛出此异常之后,访问具有几乎相同URL的另一个网页,没有任何问题。
为什么会发生这种情况,看似随意?
我已经使用不同的浏览器测试了相同的结果。
谢谢!
更新:它似乎是JTextPane.setPage(URL)的错误。我已经做了这样的解决方法:
try {
pane.setPage(u);
} catch (Exception e) {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(u.openStream()));
String page = "";
while(reader.ready()) {
page += reader.readLine();
}
pane.setContentType("text/html");
pane.setText(page);
} catch (Exception e1) {
}
}
基本上,如果setPage(URL)抛出异常,则此代码将尝试下载相同URL的内容并手动设置JTextPane的内容。到目前为止,这似乎解决了这个问题。