2012-06-04 5 views
1

Мой Java-апплет подключается к базе данных mysql на локальном хосте для тестирования. Он отлично работает, когда я запускаю его из eclipse, но он не может получить доступ к db через браузер. Я хотел знать, это потому, что браузер почему-то не поддерживает localhost db по какой-то причине или у меня проблемы с моим кодом. И если браузеры просто не поддерживают его, можно ли как-то протестировать его без загрузки на сервер?Java-апплет не может получить доступ к mysql через браузер

+0

Проблема, скорее всего, связанная с безопасностью. Проверьте наличие ошибок в консоли Java. Если апплет & (DB/servlet для доступа к БД) находится от одного и того же хоста, и апплет использует правильный способ формирования соединения, он может быть развернут с песком. –

+3

Это действительно плохая архитектура, даже если вы перепрыгиваете через необходимые обручи, чтобы заставить ее работать. Вы никогда не должны позволять коду на удаленных системах иметь прямой доступ к вашей базе данных. Напишите сервлет, чтобы обработать конкретные операции, которые вам нужно выставить, и связать апплет с сервлетом. –

+0

Если это не совсем ясно из моих комментариев к duffymo, *** Не позволяйте апплетам иметь прямой доступ к БД. Это рецепт катастрофы. *** Вместо этого создайте сервлет (PHP/ASP/.. независимо), который опосредует доступ к БД и ограничивает возможности пользователя. –

ответ

0

Я бы рекомендовал установить сервлет между апплетом и базой данных. Вы не должны публиковать базу данных в Интернете. Лучше, чтобы апплет отправлял запросы сервлету и позволял ему ходатайствовать от его имени. Сервлет может аутентифицировать и авторизировать, проверять и связывать входы и маршировать ответ для отправки.

+0

Хороший вопрос, но это не ответ на ближайший вопрос (думают, что применяются те же ограничения безопасности апплета). –

+0

Забавно, потому что каждый, кто отвечал или комментировал, рекомендовал сервлет после того, как я это сделал.Меня не волнует ответ на ближайший вопрос; Я бы лучше указал на правильную вещь, даже если этого не просили. – duffymo

+0

Достаточно честный. И FWIW я полностью согласен с тем, что апплет не должен иметь прямого доступа к БД. Но это не моя точка зрения. Также ваш комментарий (отправленный как ответ) является ответом на указанную проблему. OP столкнулся бы с ** той же проблемой **, обращающейся к сервлету (/ независимо), как они видят в данный момент (если только они смотрели на консоль). Не поймите меня неправильно, вы выдаете очень много проницательных ответов, но я просто думаю, что вы вне базы на этом. –

1

Причина в том, что ваш апплет не имеет разрешений безопасности для доступа к локальным портам на компьютере. 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 на сервер, а затем написать клиентскую часть вашего апплета. Удачи!

+0

Я подписал свой апплет, но он по-прежнему не может напрямую подключиться к mysql ... Я знаю, что это не очень хорошая идея, но это сделано только для немногих людей, поэтому это не имеет большого значения. – John

+0

Я бы серьезно подумал о создании прокси-сервера какого-то рода, если вы хотите увидеть и пример, дайте мне знать – John

+0

Да, это было бы очень приятно. Можете ли вы привести мне пример того, как выполнить любой запрос таким образом? В остальном я, скорее всего, поразмыслим, это мой первый раз, когда я делаю некоторые вещи или сетевые материалы ... спасибо. – John

Смежные вопросы