java.Sicherheit.AccessControlException: access denied (“java.net.SocketPermission" "smtp.gmail.com" "beheben")
Ich bin mit GlassFish Server 3.1 und die Java-mail-Api 1.4.5.
Szenario: ich habe ein applet, das, wenn geklickt wird, sendet er ein E-Mail-Nachricht.
Senden Sie die E-mail-arbeitet perfekt auf Netbeans AppletViewer, aber es verwandelt sich in die Hölle, wenn Hinzugefügt, um den browser und versuchen Sie zum senden der E-Mail von dort.
Habe ich stundenlang gelesen, über policy-Dateien, signed/unsigned applets...etc.
Habe ich versucht, mit dem signierten applet (eine Menge von tutorials gibt, die für die Unterzeichnung, es war ganz einfach mithilfe des keytools von java). Wenn ich es über den browser fragt er nach Erlaubnis, weil es ein selbst-signiertes Zertifikat, ich gebe es Zustimmung , aber es immer noch spuckt die gleiche Ausnahme.
Habe ich auch versucht, das ändern von java.poilcy-Datei hinzufügen
permission java.net.SocketPermission "smtp.gmail.com:587", "listen,resolve";
Aber nichts.
Ich weiß, das ist die Ausnahme, weil ich activaded die Java-Konsole im Java Control Panel. Ich weiß wirklich nicht, was anderes zu tun.
Hier ist der code, sendet der E-Mail:
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();
Absolut sicher, weil es gut funktioniert mit dem AppletViewer (beim ausführen des Applets in NetBeans-Umgebung anstatt im browser)
InformationsquelleAutor Chayemor | 2012-12-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
JApplet in eine "sandbox" auf seine eigene, unterschiedliche Berechtigungen als normale Anwendungen (Anwendungen werden nur ausgeführt, wenn der Benutzer wählt direkt zu tun, daher akzeptiert der Nutzer die Konsequenzen). Ein JApplet wird ausgeführt, wenn ein browser lädt es, dass der Benutzer keine option auch immer, das ist, warum, wenn Sie wollen, um Ihr applet bereitgestellt und ausgeführt werden, die von anderen (wenn das applet greift auf anderen Servern als dem, aus dem es bereitgestellt wird) muss es signiert werden (entweder ein selbstsigniertes Zertifikat oder ein Zertifikat, unterzeichnet von einem autorisierten Organisation, die in der Regel impliziert, zahlen einige Gebühren), so dass der Benutzer kann "Akzeptieren" die Folgen der Verwendung von Sprach-Applet, so dass es "aus dem Sandkasten".
Aus irgendeinem Grund, Unterschreiben Sie es mit einem self-cert mit keytolls und jarsigner funktionierte nicht für mich überhaupt. Obwohl, wenn ich Zugriff auf die Webseite und den browser warnte mich über die Ausführung des applet (indem er mir die option nicht ausführen) und ich, akzeptiert er diese Warnung, so schien es dem JApplet nicht war immer seine Berechtigung.
Mein Freund vorgeschlagen verschieben der E-Klasse aus der "sandbox". Er es gelöst (Gott segne ihn!), verschieben der emailClass (diejenige, die verwendet die java-mail-api) auf den server gab keinerlei Probleme. Mit dem Front-Controller-Befehl für Client-Server-Architektur, alles, was ich tun musste, war die Umsetzung meiner Controller-Klasse mit dem code, den ich am Anfang gepostet von Frage und senden von meinem applet (wenn die Schaltfläche geklickt wurde) eine http-Anfrage mit der toEmailAddress, Betreff und Nachrichtentext zu meinem servlet.
Funktioniert perfekt.
Unterzeichnung mit einem self-cert mit keytolls und jarsigner hat nicht funktioniert für mich. Ich bin mit jre7. Ich versuche, mich zum Lesen einer gespeicherten Datei in desktop.
InformationsquelleAutor Chayemor
Müssen Sie sich das applet also es kann eine Verbindung zu einem anderen host als die Sie geladen wurden, und Sie entweder müssen Sie ein non-self-signed-Zertifikat oder muss der Benutzer das Zertifikat akzeptieren, wenn Sie dazu aufgefordert werden.
Also Sie haben zufrieden eine der drei Bedingungen, die ich aufgezählt.
Ich verstehe nicht, was die Bedingungen wherent erfüllt. Sie fragte das applet signiert werden, entweder mit einem non-self-signed-Zertifikat oder ein selbstsigniertes-ein (in dem letzten Fall, wird der Benutzer aufgefordert, zu akzeptieren, führen Sie das applet auch wenn es unterzeichnet wurde von einer nicht-autorisierten Person, das heißt, es hat ein selbst-signiertes Zertifikat). Ich habe alle, die, wenn Sie ausgeführt auf den browser, den ich aufgefordert wurde, und ich akzeptierte die Bedingungen, und sagte es, um es auszuführen. Es hatten immer die gleiche Ausnahme.
InformationsquelleAutor user207421
Mehrere Dinge zu betrachten:
1) überprüfen und stellen Sie sicher, dass Ihr applet signieren ist richtig:
2) Schauen Sie, crossdomain.xml:
3) Blick auf applet.Politik
InformationsquelleAutor paulsm4
Verteilen Sie das Programm mit der JNLP mit der Unterschrift ist leicht und lösen diese Art von Situationen.
Check-tutorials über JNLP Ihrer IDE und Lesen Sie diese für mehr info:
http://docs.oracle.com/javase/6/docs/technotes/guides/jweb/deployment_advice.html
Ihre app muss ausgeführt werden, aus der sandbox den Zugriff auf mehr Ressourcen, und es ist ein weiterer Weg, das zu erreichen es auch, aber der ist eher nervig für die user, die akzeptieren nur eine Unterschrift.
InformationsquelleAutor Daniel De León