【问题标题】:Java Plug In support in browser to be depricated.. Alternative solution for an Applet to access Client File System?不推荐使用浏览器中的 Java 插件支持。Applet 访问客户端文件系统的替代解决方案?
【发布时间】:2018-05-17 07:02:10
【问题描述】:

我们有一个在 Oracle ADF 中开发的 Web 应用程序。

1)从文档页面下载和打开文件夹按钮,我们正在使用小程序将文件下载到客户端计算机中的某个位置并打开文件夹

2) 从文档页面 下载和打开文件按钮 ,我们正在使用小程序将文件下载到客户端计算机中的某个位置并打开这些文件

3)从文档页面打开文件夹按钮,如果存在,它将打开相应的文档文件夹。

以上 3 点已经存在并且运行良好。

现在插件支持将从浏览器中删除。我们正在寻找替代解决方案。

任何建议都会对我们有所帮助..请指教

问候 阿伦

【问题讨论】:

  • 您“您”(我假设是一家公司?)正在开发 Applet 形式的软件。随着 Applets 不再受支持,您现在正在寻找替代方案。您希望我们在这里为您提供商业建议吗?我做对了吗?
  • 我们有一个在 J2EE 框架中开发的 Web 应用程序,即“Oracle-ADF”。并且目前上述功能正在使用插件支持。不是商业建议 :) .. 从技术上讲,我们看到 JSObject API 支持将从 Java 1.8 中弃用...我们正在使用 Java 1.7 ....
  • 无用提示:如果不推荐使用并不意味着您不能使用它。已弃用的方法意味着还有其他更好的方法。
  • 感谢您的考虑,提示并非无用 :) Oracle Corp,已决定减少浏览器本身的文件系统访问,并且从 Java 1.9 开始,JSObject api 将被删除。所以我们计划在它发生之前采取行动
  • 使用以 webstart 开头的本地 Web 服务

标签: javascript java javafx applet oracle-adf


【解决方案1】:

要替换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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-09
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    相关资源
    最近更新 更多