java - Appletviewer 未从命令提示符运行 : java. security.AccessControlException : access denied (java.net.SocketPermission smtp.gmail.com 解析)

标签 java security applet appletviewer

我创建了一个简单的小程序,它通过单击“发送邮件”按钮使用 smtp.gmail.com 发送邮件。它可以从 Eclipse 完美运行。从 eclipse 我将它作为 Java Applet 运行,它发送邮件没有任何错误。
但是当从appletviewer运行时,在eclipse之外它会抛出一个错误:java.security.AccessControlException:访问被拒绝(java.net.SocketPermission smtp.gmail.com解析)
我已经签署了我的程序的 JAR。签名后,如果小程序从 Internet Explorer 运行,它会发送邮件,但如果小程序从 Google Chrome 浏览器或 appletviewer 运行,则会抛出上述错误。

创建 keystore 的命令: “c:\Program Files\Java\jre6\bin\keytool.exe”-genkey -alias -validity 365 -keystore -keyalg rsa

对 jar 进行签名的命令: \bin\jarsigner.exe -signedjar -keystore

JAR 是通过仅从 Eclipse 导出相同的内容而形成的。

运行小程序的命令: “c:\Program Files\Java\jdk1.6.0_27\bin\appletviewer.exe”

请查看代码并让我知道我哪里做错了......

小程序代码

package in.appletmail;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextField;

@SuppressWarnings("serial")
public class SendMailApplet extends JApplet
{
    boolean isStandalone = false;
    JPanel jPanel1 = new JPanel();
    JTextField jTextField1 = new JTextField();
    JButton jButton = new JButton("Send Mail");
    GridBagLayout gridBagLayout1 = new GridBagLayout();

    // Construct the applet
    public SendMailApplet()
    {
        // TODO Auto-generated constructor stub
    }

    // Initialize the applet
    public void init()
    {
        try
        {
            jbInit();
        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    // Initializing the components
    private void jbInit() throws Exception
    {
        this.setSize(new Dimension(500, 200));
        jPanel1.setLayout(gridBagLayout1);

        jTextField1.setText("First Applet");
        this.getContentPane().add(jPanel1, BorderLayout.CENTER);
        jPanel1.add(jTextField1, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0,
                GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
                new Insets(140, 128, 139, 132), 77, 0));

        jPanel1.add(jButton, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0,
                GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
                new Insets(140, 128, 200, 132), 77, 0));


        final String mailStatus = "Testing Applet Viewer";
        jTextField1.setText(mailStatus);

        jButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e)
            {
                try
                {
                    SendMail.mailVariable("Test mail from applet");
                    jTextField1.setText("Mail Send");
                } catch (Exception e1)
                {
                    jTextField1.setText(e1.toString());
                }

            }
        });
        // jTextField1.setText("Mail Send");
    }

    // Start the applet
    public void start()
    {

    }

    // Stop the applet
    public void stop()
    {

    }

    // Delete the applet
    public void destroy()
    {

    }

    // Fetch applet information
    public String getAppletInfo()
    {
        return "Applet-Information";
    }
}

发送邮件的代码

package in.appletmail;

import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public final class SendMail
{
    private static final String SMTP_HOST_NAME = "smtp.gmail.com";
    private static final String SMTP_PORT = "587";
    private static final String SMTP_AUTH_USER = "username";
    private static final String SMTP_AUTH_PWD = "pass";

    private static final String emailMsgTxt = "Testing mail from Applet, Test again";
    private static final String emailSubjectTxt = "Test mail from Applet via Google";
    private static final String emailFromAddress = "test.mail@abc.in";

    // Add List of Email address to who email needs to be sent to
    private static final String[] emailList = { "To@gmail.com" };

    public static String testFunctionCall()
    {
        return "Mailing function will be called";
    }

    public static String mailVariable(String variableValue)
            throws MessagingException
    {
        SendMail smtpMailSender = new SendMail();
        return smtpMailSender.postMail(emailList, emailSubjectTxt, emailMsgTxt
                + "\n variable value:  " + variableValue, emailFromAddress);
    }

    public String postMail(String recipients[], String subject, String message,
            String from) throws MessagingException
    {
        StringBuffer status = new StringBuffer();
        boolean debug = false;

        // Set the host smtp address
        Properties props = new Properties();
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.host", SMTP_HOST_NAME);
        props.put("mail.smtp.port", SMTP_PORT);
        props.put("mail.smtp.auth", "true");

        Authenticator auth = new SMTPAuthenticator();
        Session session = Session.getDefaultInstance(props, auth);

        session.setDebug(debug);
        status.append("Session set;");
        // create a message
        Message msg = new MimeMessage(session);

        // set the from and to address
        InternetAddress addressFrom = new InternetAddress(from);
        msg.setFrom(addressFrom);

        InternetAddress[] addressTo = new InternetAddress[recipients.length];
        for (int i = 0; i < recipients.length; i++)
        {
            addressTo[i] = new InternetAddress(recipients[i]);
        }
        msg.setRecipients(Message.RecipientType.TO, addressTo);
        status.append("Recipients set;");

        // Setting the Subject and Content Type
        msg.setSubject(subject);
        msg.setContent(message, "text/plain");
        status.append("Subject and Content set;");
        Transport.send(msg);
        status.append("Mail send;");
        return status.toString();
    }

    /**
     * SimpleAuthenticator is used to do simple authentication when the SMTP
     * server requires it.
     */
    private class SMTPAuthenticator extends Authenticator
    {

        public PasswordAuthentication getPasswordAuthentication()
        {
            String username = SMTP_AUTH_USER;
            String password = SMTP_AUTH_PWD;
            return new PasswordAuthentication(username, password);
        }
    }
}

调用小程序的 HTML:

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>ABC</title>
</head>
<body bgcolor="#CCCCCC">

<table border="0" cellpadding="0" cellspacing="0" width="144" >
  <tr>
    <td width="10%" height="25" style= "height:25">Powered by Xpace :)
    </td>
    <td width="90%"style= "height:25">
    <APPLET CODEBASE="E:\Gunjan\Workspace\TestAppletExecution\Signed\"
        ARCHIVE="TestApplet.jar, mail.jar"
        CODE="in.appletmail.SendMailApplet.class"
        NAME="Send Mail"
        MAYSCRIPT
        WIDTH="750"
        HEIGHT="350"
        HSPACE="0" VSPACE="0" ALIGN="top">        
    </APPLET>
    </td>
  </tr>
</table>
</body>


</html>

最佳答案

Applet 在沙箱中运行,有一些限制,您必须配置文件 jre/lib/security/java.policy 添加以下行:

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

关于java - Appletviewer 未从命令提示符运行 : java. security.AccessControlException : access denied (java.net.SocketPermission smtp.gmail.com 解析),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10190015/

相关文章:

java - 打开时调用 JFace ComboViewer setComparator()

java - Kotlin 自定义注释、参数

python - 如何验证 Python 脚本是纯数学函数?

php - 保护 PHP 文件

java - GUI 中的异常处理 : Unable to show message dialog

xcode - 我可以在没有开发人员凭据的情况下签署 IOS 应用程序吗?

java - 为什么它不读取行终止符 ''\n'

java - 你能调用带有链接的 servlet 吗?

python - 评估来自 'untrusted' 用户的算法

java - 使用 html 将 Java Slick 游戏放到网站上