Java存储过程中的getOutputStream引发错误



我正试图从Java存储过程中使用SOAP web服务,因为我正在使用getOutputStream((命令将有效负载写入正在引发访问错误的连接,如下所示。

Java调用被未捕获的Java异常终止:

java.security.AccessControlException:
the Permission (java.net.SocketPermission <Server-Name>:<Port> connect,resolve) 
has not been granted to INFOIFACE.
The PL/SQL to grant this is dbms_java.grant_permission 
( 'INFOIFACE', 'SYS:java.net.SocketPermission', <Server-Name>:<Port>, 'connect,resolve' ) 

但是在Oracle数据库中为模式提供了相同的访问权限,但它仍然显示了错误。

public class remoteConnection {
public static String connectToFPH(String destUrl, String pacFile, String cred, String payLoad) throws Exception {
System.out.println("Inside function");
BrowserProxyInfo bInfo = new BrowserProxyInfo();        
bInfo.setType(ProxyType.AUTO);
bInfo.setAutoConfigURL(pacFile);       
DummyAutoProxyHandler handler = new DummyAutoProxyHandler();
try {
handler.init(bInfo);
} catch (ProxyConfigException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
String basicAuth = "Basic " + javax.xml.bind.DatatypeConverter.printBase64Binary(cred.getBytes());
URL url = new URL(destUrl);
String proxyUrl = "";
ProxyInfo[] ps = handler.getProxyInfo(url);     
for(ProxyInfo p : ps){
proxyUrl = p.toString();
}
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyUrl.split(":")[0], Integer.valueOf(proxyUrl.split(":")[1])));
HttpsURLConnection conn = (HttpsURLConnection)url.openConnection(proxy);
conn.setRequestMethod("POST");
conn.setRequestProperty ("Authorization", basicAuth);
conn.setRequestProperty("Content-Type", "text/xml; charset=UTF-8");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setAllowUserInteraction(false);
OutputStream out = conn.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(out, "UTF-8");
writer.write(payLoad);
writer.close();
out.close();
String inputLine;
StringBuffer buf = new StringBuffer();
if(conn.getResponseCode() == 200)
{
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
while ((inputLine = in.readLine()) != null) 
{
buf.append(inputLine);
}
in.close();
}
else
{
//throw new Exception("Unable to connect to FPH. Please contact Administrator");
return "unable to connect";
}
conn.disconnect();
return buf.toString();
}
}

我请求在这方面提供帮助。Oracle数据库中是否需要提供其他访问权限?

您似乎遇到了Oracle Security Manager。这基本上是一个由数据库表控制的经典JavaSecurityManager

"与Java2安全性一样,Oracle数据库支持安全类。通常,您可以使用工具或通过编辑安全策略文件来设置代码库的权限。在Oracle数据库中,您可以通过DBMS_JAVA过程动态设置权限,该过程修改数据库中的策略表。">

有关更多信息,请参阅:

  • "Oracle数据库Java应用程序的安全性">

请注意,上面的示例10-1显示了如何使用DBMS_Java授予Java权限。(示例显示了FilePermission授予。您需要具有相关属性的SocketPermission授予。(

问题可以在ACL列表中。1( 检查远程主机的网络权限SELECT * FROM user_network_acl_privileges;
2(如果没有关于它的条目。
创建新的ACL列表。

declare
v_acl_name varchar2(30) := 'your_acl_name1.xml';
BEGIN
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(acl         => v_acl_name,
description => 'Allow user to make connection',
principal   => 'YOUR_USER',
is_grant    => TRUE,
privilege   => 'connect');
-- optional
--  DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(acl       => v_acl_name,
--                                       principal => 'YOUR_USER',
--                                       is_grant  => true,
--                                       privilege => 'resolve');
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl  => v_acl_name,
host => '*'); -- any host
--or 
/*DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl  => v_acl_name,
host => '*.stackoverflow.com');
--or     
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl  => v_acl_name,
host => 'xxx.xxx.xxx.xx-ip ');
*/                          
END;
/
COMMIT;

例如,Oracle11在后来的版本中有一些更改
链接:DBMS_NETWORK_ACL_ADMIN

最新更新