Я не уверен, правильно ли я понял ваш последний комментарий. Как вы говорите две (для меня) разные вещи:
- Вы используете plugin.jar (что означает для меня ваши java-вызовы функций javascript)
- " Я вызываю те же функции из Javascript " (что для меня означает, что ваш javascript вызывает функции Java)
Я полагаю, что последняя является правильной интерпретацией.
Если вы просто вызываете методы java (через liveconnect), которые ничего не делают для безопасности, все в порядке. И вы можете просто сделать (если апплет с id="myapplet"
) myapplet.safeMethod();
прямо в вашем коде JavaScript.
Основная проблема с вызовом java-методов, которые обычно делают что-то ограниченное для апплетов из javascript, заключается в том, что вызовы, похоже, выполняются в ином контексте в JVM, чем сам апплет. Таким образом, рассматриваются как непривилегированный код, и вы получаете AccessControlException
. Хотя, например, Как и в моем другом ответе, методы, которые выполняются самим апплетом, получают необходимые разрешения и выполняются.
Теперь, если вы прочитаете это Поддержка LiveConnect в новой технологии подключаемых модулей Java ™ в разделе 2.8 Модель безопасности вызовов JavaScript-Java Состояния SUN
Когда вызов JavaScript-Java
сделано, код JavaScript смоделирован
как будто это исходит от
ненадежный апплет, чей источник кода
база документов (т. е. URL-адрес
каталог, содержащий
документ).
Я читаю это так: если апплет и javascript приходят с одного и того же сайта, то вызовы javascript-to-java должны выполняться с теми же разрешениями, что и сам апплет. Что в нашем случае означает, с какими правами мы устанавливаем наши grant
.
Но это работает только в Опере для меня. FF и IE6 оба выбрасывают AccessControlException
. Но это может сработать для вас во всех браузерах.
В следующем коде есть два метода userName2()
и userName()
. userName2()
WFM во всех браузерах. userName()
работает только в Опере. Проверьте, нажав кнопки на html-странице.
Как видите, userName2()
не может использоваться таким образом для реального использования (может вызываться только один раз). Но вы можете найти решение, которое придумал кто-то другой, когда у вас возникла подобная проблема, и соответственно расширить userName2()
Java-апплет с использованием 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 / [ИМЯ ПОЛЬЗОВАТЕЛЯ] / Обратите внимание на начальную .
)
grant codeBase "http://[domain].xxx/-" {
permission java.util.PropertyPermission "user.name", "read";
};