Мой Java-апплет подключается к базе данных mysql на локальном хосте для тестирования. Он отлично работает, когда я запускаю его из eclipse, но он не может получить доступ к db через браузер. Я хотел знать, это потому, что браузер почему-то не поддерживает localhost db по какой-то причине или у меня проблемы с моим кодом. И если браузеры просто не поддерживают его, можно ли как-то протестировать его без загрузки на сервер?Java-апплет не может получить доступ к mysql через браузер
ответ
Я бы рекомендовал установить сервлет между апплетом и базой данных. Вы не должны публиковать базу данных в Интернете. Лучше, чтобы апплет отправлял запросы сервлету и позволял ему ходатайствовать от его имени. Сервлет может аутентифицировать и авторизировать, проверять и связывать входы и маршировать ответ для отправки.
Хороший вопрос, но это не ответ на ближайший вопрос (думают, что применяются те же ограничения безопасности апплета). –
Забавно, потому что каждый, кто отвечал или комментировал, рекомендовал сервлет после того, как я это сделал.Меня не волнует ответ на ближайший вопрос; Я бы лучше указал на правильную вещь, даже если этого не просили. – duffymo
Достаточно честный. И FWIW я полностью согласен с тем, что апплет не должен иметь прямого доступа к БД. Но это не моя точка зрения. Также ваш комментарий (отправленный как ответ) является ответом на указанную проблему. OP столкнулся бы с ** той же проблемой **, обращающейся к сервлету (/ независимо), как они видят в данный момент (если только они смотрели на консоль). Не поймите меня неправильно, вы выдаете очень много проницательных ответов, но я просто думаю, что вы вне базы на этом. –
Причина в том, что ваш апплет не имеет разрешений безопасности для доступа к локальным портам на компьютере. Java делает это для защиты компьютеров людей. Подумайте, открыли ли вы веб-страницу, и Applet получил доступ к вашим локальным портам. Вы могли бы взломать ваш компьютер за считанные секунды.
Если вы хотите сделать это так, как вы это делаете, вам нужно упаковать свой апплет в файл jar, подписать его и проверить, чтобы он мог получать эти разрешения. Вот некоторая информация для вас, если вы заинтересованы:
How to create a jar file
How to sign and verify a jar file
How to run jar packaged software
Все те большие ресурсы, если тот подход вы хотите взять. Что бы я сделал, это настроить сервлет (см. Ответ duffymo) или настроить ProxyServer для передачи информации между вашим компьютером и апплетом. Если вам нужна дополнительная информация, дайте мне знать, и я могу ее предоставить.
Edit:
Это своего рода много кода, но я думаю, вы получите идею, я надеюсь, что это помогает. Вам, конечно, придется написать клиентский конец, который подключается к серверу и запрашивает информацию из базы данных.
DatabaseServer.java:
import java.io.IOException;
import java.net.*;
import java.util.ArrayList;
import java.util.Iterator;
public class DatabaseServer implements Runnable
{
public DatabaseServer()
{
System.out.println("Created new server!");
clients = new ArrayList<Client>(); // this is a list of all the clients connected to the server
connected = false;
running = false;
connect(); // starts server
}
public void run()
{
System.out.println("Waiting for clients.../n");
while(running)
{
try
{
Socket socket = server.accept(); // waits for a client to connect
System.out.println("Client connected! "+socket.getInetAddress());
Client client = new Client(this, socket); // creates a new client object
clients.add(client);// adds it to the list
// cleans the client list everytime a new client connects
Iterator<Client> it = clients.iterator();
while(it.hasNext())
{
Client next = it.next();
if(!next.connected)
{
next.disconnect();
it.remove();
}
}
}catch(IOException e){e.printStackTrace();}
}
}
public void connect()
{
if(!connected)
{
System.out.println("starting server...");
try
{
System.out.println("opening port...");
server = new ServerSocket(8080); // opens a server socket
System.out.println("server started on port: "+server.getLocalPort());
running = true;
connected = true;
thread = new Thread(this);// starts the server thread
thread.start();
}catch(Exception e){e.printStackTrace(); connected = false; running = false;}
}
}
public void disconnect()
{
//stops the server
try
{
server.close();
}catch(Exception e){e.printStackTrace();}
server = null;
if(thread != null)
thread.interrupt();
thread = null;
connected = false;
running = false;
}
public void handleMessage(Client client, String message)
{
/* this is where you do your database interactions, based on the message you can pull out specific
* information from your database and then send it back to the client using client.sendMessage()
*/
}
private Thread thread;
private boolean running;
private boolean connected;
private ServerSocket server;
private ArrayList<Client> clients;
public static void main(String args[])
{
new DatabaseServer(); // makes a new server
}
}
Client.java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class Client implements Runnable
{
public Client(DatabaseServer server, Socket socket)
{
this.socket = socket;
this.server = server;
try
{
connected = true;
writer = new PrintWriter(socket.getOutputStream()); // opens an output stream
reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); // opens an input stream
running = true;
thread = new Thread(this);
thread.start();// starts the client thread
}catch(Exception e){e.printStackTrace(); connected = false;}
}
public void run()
{
try
{
String message = "";
while((message = reader.readLine()) != null & running & connected) // waits for a message to be recieved
{
server.handleMessage(this, message); // tells server to handle message
}
}catch(IOException e){e.printStackTrace(); connected = false;}
}
public void disconnect()
{
// disconnects client
try
{
socket.close();
}catch(Exception e){e.printStackTrace();}
try
{
reader.close();
}catch(Exception e){e.printStackTrace();}
try
{
writer.close();
}catch(Exception e){e.printStackTrace();}
socket = null;
reader = null;
writer = null;
if(thread != null)
thread.interrupt();
thread = null;
connected = false;
running = false;
}
public void sendMessage(String message)
{
// sends a message back to the client
writer.println(message);
writer.flush();
}
public boolean connected;
private boolean running;
private Thread thread;
private DatabaseServer server;
private Socket socket;
private PrintWriter writer;
private BufferedReader reader;
}
Ваш апплет будет подключаться к этому серверу, а затем вы можете отправлять сообщения на сервер, чтобы запросить информацию из базы данных. Все, что вам нужно сделать, это добавить материал mysql на сервер, а затем написать клиентскую часть вашего апплета. Удачи!
Я подписал свой апплет, но он по-прежнему не может напрямую подключиться к mysql ... Я знаю, что это не очень хорошая идея, но это сделано только для немногих людей, поэтому это не имеет большого значения. – John
Я бы серьезно подумал о создании прокси-сервера какого-то рода, если вы хотите увидеть и пример, дайте мне знать – John
Да, это было бы очень приятно. Можете ли вы привести мне пример того, как выполнить любой запрос таким образом? В остальном я, скорее всего, поразмыслим, это мой первый раз, когда я делаю некоторые вещи или сетевые материалы ... спасибо. – John
- 1. «vagrant up» ok, но не может получить доступ через браузер
- 2. Как получить доступ к приложению через браузер?
- 3. Доступ к экрану через браузер
- 4. Wsdl файл не может получить доступ через браузер
- 5. Не удается получить доступ к сервису WCF через браузер
- 6. Может получить доступ к удаленному компоненту json через браузер, но не программно через $ .getJSON()
- 7. браузер приложение не может получить доступ к loki.js
- 8. Браузер не может получить доступ к файлу css
- 9. Заблокировать доступ к веб-сайту через браузер
- 10. Не удается получить доступ к MySQL через MySQL Workbench или HeidiSQL, но может получить доступ через оболочку
- 11. Доступ к концентратору SignalR через браузер
- 12. Доступ к меню настроек через браузер
- 13. Доступ к графическому процессору через веб-браузер
- 14. не может получить доступ к mysql в zend-сервере
- 15. Невозможно получить доступ к интерфейсу rexster через браузер - соединение отклонено
- 16. Доступ к файлам SmartGWT * .ds.xml можно получить через веб-браузер
- 17. boot2docker windows 10, неспособный получить доступ к контейнеру через браузер
- 18. не может получить доступ к базе данных MySQL для Drupal
- 19. ubuntu tomcat localhost может получить доступ к веб-сайту, но внешний браузер не может открыть
- 20. Доступ к mysql через терминал
- 21. Как получить доступ к ядру Spark через браузер?
- 22. Как получить доступ к установленным приложениям через браузер
- 23. Как получить доступ к пользовательскому интерфейсу Kubernetes через браузер?
- 24. Доступ к файлам temp coldfusion через браузер
- 25. Безопасный доступ к Elasticsearch через браузер
- 26. не может получить доступ к базе данных MySQL из питона
- 27. EasyPHP не может получить доступ к PhpMyAdmin
- 28. доступ к веб-службам не достигается через браузер
- 29. не может получить доступ к базовому набору через объектную нотацию
- 30. не может получить доступ к PrestaShop WebService через getJSON
Проблема, скорее всего, связанная с безопасностью. Проверьте наличие ошибок в консоли Java. Если апплет & (DB/servlet для доступа к БД) находится от одного и того же хоста, и апплет использует правильный способ формирования соединения, он может быть развернут с песком. –
Это действительно плохая архитектура, даже если вы перепрыгиваете через необходимые обручи, чтобы заставить ее работать. Вы никогда не должны позволять коду на удаленных системах иметь прямой доступ к вашей базе данных. Напишите сервлет, чтобы обработать конкретные операции, которые вам нужно выставить, и связать апплет с сервлетом. –
Если это не совсем ясно из моих комментариев к duffymo, *** Не позволяйте апплетам иметь прямой доступ к БД. Это рецепт катастрофы. *** Вместо этого создайте сервлет (PHP/ASP/.. независимо), который опосредует доступ к БД и ограничивает возможности пользователя. –