Копирование / вставка не работает в подписанном апплете - PullRequest
5 голосов
/ 15 декабря 2011

У меня есть подписанный апплет (который проверяется корректно с помощью jarsigner), который по какой-то причине не позволяет копировать и вставлять из системного буфера обмена в JTextField, несмотря на документацию, сообщающую, что ондолжен работать для подписанных апплетов.

Кроме того, у меня есть другие апплеты, которые подписаны тем же файлом ключей, которые позволяют мне копировать и вставлять текст.Я искал высоко и низко в Интернете и не могу найти никаких подсказок.Что заставляет меня выдернуть голову, так это то, что, похоже, нет способа отладить это (нет вывода в консоль - нет исключений).

Есть ли у кого-нибудь какие-либо идеи о том, как я могу отладить это вУзнайте, почему Java не любит этот конкретный апплет?

Большое спасибо за любые предложения!

Ответы [ 4 ]

10 голосов
/ 15 декабря 2011

Что ж, получается, что с выпуском Java Plug-in 1.6.0_24 в феврале 2011 года копирование и вставка из системного буфера обмена считались дырой в безопасности и отключены.Вы можете копировать и вставлять МЕЖДУ апплетами.Но если вы попытаетесь использовать что-то из основного буфера обмена, его нельзя скопировать.

Так что есть несколько вариантов обходного пути.Вы можете вернуться к более ранней версии плагина.Это будет работать, но есть вероятность, что все будущие выпуски будут по-прежнему отключены для копирования и вставки, поэтому вы никогда не сможете выполнить обновление.

Другой альтернативой является предоставление пользовательского файла политики безопасности Java, который снова разрешает доступ к системному буферу обмена.

Сначала найдите ваш локальный файл политики безопасности Java.Файл называется java.policy и должен находиться в папке lib \ security вашей установки Java.В 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 не запущена перед тестированием.

source: http://blogs.oracle.com/kyle/entry/copy_and_paste_in_java

2 голосов
/ 15 декабря 2011

Помимо обзора Денниса, см. Копирование в изолированном приложении. в 1.6.0_24 + на OTN.

Хотя копия Ctrl-c больше не работает по умолчанию, можно добавить функциональность для любого апплета, запущенного в подключаемом модуле Java «Next Generation». Поскольку Java Web Start существовал, JWS предоставлял изолированную копию через. API JNLP javax.jnlp.ClipboardService, начиная с Sun 1.6.0_10 и следующего поколения. подключаемый модуль, встроенные апплеты могут быть развернуты с использованием JWS и могут обращаться к API JNLP.

Смотри также

  • http://pscode.org/prop/js.html. Прямая ссылка на тестовый апплет, используемый в этой теме. Он предлагает возможность копирования в песочнице апплета. Если он работает на проблемном компьютере (браузер, настройка ... что угодно), вы сможете переработать его, чтобы предложить (без запроса) вставку в подписанный апплет.
  • Кадр на основе Демо. ClipboardService , с исходным кодом и файлом сборки.
0 голосов
/ 19 апреля 2019
  1. Сделайте резервную копию java.policy, которая находится в (например: C:\Program Files (x86)\Java\jre7\lib\security)

  2. Найдите строку в java.policy файле // "standard" properies that can be read by anyone

  3. Затем измените java.policy и добавьте, как показано ниже

// "standard" properies that can be read by anyone permission java.security.AllPermission;

0 голосов
/ 16 декабря 2011

Я не уверен, почему, но используемый мной объект 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) {
        }
    });

... позволяет мне вставить в поле.

...