要替换java aplet,您可以使用实现restful接口的本地服务。
通过对 jnlp 文件的简单 GET 请求启动本地服务。例如,http://example.com/localservice.jnlp 这将下载、安装和运行本地服务(对它的要求是小程序 - 必须签名)。一旦本地服务成功启动,Web 应用程序就可以提交并从中读取数据,就像使用任何 Web 服务器一样。
但是,应该记住浏览器不允许交叉查询。因此,应该返回来自本地服务的 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>