从 Tomcat servlet 连接到 HTTP 服务器时出现 AccessControlException

Posted

技术标签:

【中文标题】从 Tomcat servlet 连接到 HTTP 服务器时出现 AccessControlException【英文标题】:AccessControlException when connecting to HTTP server from Tomcat servlet 【发布时间】:2009-10-08 13:17:19 【问题描述】:

我试图让我的 tomcat servlet 下载许多文件,但是我在同一台服务器上运行 apache 和 tomcat,所以我认为这就是它不起作用的原因。我已经在不运行 apache 的服务器上进行了测试,一切都很好。

这是我尝试使用 new Url( fileUrl ).openStream() 时遇到的异常:

 Opening input stream Attempted to download: http://www.stefankendall.com/files/test.txt java.security.AccessControlException: access denied (java.net.SocketPermission www.stefankendall.com:80 connect,resolve)

如何在运行 apache 的同时通过 tomcat 运行 http 下载?我被卡住了吗?

编辑: 无论我做什么,我都无法通过tomcat。这是 03catalina.policy:

// ========== CATALINA 代码权限 ================================ =======

// These permissions apply to the logging API
grant codeBase "file:$catalina.home/bin/tomcat-juli.jar" 
        permission java.util.PropertyPermission "java.util.logging.config.class", "read";
        permission java.util.PropertyPermission "java.util.logging.config.file", "read";
        permission java.lang.RuntimePermission "shutdownHooks";
        permission java.io.FilePermission "$catalina.base$file.separatorconf$file.separatorlogging.properties", "read";
        permission java.util.PropertyPermission "catalina.base", "read";
        permission java.util.logging.LoggingPermission "control";
        permission java.io.FilePermission "$catalina.base$file.separatorlogs", "read, write";
        permission java.io.FilePermission "$catalina.base$file.separatorlogs$file.separator*", "read, write";
        permission java.lang.RuntimePermission "getClassLoader";
        // To enable per context logging configuration, permit read access to the appropriate file.
        // Be sure that the logging configuration is secure before enabling such access
        // eg for the examples web application:
        // permission java.io.FilePermission "$catalina.base$file.separatorwebapps$file.separatorexamples$file.separatorWEB-INF$file.separatorclasses$file.separatorlogging.properties", "read";
;

// These permissions apply to the server startup code
grant codeBase "file:$catalina.home/bin/bootstrap.jar" 
        permission java.security.AllPermission;
 permission java.net.socketPermission "*:80", "connect, resolve";
;

// These permissions apply to the servlet API classes
// and those that are shared across all class loaders
// located in the "lib" directory
grant codeBase "file:$catalina.home/lib/-" 
        permission java.security.AllPermission;
       permission java.net.socketPermission "*:80", "connect, resolve";
;

grant codeBase "file:$catalina.home/webapps/-" 
 permission java.security.AllPermission;
 permission java.net.socketPermission "*:80", "connect, resolve";
;

【问题讨论】:

【参考方案1】:

您的问题与是否有某个程序在同一个盒子上运行无关;它与 Tomcat 中的 SecurityManager 存在有关(这可能意味着您正在运行旧版本的 Tomcat)。

这里是how to configure the Tomcat SecurityManager 的详细文档。在您的情况下,您将在 local.policy 文件中添加一些行,类似于

grant codeBase "file:$catalina.home/webapps/-" 
  permission java.net.SocketPermission "*:80", "connect";
;

【讨论】:

显然我不明白这个问题,因为我相信我唯一的设置差异是 apache 的存在。我会试试这个,看看它是否有效。使用预配置软件的危险...... 更改需要在 50local.policy 中。 感谢您的“接受”。由于我还没有编辑权限,我是否可以建议您编辑您的问题以说出“从 Tomcat servlet 连接到 HTTP 服务器时出现 AccessControlException”之类的内容?

以上是关于从 Tomcat servlet 连接到 HTTP 服务器时出现 AccessControlException的主要内容,如果未能解决你的问题,请参考以下文章

从 servlet 连接到数据库

从 Servlet 连接到 MySQL 不起作用 [重复]

Tomcat 在 Eclipse 中启动但无法连接到 http://localhost:8085/

AWS EC2:从 tomcat 7 连接到 PostgreSQL

使用客户端凭据从 Tomcat 连接到 SQL Server

从 android 应用程序到动态 Web servlet 的通信