java.security.AccessControlException : access denied ("java.net.SocketPermission" "smtp.gmail.com" "resolve")

标签 java security applet japplet accesscontrolexception

我使用的是 GlassFish Server 3.1 和 Java mail 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();

最佳答案

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

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

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

完美运行。

关于java.security.AccessControlException : access denied ("java.net.SocketPermission" "smtp.gmail.com" "resolve"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13793578/

相关文章:

java - Java webapp 中的病毒扫描?

java - 从 2 个已知数组中初始化新数组

ios - 是否所有 iOS 设备都可以在设备上使用 Apple Wallet 应用程序?

java - java 小程序中的代码即使签名也会抛出 PrivilegedActionException

java - 无法在小程序中 getInputStream()

java - 将 AUTO_INCREMENT 添加到大表中的现有列

Java Socket 选择器不切换到写入状态

security - 应该如何检查 Plone 中的权限?

php - Symfony2 FOSUserBundle - 您请求了不存在的服务 "security.user_checker"

security - 尼菲 : how to make ListenHTTP work with SSL