Java小程序可以';t通过浏览器访问mysql

Java小程序可以';t通过浏览器访问mysql,java,mysql,applet,Java,Mysql,Applet,我的Java小程序连接到本地主机上的mysql数据库进行测试。当我从eclipse运行它时,它工作得很好,但它不能通过浏览器访问db。我想知道是因为浏览器出于某种原因不支持localhost db,还是我的代码有问题。如果浏览器不支持它,是否可以在不上传到服务器上的情况下测试它?我建议在applet和数据库之间放置一个servlet。您不应该像那样向web公开数据库。最好让小程序向servlet发送请求,并让它代表它进行调解。servlet可以对输入进行身份验证和授权、验证和绑定,并整理响应以发

我的Java小程序连接到本地主机上的mysql数据库进行测试。当我从eclipse运行它时,它工作得很好,但它不能通过浏览器访问db。我想知道是因为浏览器出于某种原因不支持localhost db,还是我的代码有问题。如果浏览器不支持它,是否可以在不上传到服务器上的情况下测试它?

我建议在applet和数据库之间放置一个servlet。您不应该像那样向web公开数据库。最好让小程序向servlet发送请求,并让它代表它进行调解。servlet可以对输入进行身份验证和授权、验证和绑定,并整理响应以发送回

我建议在applet和数据库之间放置一个servlet。您不应该像那样向web公开数据库。最好让小程序向servlet发送请求,并让它代表它进行调解。servlet可以对输入进行身份验证和授权、验证和绑定,并整理响应以发送回

原因是您的小程序没有访问计算机上本地端口的安全权限。Java这样做是为了保护人们的计算机。想想如果你打开了一个网页,小程序被允许访问你的本地端口。您的计算机可能会在几秒钟内被黑客攻击。

如果您想以您现在的方式进行攻击,您需要将小程序打包到jar文件中,对其进行签名并进行验证,以便它能够接收这些权限。如果您感兴趣,以下是一些信息:



如果你想采用这种方法,那么所有这些都是很好的资源。我要做的是设置一个Servlet(参见duffymo的回答)或设置一个代理服务器来在计算机和小程序之间传递信息。如果你想要更多的信息,请告诉我,我可以提供


编辑:

这是一个很大的代码,但我想你会得到的想法,我希望这有帮助。当然,您必须编写连接到服务器并从数据库请求信息的客户端

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
    }
}

您的小程序将连接到此服务器,然后您可以向服务器发送消息以请求数据库中的信息。您所要做的就是将mysql内容添加到服务器,然后编写小程序的客户端部分。祝你好运

原因是您的小程序没有访问计算机上本地端口的安全权限。Java这样做是为了保护人们的计算机。想想如果你打开了一个网页,小程序被允许访问你的本地端口。您的计算机可能会在几秒钟内被黑客攻击。

如果您想以您现在的方式进行攻击,您需要将小程序打包到jar文件中,对其进行签名并进行验证,以便它能够接收这些权限。如果您感兴趣,以下是一些信息:



如果你想采用这种方法,那么所有这些都是很好的资源。我要做的是设置一个Servlet(参见duffymo的回答)或设置一个代理服务器来在计算机和小程序之间传递信息。如果你想要更多的信息,请告诉我,我可以提供


编辑:

这是一个很大的代码,但我想你会得到的想法,我希望这有帮助。当然,您必须编写连接到服务器并从数据库请求信息的客户端

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
    }
}

您的小程序将连接到此服务器,然后您可以向服务器发送消息以请求数据库中的信息。您所要做的就是将mysql内容添加到服务器,然后编写小程序的客户端部分。祝你好运

问题可能与安全有关。检查Java控制台是否有错误。如果applet&(访问DB的DB/servlet)来自同一个主机,并且applet使用正确的方式形成连接,则可以对其进行沙盒部署。这是一个非常糟糕的体系结构,即使您跳过了必要的限制以使其工作。您不应该让远程系统上的代码直接访问您的数据库。编写一个servlet来处理需要公开的特定操作,并让小程序与servlet交互。如果我对duffymo的评论不完全清楚,请不要允许小程序直接访问数据库。这是灾难的秘诀。相反,创建一个servlet(PHP/ASP/.whatever)来调解对数据库的访问,并限制用户可以做什么。问题可能与安全相关。检查Java控制台是否有错误。如果applet&(访问DB的DB/servlet)来自同一个主机,并且applet使用正确的方式形成连接,则可以对其进行沙盒部署。这是一个非常糟糕的体系结构,即使您跳过了必要的限制以使其工作。您不应该让远程系统上的代码直接访问您的数据库。编写一个servlet来处理需要公开的特定操作,并让小程序与servlet交互。如果我对duffymo的评论不完全清楚,请不要允许小程序直接访问数据库。这是灾难的秘诀。相反,创建一个servlet(PHP/ASP/.whatever)来调解对数据库的访问,并限制用户可以做的事情。这一点很好,但它并不是对直接问题的回答(虽然应用了相同的小程序安全约束)…很有趣,因为每个回答或评论的人都在我之后推荐了一个servlet。我真的不在乎回答眼前的问题;我宁愿指出正确的事情,即使没有人要求这样做。这很公平。我完全同意不允许小程序直接访问数据库。但这不是我的观点。您的评论(作为答案发布)也不是对所述问题的答案。OP在访问servlet(/whatever)时将面临与当前完全相同的问题