我必须使用用户名和密码连接到https URL才能读取文件。我无法连接到服务器(请参阅下面的错误日志)。我没有太多Java经验,所以我需要有关此代码的帮助。
import lotus.domino.*;
import java.net.*;
import java.io.*;
import javax.net.ssl.HttpsURLConnection;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
String username = "123";
String password = "456";
String input = username + ":" + password;
String encoding = new sun.misc.BASE64Encoder().encode (input.getBytes());
//Open the URL and read the text into a Buffer
String urlName = "https://server.org/Export.mvc/GetMeetings?modifiedSince=4/9/2010";
URL url = new URL(urlName);
HttpsURLConnection connection = (HttpsURLConnection)url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Content-Length", String.valueOf (encoding.length()));
connection.setUseCaches(false);
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setAllowUserInteraction(true);
connection.setRequestProperty("Authorization", "Basic " + encoding);
connection.setRequestProperty("Cookie", "LocationCode=Geneva");
connection.connect();
BufferedReader rd = null;
try{
rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
} catch (IOException e) {
System.out.println("Read failed");
System.exit(-1);
}
String line;
while((line = rd.readLine()) != null) {
System.out.println(line.toString());
}
rd.close();
connection.disconnect();
} catch(Exception e) {
e.printStackTrace();
}
}
}
抛出异常:
java.security.AccessControlException: Access denied (java.lang.RuntimePermission exitVM.-1)
at java.security.AccessController.checkPermission(AccessController.java:108)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at COM.ibm.JEmpower.applet.AppletSecurity.superDotCheckPermission(AppletSecurity.java:1449)
at COM.ibm.JEmpower.applet.AppletSecurity.checkRuntimePermission(AppletSecurity.java:1311)
at COM.ibm.JEmpower.applet.AppletSecurity.checkPermission(AppletSecurity.java:1611)
at COM.ibm.JEmpower.applet.AppletSecurity.checkPermission(AppletSecurity.java:1464)
at java.lang.SecurityManager.checkExit(SecurityManager.java:744)
at java.lang.Runtime.exit(Runtime.java:99)
at java.lang.System.exit(System.java:275)
at JavaAgent.NotesMain(Unknown Source)
at lotus.domino.AgentBase.runNotes(Unknown Source)
at lotus.domino.NotesThread.run(Unknown Source)
答案 0 :(得分:2)
旧帖子,但我偶然发现了,所以这是一个更新的答案。
答案在你的堆栈跟踪中。虽然它可能与Domino的使用有关,但对于从标准Java浏览器插件调用的普通JVM上使用的非常简单的applet,这是一个普遍的问题,显然你的Java代理正在使用applet沙箱。
不允许使用小程序(除非直接修改客户端计算机上的Java安全策略)以执行一些关键调用。即使使用签名小程序。
在您的情况下,System.exit(-1)
正在触发异常。原因是applet具有相当复杂的生命周期,你不应该搞乱它。这是为了您自己的利益,因为您希望浏览器能够为您与applet进行交互,并能够拆除(或重用)为运行applet而启动的JVM进程。通过调用System.exit()
或其他人,你会搞乱这个生命周期,并且你的浏览器有可能控制applet的破坏。
您可能需要重新考虑为什么需要完全这样做,因为您可能不需要在那里调用System.exit()
来电。
答案 1 :(得分:1)
我认为这是一个Java代理?要检查的事情。
在代理属性中,为您要执行的操作设置安全级别。通常,文件访问至少需要2级。
代理程序或代理程序设置为运行的用户的签名允许在服务器上运行。
您可以修改java.policy文件以允许访问某些受限制的类。 (但你需要知道你为什么要做出改变)。
http://java.sun.com/j2se/1.5.0/docs/guide/security/permissions.html
答案 2 :(得分:0)
applet只能访问从中加载的服务器。很可能你的applet没有从你想要连接的服务器上加载?
编辑:您的堆栈跟踪表明,已安装专门的安全管理器(COM.ibm.JEmpower.applet.AppletSecurity)。谷歌搜索这个课程揭示了问题:http://lekkimworld.com/2006/02/28/imported_java_agent.html
答案 3 :(得分:0)
This支持线程听起来与您的问题类似。