내 Java 애플릿은 테스트 목적으로 로컬 호스트의 mysql 데이터베이스에 연결됩니다. 그것은 일식에서 실행할 때 잘 작동하지만 브라우저를 통해 db에 액세스 할 수 없습니다. 브라우저가 localhost db를 지원하지 않거나 내 코드에 문제가 있기 때문에 알고 싶습니다. 브라우저가 지원하지 않는다면 서버에 업로드하지 않고 어떻게 든 테스트 할 수 있습니까?Java 애플릿이 브라우저를 통해 mysql에 액세스 할 수 없습니다.
답변
애플릿과 데이터베이스 사이에 서블릿을 배치하는 것이 좋습니다. 그렇게 데이터베이스를 웹에 공개해서는 안됩니다. 애플릿이 서블릿에 요청을 보내고 그 애플릿을 대신해서 중재하게하는 것이 좋습니다. 서블릿은 입력을 인증하고 권한을 부여하고 유효성을 검사하고 바인딩 할 수 있으며 응답을 되돌려 보낼 수 있습니다.
좋은 지적이지만 즉각적인 질문에 대한 대답이 아닙니다 (같은 애플릿 보안 제약이 적용된다고 생각합니다). –
내가 한 후에 답변이나 댓글을 찍은 모든 사람이 서블릿을 추천했기 때문에 재밌습니다.나는 직접적인 질문에 답하는 것을 정말로 신경 쓰지 않는다. 나는 옳은 것을 지적하고자한다. 비록 그것이 요구되지 않더라도. – duffymo
충분히 좋습니다. 그리고 FWIW 나는 애플릿이 DB에 직접 접근해서는 안된다는 것에 완전히 동의합니다. 그러나 그것은 내 요점이 아닙니다. 명시된 문제에 대한 답변 (답변으로 게시 됨)도 아닙니다. OP는 (콘솔을 보았을 때만) 현재보고있는 서블릿 (/ 무엇이든)에 액세스하는 ** 똑같은 ** 문제에 직면하게됩니다. 나에게 그릇된 말을하지 마라. 당신은 훌륭한 대답을 많이한다. 그러나 나는 너가이 문제에 대해 근거가 없다고 생각한다. –
애플릿에 컴퓨터의 로컬 포트에 액세스 할 수있는 보안 권한이 없기 때문입니다. 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을 서버에 추가하고 애플릿의 클라이언트 부분을 작성하기 만하면된다. 행운을 빕니다!
애플릿에 서명 했는데도 여전히 mysql에 직접 연결할 수는 없습니다 ... 좋은 생각이 아니라는 것을 알고 있습니다.하지만 몇 사람 만 만들었으므로 그다지 중요하지 않습니다. – John
당신이보기를 원한다면 예를 들어 알리고 싶은 경우, 나는 일종의 프록시 서버를 설치하는 것을 심각하게 고려할 것입니다. – John
네, 매우 좋을 것입니다. 그런 식으로 쿼리를 실행하는 방법을 보여줄 수 있습니까? 나머지는 내가 가장 잘 알아낼 것입니다, 이것은 처음으로 일부 DB 또는 네트워킹 물건을 만드는 것입니다 ... 감사합니다. – John
- 1. 브라우저를 통해 하위 도메인 URL에 액세스 할 수 없습니다.
- 2. 브라우저를 통해 웹 서비스에 액세스 할 수 없습니다.
- 3. 은 phpmyadmin에서 mysql에 액세스 할 수 없습니다.
- 4. Java 애플릿이 로컬 파일 시스템에 액세스 할 수 있습니까?
- 5. Java 애플릿이 서버로 작동 할 수 있습니까?
- 6. 네트워크를 통해 XAMPP에 액세스 할 수 없습니다.
- 7. LAN을 통해 OpenCart에 액세스 할 수 없습니다.
- 8. 컬을 통해 github에 액세스 할 수 없습니다.
- 9. Java 클래스에 액세스 할 수 없습니다.
- 10. IP 주소를 통해 MySQL에 연결할 수 없습니다.
- 11. 서명 된 Java 애플릿이 로컬 파일 시스템에 액세스 할 수 없습니다.
- 12. django를 통해 mysql에 연결할 수 없습니다
- 13. 서블릿을 통해 mysql에 연결할 수 없습니다.
- 14. MAMP 관리자 오류, mysql에 액세스 할 수 없음
- 15. PHP를 통해 Javascript를 통해 MySQL에 액세스
- 16. 데이터베이스에 액세스 할 수 없습니다
- 17. Java 애플릿이 JavaPOS 구성 파일을 찾을 수 없습니다.
- 18. PHP로 원격으로 mySQL에 액세스 할 수 없습니까?
- 19. 왜 여러 애플릿이 하나의 전역 클래스에 액세스 할 수 있습니까?
- 20. sharepoint 사이트에 액세스 할 수 없습니다.
- 21. JBOSS에 액세스 할 수 없습니다.
- 22. java에서 mysql에 연결할 수 없습니다
- 23. Java 애플릿이 Azure에서 작동하지 않습니다.
- 24. MySQL에 외래 키를 추가 할 수 없습니다.
- 25. MySQL에 날짜를 삽입 할 수 없습니다.
- 26. wget e 또는 스크립트를 통해 URL에 액세스 할 수 없습니다.
- 27. Subversion : 브라우저를 통해 액세스 할 때 webdav 로깅을하지 않습니다.
- 28. PHP가 mysql에 연결할 수 없습니다
- 29. 터미널을 통해 mysql에 접근하기
보안 관련 문제 일 가능성이 큽니다. Java 콘솔에서 오류를 확인하십시오. 애플릿 & (DB/Servlet to DB)이 동일한 호스트에 있고 애플릿이 올바른 연결 방법을 사용하면 샌드 박스로 전개 할 수 있습니다. –
이것은 정말 나쁜 아키텍쳐입니다. 작업을하기 위해 필요한 농구를 뛰어 넘더라도 말입니다. 원격 시스템의 코드가 데이터베이스에 직접 액세스 할 수 없게해야합니다. 노출시킬 필요가있는 특정 조작을 처리하고 애플릿이 서블릿과 상호 작용하게하는 서블릿을 작성하십시오. –
내 의견에서 duffymo에 대한 명확한 설명이없는 경우 *** 애플릿이 DB에 직접 액세스하지 못하게하십시오. 그건 재앙을위한 처방이다. *** 대신 DB에 대한 접근을 중재하는 서블릿 (PHP/ASP/..)을 만들고 사용자가 할 수있는 일을 제한한다. –