繁体   English   中英

Java Applet无法通过浏览器访问mysql

[英]Java applet can't access mysql via browser

我的Java小程序连接到localhost上的mysql数据库以进行测试。 当我从eclipse运行它时,它工作正常,但是它无法通过浏览器访问数据库。 我想知道是因为浏览器由于某种原因不支持localhost db或我的代码有问题。 如果浏览器不支持它,是否可以以某种方式对其进行测试而无需在服务器上上传?

原因是因为您的小程序没有访问计算机上本地端口的安全权限。 Java这样做是为了保护人们的计算机。 考虑一下您是否打开了网页,并且允许Applet访问本地端口。 您可能在几秒钟内就将计算机黑客了。

如果要按照自己的方式进行操作,则需要将小程序打包到jar文件中,对其进行签名并进行验证,以便它可以接收这些权限。 如果您有兴趣,这里是一些信息给您:

如何创建一个jar文件
如何签名和验证jar文件
如何运行jar打包软件

如果您要采用这种方法,那么所有这些都是很棒的资源。 我要做的是设置一个Servlet(请参阅duffymo的答案)或设置一个ProxyServer,以在您的计算机和applet之间中继信息。 如果您需要更多信息,请告诉我,我可以提供。


编辑:

这是很多代码,但是我想您会明白的,我希望这会有所帮助。 当然,您将必须编写连接到服务器并从数据库请求信息的客户端。

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内容添加到服务器,然后编写applet的客户端部分。 祝好运!

我建议在小程序和数据库之间放置一个servlet。 您不应该这样将数据库公开到Web。 最好让applet将请求发送到servlet,并让它代表它进行干预。 Servlet可以验证和授权,验证和绑定输入,并编组响应以发送回去。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM