Чтобы заменить Java-апплет, вы можете использовать локальный сервис, который реализует интерфейс restful.
Запустить локальный сервис с простым запросом GET к файлу jnlp
.Например, http://example.com/localservice.jnlp Это загрузит, установит и запустит локальную службу (требования к ней как апплет - она должна быть подписана).Как только локальная служба была успешно запущена, веб-приложение может отправлять и считывать данные из нее, так же как это было бы с любым веб-сервером.Однако следует иметь в виду, что браузеры не допускают перекрестных запросов.Следовательно, либо CORS header
из локальной службы должен быть возвращен, либо адрес, который он прослушивает (127.0.0.1
), должен быть частью домена приложения (это делается с помощью субдомена с A
записью для 127.0.0.1
, например,localhost.example.com
)
Вот пример преобразования (довольно грубый) Это локальная служба, которая прослушивает порт 8888 для входящих HTTP-запросов и возвращает ответ JSON.
public class LocalService {
public LocalService() {
}
public static void main(String[] args) throws IOException {
HttpServer server = HttpServer.create(new InetSocketAddress("localhost", 8888), 0);
server.setExecutor(Executors.newSingleThreadExecutor());
server.createContext("/", httpExchange -> {
StringBuilder builder = new StringBuilder();
int read;
byte buffer[] = new byte[1024];
InputStream is = httpExchange.getRequestBody();
while ((read = is.read(buffer)) != -1) {
builder.append(new String(buffer, 0, read));
}
is.close();
String response = String.format("{\"request\": \"%s\"}", builder.toString());
Headers headers = httpExchange.getResponseHeaders();
headers.add("Content-Type", "application/json");
headers.add("Access-Control-Allow-Origin", "*");
httpExchange.sendResponseHeaders(200, response.length());
OutputStream os = httpExchange.getResponseBody();
os.write(response.getBytes());
os.flush();
os.close();
});
server.start();
}
}
ЭтоФайл JNLP, используемый для запуска службы.
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="" href="">
<information>
<title>Local Service</title>
</information>
<resources>
<!-- Application Resources -->
<jar href="http://example.com/localservice.jar" main="true" />
</resources>
<security>
<all-permissions/>
</security>
<application-desc name="Local Service" main-class="LocalService">
</application-desc>
<update check="background"/>
</jnlp>
И это HTML-страница, которая автоматически или вручную запускает службу и отправляет и получает от нее данные
<!DOCTYPE html>
<html>
<head>
<title>Local Service</title>
<script
src="https://code.jquery.com/jquery-3.3.1.min.js"
integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
crossorigin="anonymous"></script>
<script>
$(function() {
$('#send').click(function() {
$.ajax({
method: 'POST',
url: 'http://localhost:8888', // or localhost.example.com:8888
data: $('#data').val(),
success: function(data, textStatus, jqXHR) {
alert(data.request);
},
error: function(jqXHR, textStatus, errorThrown) {
alert(errorThrown);
}
});
});
});
</script>
</head>
<body>
<h1>Local Service</h1>
<!-- auto load local service -->
<iframe style="display: none;" src="localservice.jnlp"></iframe>
<a href="localservice.jnlp">Run Local Service Manually</a>
<div style="margin-top: 50px;">
<input id="data"/>
<button id="send">Send</button>
</div>
</body>
</html>