Я не уверен, правильно ли я понял ваш последний комментарий. Как вы утверждаете два (для меня) разных вещей:
- используется plugin.jar (что значит для меня ваша Java вызывает функцию JavaScript)
- «я называем ту же функцию с Javascript» (который означает для меня ваши javascript-вызовы java-функции)
Я предполагаю, что более поздняя из них является правильной интерпретацией.
Если вы просто вызываете java-методы (через liveconnect), которые ничего не делают, все связанные с безопасностью все в порядке. И вы можете просто сделать (предполагая апплет с id="myapplet"
) myapplet.safeMethod();
прямо в вашем javascript-коде.
Основная проблема с вызовами java-методов, которые делают что-то, что обычно ограничено для апплетов, из javascript заключается в том, что вызовы, как представляется, запускаются в другом контексте в JVM, а затем сам апплет. Таким образом, они рассматриваются как непривилегированный код, и вы получаете AccessControlException
. Хотя, например, как и в моем другом ответе, методы, которые выполняются самим аплетом, получают правильные разрешения и выполняются.
Теперь, если вы читаете это LiveConnect Support in the New Java™ Plug-In Technology в разделе 2.8 Security Model of JavaScript-to-Java Calls ВС утверждает
Когда вызов JavaScript к Java является сделано, код JavaScript моделируется как будто это прибывало из ненадежного апплета, чьи происхождение кода - - основание документа (то есть URL-адрес - каталог, содержащий документ ).
Я читал это как: Если апплет и javascript поступают с одного и того же сайта, а вызовы javascript-to-java должны запускаться с теми же правами, что и сам апплет. Что в нашем случае означает любые права, которые мы устанавливаем в нашем grant
.
Но это работает только для Opera. FF и IE6 оба бросают AccessControlException
. Но это может по-прежнему работать для вас во всех браузерах.
Этот код имеет два способа: userName2()
и userName()
. userName2()
WFM во всех браузерах. userName()
работает только в Опере. Проверьте, нажав кнопки на странице html.
Как вы можете видеть, userName2()
не может использоваться как реальный usecase (может быть вызван только один раз). Но вы можете посмотреть в решение кто-то придумал, когда с подобной проблемой, и, соответственно, расширить userName2()
Java Applet using LiveConnect
Кроме того, вы могли бы рассмотреть что-то я не попробовать. Все вызовы от javascript-to-java не делают ничего связанного с безопасностью (при необходимости) передачи данных и немедленного возврата. Затем апплет выполняет фактическую работу (как в приведенной выше ссылке).Затем, когда закончил апплет может стрелять обратного вызова в страницу HTML с помощью JSObject
(plugin.jar)
TestApp.java
import java.applet.Applet;
import java.awt.*;
import java.security.AccessControlException;
public class TestApp extends Applet {
Label output = new Label("What is the value of user.name?");
String userName;
Thread access = new Thread() {
@Override
public void run() {
try {
userName = System.getProperty("user.name");
} catch (AccessControlException e) {
userName = "Oops, failed in thread. No read permissions!";
}
}
};
public void init() {
setLayout(new BorderLayout());
add(BorderLayout.CENTER, output);
}
public String userName2() throws InterruptedException {
access.start();
access.join();
output.setText(userName);
return userName;
}
public String userName() {
String userName = "Oops, failed in liveconnect-context. No read permissions!";
try {
userName = System.getProperty("user.name");
} catch (AccessControlException e) {
e.printStackTrace();
}
output.setText(userName);
return userName;
}
}
test.html
<html><head><title>test</title></head><body>
<applet id="myapplet" code="TestApp" width="350px" height="80px"></applet><br>
<input type="button" value="liveconnect version" onclick="javascript:alert(myapplet.userName());"><br>
<input type="button" value="hacky thread version" onclick="javascript:alert(myapplet.userName2());">
</body></html>
Политика: .java.policy (созданный вручную в C:/Documents and Settings/[USERNAME]/Примечание ведущий .
)
grant codeBase "http://[domain].xxx/-" {
permission java.util.PropertyPermission "user.name", "read";
};
Возможно, вам нужно подписать апплет для всех разрешений? (с самогенерированным сертификатом?) – rsp
Я пробовал самоподписывание апплета, но ящик, который должен появиться для пользователя, чтобы позволить апплету запускаться под сертификатом, никогда не появляется. Я проверил файл jar, и в метаданных был сертификат RSA. Более того, солнце заявляет, что поле утверждения сертификата может не отображаться с самозаверяющими сертификатами. Из-за этого я изучаю изменение прав доступа к java.policy. – MadeiraA