Как разрешить моему Java-апплету использовать MySQL?

Недавно я встроил свой хобби-проект java в страницу благодаря этому самому сайту, но теперь у меня возникли проблемы с безопасностью.

У меня есть:

import java.sql.*;

и строка:

Class.forName("com.mysql.jdbc.Driver").newInstance();

а также файл mysql .jar в моем каталоге src, он работает с консоли, а в апплете отлично работает с апплетом - вплоть до этой строки forName () в моем коде, где она выдает исключение:

    Exception: com.mysql.jdbc.Driverjava.lang.ClassNotFoundException: com.mysql.jdbc.Driver
    java.security.AccessControlException: access denied (java.lang.RuntimePermission exitVM.-1)
    at java.security.AccessControlContext.checkPermission(Unknown Source)
    at java.security.AccessController.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkExit(Unknown Source)
    at java.lang.Runtime.exit(Unknown Source)
    at java.lang.System.exit(Unknown Source)
    at applet.Database.connectDB(Database.java:80)
    etc...

Я думаю, что смогу исправить это с помощью файла client.policy, иначе мне может потребоваться написать уровень абстракции, который использует сетевое соединение сервер-клиент для запроса со стороны сервера ...

Я уверен, что гуру Java знают об этом лучше всех.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
4 865
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Попробуйте избавиться от части newInstance(). Думаю, для загрузки драйвера достаточно просто Class.forName().

Ты прав, мне это не понадобилось. но он все еще не работает во встроенном апплете. Та же проблема.

Dean Rather 17.10.2008 09:32

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

Общепринятый способ сделать это - сделать HTTP-запросы данных с сервера, с которого был загружен апплет, и выполнить запросы с сервера. JSON или XML - хорошие способы обмена данными между апплетом и сервером (аналогично тому, как вы делаете приложение AJAX, отправляя XML или JSON между браузером и сервером).

Ответ принят как подходящий

Я думаю, что исключение безопасности на самом деле вызвано вызовом System.exit () в вашем апплете после Class.forName (). Обычно вам не разрешается вызывать System.exit () в неподписанных апплетах, так как он закрывает всю JVM. Вы проверили, действительно ли строка 80 является строкой Class.forName () или в строке 80 есть какой-то обработчик исключений, который пытается вызвать System.exit (), если драйвер не загружается?

В любом случае, чтобы загрузить файл jar mysql в свой апплет, вам необходимо включить его в атрибут ARCHIVE следующим образом:

<APPLET ARCHIVE = "mysql.jar" CODEBASE = "./src/" ...

После того, как вы пройдете этот этап, вам все равно нужно будет разместить сервер mysql с тем же IP-номером / именем хоста, что и веб-сервер, и открыть его для всех тех же людей, которые могут получить доступ к вашему апплету. Как сказал Тони, из соображений безопасности люди обычно поступают иначе. Лучше написать что-нибудь на стороне сервера, если у вас есть контроль над сервером приложений, и использовать XML или какой-либо другой метод обмена данными для передачи данных в апплет. Конечно, если вы просто экспериментируете, чтобы узнать об апплетах, то это, вероятно, нормально, но постарайтесь по возможности держать mysql за брандмауэром.

Добавление этого атрибута в тег HTML работает отлично! Спасибо! И благодаря всем, кто предупреждал о том, как легко получить детали аутентификации посредством декомпиляции, я подумал, что это может быть проблемой, прежде чем сделать приложение общедоступным, я буду использовать сетевой протокол и делать все на стороне сервера SQL.

Dean Rather 19.10.2008 12:58

Исключение сообщает вам, что апплет не смог загрузить класс драйвера. Ваш апплет должен загрузить jar-файл, содержащий класс, во время выполнения через HTTP, поэтому у вас должен быть jar (mysql.jar или как он там называется), доступный на веб-сервере.

Как только вы решите эту проблему, пользователь должен будет разрешить апплету разрешения, чтобы он мог установить соединение TCP-сокета с сервером mysql db. Им будет предложено диалоговое окно ...

Как упоминалось в одном из других ответов (@Leigh Caldwell), я бы сильно рекомендовал не делать этого таким образом. Если у вашего апплета есть доступ к MySQL, то и у всех остальных в мире. В наши дни декомпиляция настолько тривиальна, что для трудолюбивого хакера было бы всего лишь мгновением работы, чтобы получить учетные данные апплета в базе данных. Кроме того, аутентификация пользователя / прохода в MySQL довольно слабая, большая часть ее безопасности основана на IP. Открывая его миру, вы отбрасываете первую линию уважения.

Лучшим подходом было бы создание какого-либо внешнего протокола на стороне сервера (XMLRPC был бы хорошей основой и простым в использовании). Если апплету абсолютно необходим доступ к базе данных, лучше всего будет HSQLDB в памяти. Это не требует каких-либо разрешений для файлов и может быть запущено полностью в песочнице. Локальная база данных в памяти может быть синхронизирована с сервером по мере необходимости с использованием вышеупомянутого фасада XMLRPC.

Другие вопросы по теме