【问题标题】:Running application from web browser从 Web 浏览器运行应用程序
【发布时间】:2014-10-23 19:20:02
【问题描述】:

我想从网站运行应用程序,例如 Windows Calculator。我考虑使用浏览器插件、Java Web Start、代理之类的东西或任何其他适用于 windows/linux 的解决方案,而无需做太多工作。

插件方式: 我看到它可以用 NPAPI 完成,但它似乎已经死了。我还查看了 FileSystemAPI 但它似乎也死了。有什么好的 API 可以做到这一点吗?

代理方式: 我想到了用户将安装的Java代理,网站将通过它与系统进行通信。

【问题讨论】:

  • 查看 Javascript stackoverflow.com/questions/2716284/… 它也许可以做这样的事情
  • 您是指运行用户已经在其计算机上安装的程序,还是运行将从您的网页托管的应用程序?
  • 您的意思是运行您自己的网络应用程序或小程序,还是说当用户单击浏览器中的按钮时在用户的硬盘上运行 Windows 计算器?
  • @JasonSperske @markspace - 是的,这就是我要说的。执行,例如,C:\Windows\System32\calc.exe。我熟悉 Glassfish 和 Tomcat 等 Web 服务器,并在那里部署 war Web 应用程序。而且,据我所知,我无法在服务器端使用 Java 触发用户本地程序的执行。
  • 真的没有办法做到这一点。访问系统资源(如本地运行的应用程序)是病毒会使用的攻击媒介。可能是通过运行一个小程序来请求用户访问系统,但在这里浏览器会显示一个严厉的警告,不授予此访问权限

标签: java npapi browser-plugin html5-filesystem


【解决方案1】:

您是否愿意使用Applet

您可以将小程序附加到网页上,然后将其下载到客户端站点。您将能够执行操作。

【讨论】:

  • 小程序正在消失; Java 1.9 发布后,它们将无法运行
  • @SheldonR。我同意。所以这就是投反对票的原因?
  • 是的。我现在不得不自己处理小程序替换,这就是为什么我这样说和投票的原因......
【解决方案2】:

我已经通过 Java Web Start 做到了:

1) 我创建了 Swing 应用程序,源代码如下。基于http://java.dzone.com/articles/java-web-start-jnlp-hello教程。

代码如下:

package com.gogowitczak;

import javax.jnlp.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;

public class Main {
    static BasicService basicService = null;

    public static void main(String args[]) {
        JFrame frame = new JFrame("Mkyong Jnlp UnOfficial Guide");

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JLabel label = new JLabel();
        Container content = frame.getContentPane();
        content.add(label, BorderLayout.CENTER);
        String message = "Jnln Hello Word";

        label.setText(message);

        try {
            basicService = (BasicService)
                    ServiceManager.lookup("javax.jnlp.BasicService");
        } catch (UnavailableServiceException e) {
            System.err.println("Lookup failed: " + e);
        }

        JButton button = new JButton("http://www.mkyong.com");

        ActionListener listener = new ActionListener() {
            public void actionPerformed(ActionEvent actionEvent) {
                try {
                    Runtime.getRuntime().exec("C:\\Windows\\System32\\calc.exe");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };

        button.addActionListener(listener);

        content.add(button, BorderLayout.SOUTH);
        frame.pack();
        frame.show();
    }
}

2) 除此之外,我还创建了MANIFEST.MF 文件。

文件在src\META-INF\MANIFEST.MF 路径中:

Manifest-Version: 1.0
Main-Class: com.gogowitczak.Main
Permissions: all-permissions

3) 当然还有 .jnlp 文件,用于 Java Web Start。

文件位于src\JNLP-INF\APPLICATION.JNLP 路径中:

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+" codebase="http://localhost:8080/" href="Test.jnlp">
    <information>
        <title>Jnlp Test</title>
        <vendor>MyVendor</vendor>
        <homepage href="http://localhost:8080/" />
        <description>Testing Testing</description>
    </information>
    <security>
        <all-permissions/>
    </security>
    <resources>
        <!-- <j2se version="1.7+" /> -->
        <j2se version="1.7*" java-vm-args="-Xmx32m" max-heap-size="32m" href="http://java.sun.com/products/autodl/j2se"/>
        <jar href="jws.jar" />
    </resources>
    <application-desc main-class="com.gogowitczak.Main" />
</jnlp>

4) 应该可以直接从您使用的 IDE 编译和运行这个项目(IntelliJ 是我的)。单击按钮应打开新的 Windows 计算器窗口。

5) 从此项目创建.jar。在 IntelliJ 中很简单:文件 -> 项目结构 -> 工件 -> '+' -> jar -> 来自具有依赖关系的模块。选择com.gogowitczak.MainMain Class。确保选中复选框 Build on make

6) 再次构建项目。在&lt;project_path&gt;\out\artifacts\&lt;project_name&gt;_jar 你应该找到&lt;project_name&gt;.jar 文件。对我来说是jws.jar

7) 现在您需要创建自己的证书。需要签名.jar 文件。 您可以通过运行keytool -genkey -keystore testKeys -alias jdc 来实现。 keytool.exe 可以在 JDK 安装目录的 bin 文件夹中找到。对我来说,它是路径C:\Program Files\Java\jdk1.8.0_05\bin\keytool.exe。记住您设置的密码,其他事情现在无关紧要。该方法基于Oracle website

8) 通过执行jarsigner jsw.jar jdc 签署您的.jar。很可能它会抱怨主目录中缺少.keystore 文件。将testKeys文件移出那里,并将其名称更改为.keystore(如果Windows拒绝设置以点开头的文件名,您可以随时执行move testKeys .keystore对其进行重命名。

9) 现在你必须把它放到网络服务器上。最简单的方法是设置 Tomcat。从here 下载,将我们签名的.jar 文件连同APPLICATION.JNLP 的副本一起放入&lt;tomcat_directory&gt;\webapps\ROOT\ 目录。将APPLICATION.JNLP 重命名为Test.jnlp

10) 现在你可以试一试了。转到 gttp://localhost:8080/Test.jnlp 看看会发生什么。每次浏览器就危险向您宣战时,请继续同意执行它。如果失败,很可能是由于拒绝自签名证书引起的。打开“配置 Java”菜单并将 http://localhost:8080 条目添加到“例外站点列表”。

11) 现在再次进入网络浏览器并刷新页面。这次执行java app应该成功了,点击按钮后应该会打开Windows Calculator。

如果我做错了什么或有任何疑问,请随时发表评论。希望它会帮助某人。并记住向上投票;)

【讨论】:

    猜你喜欢
    • 2011-10-26
    • 1970-01-01
    • 2020-04-26
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    相关资源
    最近更新 更多