在IBM Lotus Domino中使用okhttp3库遇AccessControlException权限问题
我正在IBM Lotus Domino应用中开发Java类,该类使用okhttp3库,代码如下:
import java.io.*; import okhttp3.*; public class Uploader { public String Poster(String FileName, String sId) { // Declarations String httpResult = ""; // Create OkHttp client OkHttpClient client = new OkHttpClient(); System.out.println("OkHttpClient"); // Create multipart request body RequestBody requestBody; System.out.println("RequestBody"); // ... return httpResult; } }
运行时抛出错误:
java.security.AccessControlException: Access Denied ("java.net.NetPermission" "getProxySelector")
已在C:\Program Files\IBM\Lotus\Domino\jvm\lib\security\java.policy文件中添加语句:permission java.net.NetPermission "getProxySelector";,但问题仍未解决,求可行的解决思路。
确认权限配置位置正确:必须把权限语句放在
java.policy的grant代码块内,而非文件任意位置,示例:grant { permission java.net.NetPermission "getProxySelector"; // 其他需要的权限 };重启Domino服务器:修改
java.policy后,只有重启IBM Lotus Domino服务,新的安全策略才会生效,这是极易遗漏的步骤。补充必要的额外权限:OkHttp执行网络请求可能需要更多权限,可根据后续报错逐步添加:
- 连接目标服务器需要
java.net.SocketPermission:permission java.net.SocketPermission "目标主机:端口", "connect,resolve"; - 读取本地上传文件需要
java.io.FilePermission:permission java.io.FilePermission "/本地文件路径/-", "read";
- 连接目标服务器需要
调整OkHttp的代理配置:避免OkHttp自动获取ProxySelector,可手动设置代理或禁用自动代理检测:
OkHttpClient client = new OkHttpClient.Builder() .proxy(Proxy.NO_PROXY) // 根据实际场景选择是否禁用代理 .build();检查Domino自身安全策略:Domino可能有独立于JVM的安全限制,可在Domino管理员客户端的服务器文档“Java”选项卡中,查看是否有额外的安全配置覆盖了
java.policy。验证JVM路径正确性:确认修改的
java.policy属于Domino当前使用的JVM。可在Domino控制台执行show jvm命令,查看实际JVM路径,避免修改了错误的文件。
内容的提问来源于stack exchange,提问作者Lea Giardili

