java.security.AccessControlException:拒绝访问(“java.net.SocketPermission”smtp.gmail.com“resolve”)
我使用的是GlassFish服务器3.1和Java邮件Api 1.4.5 场景:我有一个小程序,点击它会发送一封电子邮件 “发送邮件”在Netbeans AppletViewer上运行得非常好,但当添加到浏览器并尝试从浏览器发送电子邮件时,它会变成地狱 我已经读了好几个小时了,关于策略文件、已签名/未签名的小程序等等 我尝试过使用签名小程序(有很多关于签名的教程,使用java的keytools非常简单)。当我在浏览器上运行它时,它会请求许可,因为它是一个自签名证书,我给了它许可,但它仍然会抛出相同的异常 我还尝试修改java.poilcy文件添加 权限java.net.SocketPermission“smtp.gmail.com:587”,“侦听,解析” 但什么都没有 我知道这是一个例外,因为我在Java控制面板中激活了Java控制台。我真的不知道还能做什么 以下是发送电子邮件的代码:java.security.AccessControlException:拒绝访问(“java.net.SocketPermission”smtp.gmail.com“resolve”),java,security,applet,japplet,accesscontrolexception,Java,Security,Applet,Japplet,Accesscontrolexception,我使用的是GlassFish服务器3.1和Java邮件Api 1.4.5 场景:我有一个小程序,点击它会发送一封电子邮件 “发送邮件”在Netbeans AppletViewer上运行得非常好,但当添加到浏览器并尝试从浏览器发送电子邮件时,它会变成地狱 我已经读了好几个小时了,关于策略文件、已签名/未签名的小程序等等 我尝试过使用签名小程序(有很多关于签名的教程,使用java的keytools非常简单)。当我在浏览器上运行它时,它会请求许可,因为它是一个自签名证书,我给了它许可,但它仍然会抛出相
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();
有几件事需要注意: 1) 仔细检查并确保小程序签名正确:
出于某种原因,使用keytols和jarsigner使用自认证对我来说根本不起作用。尽管当我访问网页时,浏览器警告我要执行applet(让我可以选择不执行它),我接受了警告,但JApplet似乎没有获得它的权限 我男朋友建议将email类移出“沙箱”。他解决了它(保佑他!),移动了email类(使用java mail api的类)对服务器没有任何问题。使用客户端服务器Arquitecture的Front Controller命令,我所要做的就是用我在问题开头发布的代码实现我的Controller类,并从我的applet发送(单击按钮时)带有toEmailAddress、subject和主体的http请求到我的servlet
工作完美。使用带有签名的JNLP向您分发程序,非常简单,可以解决此类情况 查看有关IDE JNLP的教程,并阅读以下内容以了解更多信息:
您确定是小程序而不是GMail拒绝连接吗?绝对确定,因为它与AppletViewer配合使用(当您在NetBeans环境中而不是在浏览器中执行小程序时)效果良好。我已使用以下说明对小程序进行签名:keytool-genkey-keystore-keyalg rsa-dname“CN=Johanna Daniel,OU=Universidad,O=Universidad,L=Atlanta,ST=GA,C=NL”-别名aks-validity 3600-keypass password storepassword//jarsigner-keystore akystore-storepassword keypass password paswword-signedjar ArkanoidS.jar Arkanoid.jar aks我还使用了jarsigner的-verify选项来“验证”“我的ArkanoidS.jar已经签名了。就是这个罐子(签名的那个)我添加到我的Web应用程序和html标记中的。它仍然不起作用。@Joy,所以您满足了我列举的三个条件中的一个。我不知道哪些条件没有满足。您要求小程序使用非自签名证书或自签名证书签名(在最后一种情况下,即使小程序是由非授权实体签署的,也会提示用户接受执行小程序,这意味着它有一个自签署的证书)。我做了所有这些,当在浏览器上执行时,它会提示我,我接受了条款并告诉它执行。它不断出现相同的异常。嗨-我很高兴你解决了它:)。正如你所看到的,有两个问题:1)小程序需要“签名”,2)访问不是“跨域”使用keytols和jarsigner用自我证书签名对我也不起作用。我正在使用jre7。我正在尝试读取存储在桌面上的文件。我正在与JNLP启动的应用程序中的相同错误进行斗争。直接从JAR运行时工作正常,但启动JNLP时也会以同样的方式失败:-(你的应用程序必须用完沙箱才能访问更多资源,还有另一种方法可以实现这一点,但对于只接受签名的用户来说更烦人。