Java 复制/粘贴在已签名的小程序中不起作用

Java 复制/粘贴在已签名的小程序中不起作用,java,applet,clipboard,next-generation-plugin,signed-applet,Java,Applet,Clipboard,Next Generation Plugin,Signed Applet,我有一个已签名的小程序(它通过jarsigner正确验证),由于某种原因,它不允许从系统剪贴板复制并粘贴到JTextField,尽管文档告诉我它应该适用于已签名的小程序 此外,我还有其他小程序,它们使用相同的密钥文件进行签名,允许我复制和粘贴文本。我在网上到处搜索,似乎找不到任何线索。让我毛骨悚然的是,似乎没有办法调试它(控制台中没有输出-没有抛出异常) 有没有人对我如何调试这个小程序有什么想法,以找出Java不喜欢这个小程序的原因 非常感谢您的建议 事实证明,随着2011年2月Java插件1.

我有一个已签名的小程序(它通过
jarsigner
正确验证),由于某种原因,它不允许从系统剪贴板复制并粘贴到
JTextField
,尽管文档告诉我它应该适用于已签名的小程序

此外,我还有其他小程序,它们使用相同的密钥文件进行签名,允许我复制和粘贴文本。我在网上到处搜索,似乎找不到任何线索。让我毛骨悚然的是,似乎没有办法调试它(控制台中没有输出-没有抛出异常)

有没有人对我如何调试这个小程序有什么想法,以找出Java不喜欢这个小程序的原因


非常感谢您的建议

事实证明,随着2011年2月Java插件1.6.0_24的发布,从系统剪贴板进行复制和粘贴被视为安全漏洞并被禁用。您可以在小程序之间复制和粘贴。但如果您试图使用主剪贴板中的内容,则无法将其复制到中

因此,有两种解决方法。您可以回滚到该插件的早期版本。这是可行的,但很可能所有未来的版本仍将禁用复制和粘贴,所以您永远无法升级

另一种选择是提供自定义java安全策略文件,该文件允许再次访问系统剪贴板

首先找到本地Java安全策略文件。该文件名为java.policy,应该位于java安装的lib\security文件夹中。在Windows 7上,可以在C:\Program Files(x86)\Java\jre6\lib\security中找到它。 将此文件复制到您的主文件夹(例如C:\Users\Kyle)。 将文件重命名为.java.policy(注意开头的句点)。 在文本编辑器中编辑文件。找到这行文本:

// "standard" properies that can be read by anyone
在其下方添加以下行,如下所示:

// "standard" properies that can be read by anyone
permission java.awt.AWTPermission "accessClipboard";
保存文件。 在测试之前,关闭所有打开的浏览器并确保Java没有运行


来源:

除了丹尼斯的概述,请参见OTN

虽然默认情况下Ctrl-c copy不再工作,但可以为“下一代”Java插件中运行的任何小程序重新添加该功能。由于JavaWebStart存在,JWS通过提供沙盒拷贝。JNLPAPI的
javax.JNLP.ClipboardService
,以及自Sun 1.6.0_10和下一代插件以来,可以使用JWS部署嵌入式小程序,并且可以访问JNLPAPI

另见
  • 。直接链接到该线程中使用的测试小程序。它在沙盒小程序中提供了复制功能。如果它在有问题的机器上工作(浏览器、设置等等),您应该能够对其进行返工,以提供(非强制)粘贴到已签名的小程序中
  • 基于帧,包含源文件和生成文件

我不确定原因,但我使用的JTextField对象似乎没有正确连接到关键事件(可能是因为我添加了FocusListener?),但添加了以下代码:

    searchTextField.addKeyListener(new java.awt.event.KeyListener() {
        public void keyPressed(KeyEvent e) {
            //System.out.println("KEY:"+e);
            if (e.getKeyCode() == 86 && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0)) {
                java.awt.datatransfer.Clipboard clipboard = java.awt.Toolkit.getDefaultToolkit().getSystemClipboard();
                java.awt.datatransfer.Transferable clipData = clipboard.getContents(clipboard);
                String s;
                try {
                    s = (String)(clipData.getTransferData(java.awt.datatransfer.DataFlavor.stringFlavor));
                } catch (Exception ex) {
                    s = ex.toString();
                }
                searchTextField.setText(s);
            }
        }
        public void keyReleased(KeyEvent e) {
        }
        public void keyTyped(KeyEvent e) {
        }
    });
…允许我粘贴到字段中

  • 备份
    java.policy
    ,位于(例如:
    C:\ProgramFiles(x86)\java\jre7\lib\security

  • java.policy
    文件中查找行
    //任何人都可以读取的“标准”属性

  • 然后修改
    java.policy
    并添加如下内容

  • //任何人都可以读取的“标准”属性
    权限java.security.AllPermission;
    

    谢谢-我已经看到了这一点,但我的印象是,它只在未签名的小程序中被禁用(根据我的研究)。已签名的小程序仍然可以工作-另一个已签名的小程序当前允许复制和粘贴。还有什么想法吗?你用的是什么版本的java插件?你用什么浏览器测试这个?您是否收到允许/不允许复制/粘贴服务的提示?你看过clipService演示了吗?这是一个小程序,部署在多家公司的许多JVM上。我目前运行1.6.0_26,没有收到允许/禁止复制/粘贴服务的提示。如果我添加代码来处理访问系统剪贴板的操作,它允许我粘贴到字段中。@user1098932:我也有同样的问题。我将accessClipboard添加到我的策略中。我也签署了我的小程序(但它是自我签署,而不是可信的签署)。我认为它会正常运行,但仍然会发生拒绝访问错误。一些博客告诉我,self-sign applet可以在开发环境(在这种情况下,它是我的计算机)上运行。你能告诉我这是真的吗?为什么它说
    properties
    而不是
    properties
    ,在
    java.policy
    filewondering(以及@user1098932)中仍然是
    properties
    ,为什么安全修复会影响签名小程序/webstartable?也许我没有抓住要点——我认为这是允许在沙盒环境中禁用的东西?@kleopatra问题是一个复杂而微妙的问题,我并不完全理解。Sami Koivu在上的博客(链接自OTN线程)中对此进行了最好的解释。不幸的是,凯尔的博客条目和丹尼斯的答案(以及大多数阅读这篇文章的人)似乎遗漏了一点,那就是它可以通过
    ClipboardService
    修复:(是的,知道Sami的博客和ClipboardService,但他说的是来自不可信源的潜在有害Java代码获得了对系统剪贴板的读/写访问权(漏洞1和2),和完全权限升级,以用户的权限做任何事情..他对c&p要求的评论符合我的预期我想如果你能签署你的小程序,它将解决这个问题我可能很幼稚:-)如果我经历了签署的所有麻烦,我不必担心Allen的安全限制,即使受信任的小程序(通常)也会有一个沙盒。像
    System.exit(n)
    这样的东西永远不应该在小程序中调用。