【问题标题】:java.security.AccessControlException: access denied ("java.net.SocketPermission" "smtp.gmail.com" "resolve")java.security.AccessControlException:访问被拒绝(“java.net.SocketPermission”“smtp.gmail.com”“解决”)
【发布时间】:2012-11-27 10:20:56
【问题描述】:

我正在使用 GlassFish Server 3.1 和 Java 邮件 Api 1.4.5。

场景:我有一个小程序,点击它会发送一封电子邮件。

发送邮件在 Netbeans AppletViewer 上完美运行,但是当添加到浏览器并尝试从那里发送电子邮件时,它变成了地狱。

我已经阅读了几个小时,关于策略文件、签名/未签名的小程序......等等。

我尝试过使用签名的小程序(那里有很多用于签名的教程,使用 java 的 keytools 非常简单)。当我在浏览器上运行它时,它会请求许可,因为它是一个自签名证书,我给予它许可,但它仍然会吐出相同的异常。

我也试过修改java.poilcy文件添加

权限 java.net.SocketPermission "smtp.gmail.com:587", "listen,resolve";

但什么都没有。

我知道这是个例外,因为我在 Java 控制面板中激活了 Java 控制台。我真的不知道还能做什么。

这是发送电子邮件的代码:

    String host = "smtp.gmail.com";
    String from = *****;
    String pass = ******;
    Properties props = new Properties();
    props.put("mail.smtp.starttls.enable", "true");
    props.put("mail.smtp.host", host);
    props.put("mail.smtp.user", from);
    props.put("mail.smtp.password", pass);
    props.put("mail.smtp.port", "587");
    props.put("mail.smtp.auth", "true");

    Session session = Session.getDefaultInstance(props, null);
    this.message = new MimeMessage(session);
    message.setFrom(new InternetAddress(from));

    InternetAddress toAddress = new InternetAddress(this.to);
    this.message.addRecipient(Message.RecipientType.TO, toAddress);

    this.message.setSubject(this.subject);

    this.message.setText(this.body);

    Transport transport = session.getTransport("smtp");
    transport.connect(host, from, pass);
    transport.sendMessage(this.message, this.message.getAllRecipients());
    transport.close();

【问题讨论】:

  • 您确定是小程序而不是 GMail 拒绝连接吗?
  • 绝对肯定,因为它可以与 AppletViewer 一起正常工作(当您在 NetBeans 环境中而不是在浏览器中执行小程序时)

标签: java security applet japplet accesscontrolexception


【解决方案1】:

JApplet 独立于一个“沙盒”中,被授予与常规应用程序不同的权限(应用程序仅在用户直接选择执行时才执行,因此,用户接受后果)。 JApplet 在浏览器下载它时执行,给用户任何选择,这就是为什么如果你想让你的小程序由其他人部署和执行(当小程序访问服务器而不是它被部署的服务器时)它必须被签名(自签名证书或由授权组织签名的证书,这通常意味着支付一些费用),以便用户可以“接受”使用所述 Applet 的后果,允许它“脱离沙箱”。

出于某种原因,使用 keytolls 和 jarsigner 使用自我证书对其进行签名对我没有任何作用。即使当我访问网页时,浏览器警告我执行小程序(让我可以选择不执行它)并且我接受了上述警告,但 JApplet 似乎没有获得它的权限。

我的男朋友建议将电子邮件课程移出“沙盒”。 他解决了(祝福他!),将 emailClass(使用 java 邮件 api 的那个)移动到服务器没有任何问题。使用客户端-服务器架构的前端控制器命令,我所要做的就是使用我在问题开头发布的代码实现我的控制器类,并从我的小程序(单击按钮时)发送一个 http-request将 toEmailAddress、主题和正文添加到我的 servlet。

完美运行。

【讨论】:

  • 嗨 - 我很高兴你解决了它:)。如您所见,存在 两个 问题:1)小程序需要“签名”,2)访问不是“跨域”
  • 使用 keytolls 和 jarsigner 使用自我证书对其进行签名也不适用于我。我正在使用jre7。我正在尝试读取存储在桌面中的文件。
【解决方案2】:

您必须对小程序进行签名,以便它可以连接到加载它的主机以外的主机,并且您必须使用非自签名证书,或者用户必须在出现提示时接受证书。

【讨论】:

  • 我已使用以下说明对小程序进行了签名 keytool -genkey -keystore akeystore -keyalg rsa -dname "CN=Johanna Daniel, OU=Universidad, O=Universidad, L=Atlanta, ST=GA, C=NL" -alias aks -validity 3600 -keypass password-storepass password // jarsigner -keystore akeystore -storepass password-keypass paswword -signedjar ArkanoidS.jar Arkanoid.jar aks 我还使用了 jarsigner 的 -verify 选项来“验证” “我的 ArkanoidS.jar 已签名。我添加到我的 web 应用程序和 html 标记中的就是这个 jar(签名的)。它仍然无法正常工作。
  • @Joy 所以你已经满足了我列举的三个条件之一。
  • 我不明白哪些条件没有满足。您要求使用非自签名证书或自签名证书对小程序进行签名(在最后一种情况下,即使它是从非自签名证书签署的,也会提示用户接受执行小程序) -授权实体,这意味着它具有自签名证书)。我做了所有这些,当在浏览器上执行时,我被它提示,我接受了条款并告诉它执行它。它不断得到同样的异常。
【解决方案3】:
【解决方案4】:

用带有签名的JNLP分发你的程序,很容易解决这种情况。

查看有关您的 IDE 的 JNLP 的教程并阅读以下内容以了解更多信息: http://docs.oracle.com/javase/6/docs/technotes/guides/jweb/deployment_advice.html

【讨论】:

  • 我现在正在与 JNLP 启动应用程序中的相同错误作斗争。直接从 JAR 运行时工作正常,但是当 JNLP 启动时以同样的方式失败。 :-(
  • 你的应用必须跑出沙箱才能访问更多资源,还有另一种方法可以实现,但对于只接受签名的用户来说更烦人。
猜你喜欢
  • 1970-01-01
  • 2015-02-23
  • 2015-06-30
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多