私のJavaアプレットは、テスト目的でローカルホスト上のmysqlデータベースに接続します。eclipseから実行すると正常に動作しますが、ブラウザーを介してdbにアクセスできません。ブラウザーが何らかの理由でローカルホストデータベースをサポートしていないか、コードに問題があるため、知りたかったのです。また、ブラウザがそれをサポートしていない場合、サーバーにアップロードせずに何らかの方法でテストすることは可能ですか?
2 に答える
その理由は、アプレットがコンピューターのローカル ポートにアクセスするためのセキュリティ アクセス許可を持っていないためです。Java は、人々のコンピュータを保護するためにこれを行います。Web ページを開いたときに、アプレットがローカル ポートへのアクセスを許可されていたかどうかを考えてみてください。数秒でコンピュータがハッキングされる可能性があります。
自分のやり方でやりたい場合は、アプレットを jar ファイルにパッケージ化し、署名して検証し、それらの権限を受け取ることができるようにする必要があります。興味のある方は、次の情報をご覧ください。
jar ファイルを作成する
方法 jar ファイルに署名して検証する
方法 jar パッケージ化されたソフトウェアを実行する方法
それがあなたが取りたいアプローチであるなら、これらはすべて素晴らしいリソースです。私がすることは、サーブレットをセットアップするか(duffymoの回答を参照)、コンピューターとアプレットの間で情報を中継するようにProxyServerをセットアップすることです。さらに情報が必要な場合はお知らせください。提供できます。
編集:
これは一種の大量のコードですが、アイデアが得られると思います。これがお役に立てば幸いです。もちろん、サーバーに接続してデータベースから情報を要求するクライアント側を作成する必要があります。
データベースサーバー.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
}
}
クライアント.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 をサーバーに追加してから、アプレットのクライアント部分を作成することだけです。幸運を!
アプレットとデータベースの間にサーブレットを配置することをお勧めします。そのようにデータベースを Web に公開するべきではありません。アプレットからサーブレットにリクエストを送信し、サーブレットに代わって介入させる方がよいでしょう。サーブレットは、入力を認証および承認し、検証およびバインドし、応答をマーシャリングして送り返すことができます。