java.security.AccessControlException:访问被拒绝(“java.net.SocketPermission”“smtp.gmail.com”“resolve”)

时间:2012-12-10 00:52:26

标签: java security applet japplet accesscontrolexception

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

场景:我有一个applet,点击后会发送一封电子邮件。

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

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

我尝试过使用已签名的applet(大量的教程用于签名,使用java中的keytools非常简单)。当我在浏览器上运行它时,它会请求权限,因为它是一个自签名证书,我给它许可,但它仍然会发出相同的异常。

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

权限java.net.SocketPermission“smtp.gmail.com:587”,“听,解决”;

但没有。

我知道这是异常,因为我在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();

4 个答案:

答案 0 :(得分:3)

JApplet自身处于“沙箱”中,与常规应用程序具有不同的权限(应用程序仅在用户选择直接执行时执行,因此,用户接受后果)。 JApplet在浏览器下载时执行,给用户没有任何选项,这就是为什么如果你想让你的applet部署和执行applet(当applet访问服务器而不是部署服务器的服务器时)签名(自签名证书或授权组织签署的证书,通常意味着支付一些费用),以便用户可以“接受”使用所述Applet的后果,允许它“脱离沙箱”。 / p>

出于某种原因,使用keytolls和jarsigner使用自我证书进行签名对我来说无效。即使当我访问网页并且浏览器警告我执行applet(给我选项不执行它)并且我接受了警告时,似乎JApplet没有获得它的权限。

我的男朋友建议将电子邮件类移出“沙盒”。 他解决了它(祝福他!),将emailClass(使用java邮件api的那个)移动到服务器没有任何问题。使用前端控制器命令进行客户端 - 服务器Arquitecture,我所要做的就是使用我在问题开头发布的代码实现我的Controller类,并从我的applet发送(当点击按钮时)一个http请求使用toEmailAddress,subject和body到我的servlet。

完美无缺。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

答案 3 :(得分:1)

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

查看有关IDE的JNLP的教程,并阅读本文以获取更多信息: http://docs.oracle.com/javase/6/docs/technotes/guides/jweb/deployment_advice.html