2012-06-04 2 views
1

내 Java 애플릿은 테스트 목적으로 로컬 호스트의 mysql 데이터베이스에 연결됩니다. 그것은 일식에서 실행할 때 잘 작동하지만 브라우저를 통해 db에 액세스 할 수 없습니다. 브라우저가 localhost db를 지원하지 않거나 내 코드에 문제가 있기 때문에 알고 싶습니다. 브라우저가 지원하지 않는다면 서버에 업로드하지 않고 어떻게 든 테스트 할 수 있습니까?Java 애플릿이 브라우저를 통해 mysql에 액세스 할 수 없습니다.

+0

보안 관련 문제 일 가능성이 큽니다. Java 콘솔에서 오류를 확인하십시오. 애플릿 & (DB/Servlet to DB)이 동일한 호스트에 있고 애플릿이 올바른 연결 방법을 사용하면 샌드 박스로 전개 할 수 있습니다. –

+3

이것은 정말 나쁜 아키텍쳐입니다. 작업을하기 위해 필요한 농구를 뛰어 넘더라도 말입니다. 원격 시스템의 코드가 데이터베이스에 직접 액세스 할 수 없게해야합니다. 노출시킬 필요가있는 특정 조작을 처리하고 애플릿이 서블릿과 상호 작용하게하는 서블릿을 작성하십시오. –

+0

내 의견에서 duffymo에 대한 명확한 설명이없는 경우 *** 애플릿이 DB에 직접 액세스하지 못하게하십시오. 그건 재앙을위한 처방이다. *** 대신 DB에 대한 접근을 중재하는 서블릿 (PHP/ASP/..)을 만들고 사용자가 할 수있는 일을 제한한다. –

답변

0

애플릿과 데이터베이스 사이에 서블릿을 배치하는 것이 좋습니다. 그렇게 데이터베이스를 웹에 공개해서는 안됩니다. 애플릿이 서블릿에 요청을 보내고 그 애플릿을 대신해서 중재하게하는 것이 좋습니다. 서블릿은 입력을 인증하고 권한을 부여하고 유효성을 검사하고 바인딩 할 수 있으며 응답을 되돌려 보낼 수 있습니다.

+0

좋은 지적이지만 즉각적인 질문에 대한 대답이 아닙니다 (같은 애플릿 보안 제약이 적용된다고 생각합니다). –

+0

내가 한 후에 답변이나 댓글을 찍은 모든 사람이 서블릿을 추천했기 때문에 재밌습니다.나는 직접적인 질문에 답하는 것을 정말로 신경 쓰지 않는다. 나는 옳은 것을 지적하고자한다. 비록 그것이 요구되지 않더라도. – duffymo

+0

충분히 좋습니다. 그리고 FWIW 나는 애플릿이 DB에 직접 접근해서는 안된다는 것에 완전히 동의합니다. 그러나 그것은 내 요점이 아닙니다. 명시된 문제에 대한 답변 (답변으로 게시 됨)도 아닙니다. OP는 (콘솔을 보았을 때만) 현재보고있는 서블릿 (/ 무엇이든)에 액세스하는 ** 똑같은 ** 문제에 직면하게됩니다. 나에게 그릇된 말을하지 마라. 당신은 훌륭한 대답을 많이한다. 그러나 나는 너가이 문제에 대해 근거가 없다고 생각한다. –

1

애플릿에 컴퓨터의 로컬 포트에 액세스 할 수있는 보안 권한이 없기 때문입니다. Java는 사람들의 컴퓨터를 보호하기 위해이 작업을 수행합니다. 애플릿이 웹 페이지를 열고 로컬 포트에 액세스 할 수 있는지 생각해보십시오. 몇 초 안에 컴퓨터를 해킹 할 수 있습니다.

당신이하고있는 것처럼 그렇게하고 싶다면 애플릿을 jar 파일로 패키지화하고 서명 한 다음 확인하여 해당 권한을받을 수 있도록해야합니다. 당신이 관심이 있다면 여기에 대한 몇 가지 정보는 다음과 같습니다 접근 먹으 렴 촬영할 경우

How to create a jar file
How to sign and verify a jar file
How to run jar packaged software

사람들의 모든

큰 자원입니다. 내가 뭘 할 것이라고 서블릿 (duffymo의 답변을 참조) 설치 또는 ProxyServer 컴퓨터와 애플릿 사이의 정보를 릴레이 설정입니다. 더 자세한 정보를 원하면 알려 주시면 제공 할 수 있습니다.


편집 :

이 많은 코드의 일종이다하지만 난이 도움이되기를 바랍니다, 당신은 아이디어를 얻을 것이라 생각합니다. 물론 서버에 연결하고 데이터베이스의 정보를 요청하는 클라이언트 쪽을 작성해야합니다.

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

네, 매우 좋을 것입니다. 그런 식으로 쿼리를 실행하는 방법을 보여줄 수 있습니까? 나머지는 내가 가장 잘 알아낼 것입니다, 이것은 처음으로 일부 DB 또는 네트워킹 물건을 만드는 것입니다 ... 감사합니다. – John

관련 문제