Abrir Bases de datos desde un applet en Internet
Abrir Bases de Datos desde un Applet en Internet
En mi caso utilizo como servidor de páginas el IIS (Internet Information Services) en la IP 192.168.0.10, el motor de bases de datos Postgresql-8.4.5-1 (donde tengo mi base de datos Fiscal y mi Tabla CIUDAD), el Java y el driver JDBC postgresql-8.2-510.jdbc4.jar instalados en mi equipo en Windows XP, pero igual se puede seguir el procedimiento en Linux cambiando los paths.
1. Crear el Archivo index.htm
Lo primero es crear el archivo index.htm que invoque el applet y que cargue el archivo jar que contiene el JDBC:
<HTML>
<HEAD>
<TITLE>Ejemplo de Base de Datos Postgres</TITLE>
</HEAD>
<BODY>
<H1> Ejemplo de Base de Datos Postgres </H1>
<hr>
<applet code=dbf.class ARCHIVE=postgresql-8.2-510.jdbc4.jar width=650 height=350>
<hr>
</BODY>
</HTML>
2. Crear el Applet dbf.java
import java.net.URL;
import java.awt.*;
import java.applet.Applet;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class dbf extends java.applet.Applet
{
// Aquí Cree sus objetos y variables que planee usar en el Applet
TextArea taSalida = new TextArea(10,95);
Connection con;
static
{
try
{
// Para Postgres
Class.forName("org.postgresql.Driver");
}
catch(ClassNotFoundException e) {e.printStackTrace();}
} // fin static
// Proporcione los campos url, usuario y password de la base de datos:
String url = "jdbc:postgresql://192.168.0.10/Fiscal";
String usuario = "fiscal";
String password = "fiscal";
public void init()
{
// Adicione sus objetos y sus eventos al Applet
// Crea una nueva instancia de GridBagLayout
GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints Con = new GridBagConstraints();
// Coloca el layout del Applet con el gridbag creado
setLayout(gridbag);
// Coloca el font y color del Applet.
setFont(new Font("Ariel", Font.PLAIN, 12));
setBackground(Color.gray);
Con.weightx = 1.0;
Con.weighty = 0.0;
Con.anchor = GridBagConstraints.CENTER;
Con.fill = GridBagConstraints.NONE;
Con.gridwidth = GridBagConstraints.REMAINDER;
// Adiciona el Area de Texto que usa como Salida
taSalida.setEditable(false);
Con.weighty=1.0;
gridbag.setConstraints(taSalida, Con);
taSalida.setForeground(Color.white);
taSalida.setBackground(Color.black);
add(taSalida);
// Conecta la base de datos.
try
{
con = DriverManager.getConnection(url, usuario, password);
}
// Coloca las excepciones que serán impresas en la consola
catch( Exception e)
{
e.printStackTrace();
System.out.println(e.getMessage());
}
// Ejemplo de uso de sentencia SQL:
// Imprime la salida en el Area de Texto
// CIUDAD es una tabla definida en mi base de datos Fiscal
taSalida.setText(Select("SELECT * FROM CIUDAD"));
show();
} //fin init
// Definicion de métodos adicionales
// Use este método para crear comandos de SQL
// retorna un String
public String Select(String QueryLine)
{
String Salida = "";
int columnas;
int pos;
try
{
// create a clase Statement para ejecutar el query.
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(QueryLine);
// use el método getMetaData para devolver el número of columnas
columnas=(rs.getMetaData()).getColumnCount();
// use el método next para devolver cada fila, una a la vez.
while(rs.next())
{
// consigue cada columna una por una por cada fila
for(pos =1; pos <= columnas; pos++)
{
// Consigue cada campo y le adiciona un
// espacio, y lo agrega a la variable Salida
Salida += rs.getObject(pos) + " ";
} // fin del lazo for
// adiciona un RETURN para que cada fila comience en una nueva línea.
Salida += "\n";
} // fin del lazo while
// Cierra la consulta, pero permanece
// conectado a la base de datos
stmt.close();
}
catch( Exception e)
{
e.printStackTrace();
Salida=e.getMessage();
}
// Retorna el resultado
return Salida;
}
public void destroy()
{
// Cierra la base de datos
try {con.close();}
catch( Exception e)
{
e.printStackTrace();
System.out.println(e.getMessage());
}
} // fin destroy
} // fin applet dbf
3. Compilar el Applet dbf.java
Javac dbf.java
4. Copiar los archivos al directorio donde publicará el Applet
Al directorio donde publique el Applet debe copiar los archivos HTML, el Applet y el JDBC:
Index.htm
dbf.class
postgresql-8.2-510.jdbc4.jar
5. Pólítica de seguridad para abrir las Restricciones de las Bases de Datos desde un Applet
Los applets tienen fuertes restricciones de seguridad. No tienen acceso a algunos recursos fuera de su espacio de almacenamiento, entre ellos las bases de datos. Los applets normalmente se almacenan en un servidor remoto y se ejecutan en el cliente, en este caso no tienen acceso a los discos del cliente. Por lo misma razón un applet local no tiene acceso a una base de datos remota.
Un applet que trata de tener acceso a un recurso fuera de su espacio de almacenamiento genera el siguiente mensaje:
Unable to connect to any hosts due to exception: java.security.AccessControlException: access denied
(java.net.SocketPermission 192.168.0.10:5432 connect,resolve)
El mensaje indica que ha denegado el acceso para conectarse al host. Lo que aparece entre paréntesis indica el permiso que necesita:
· SocketPermission es el tipo de permiso.
· La dirección IP y un puerto en el servidor (192.168.0.10) es el objetivo.
· Connect es la acción
Los archivos para la política de seguridad son java.security y java.policy que en mi caso están en el directorio C:\Archivos de programa\Java\jre6\lib\security. Hay varios aspectos en estos archivos, pero nos vamos a centrar en algo muy concreto: resolver el problema de seguridad de las bases de datos.
Es en el archivo C:\Archivos de programa\Java\jre6\lib\security\java.security donde se especifican los archivos de políticas de seguridad. Además dijimos que los archivos se especifican por orden. La sintaxis es:
policy.url.n=URL_del_archivo_policy
jre6\lib\security\java.security ya viene con dos referencias por defecto:
policy.url.1=file:${java.home}/lib/security/java.policy
policy.url.2=file:${user.home}/.java.policy
La primera URL indica que el primer archivo de política de seguridad que se aplicará será file:${java.home}/lib/security/java.policy, donde {java.home} suele ser el directorio jre6.
La segunda URL indica que file:${user.home} en Windows XP es C:\Documents and Settings\nombre_usuario.
La primera solución es crear un archivo database.policy situado en el mismo directorio donde se tiene el archivo index.htm y que contiene:
grant{
// Permite a los Usuarios Acceder las Bases de datos desde applet en el
// Servidor 192.168.0.10 en el socket 5432
permission java.net.SocketPermission "192.168.0.10:5432","connect,resolve";
};
Y hacer una referencia desde java.security:
policy.url.3=file:c:/doc/java/jdbc02/class/database.policy
Este archivo indica que todo el código va a tener permiso de conexión a la máquina:puerto especificados. Tener este archivo ya nos permite hacer algo, para empezar, ejecutar sin problemas el applet que antes nos daba error.
La segunda solución, para mi más fácil, es Instalar el permiso para "127.0.0.1:5432" en java.policy.
grant{
// Permite a los Usuarios Acceder las Bases de datos desde applet en el
// Servidor 192.168.0.10 en el socket 5432
permission java.net.SocketPermission "192.168.0.10:5432","connect,resolve";
};
Con el JDK viene una herramienta para modificar/crear archivos .policy: PolicyTool. Con esta herramienta no es necesario conocer la sintaxis de grant { ... };
Puede acceder a un tutorial de SUN sobre el modelo de seguridad en Java 1.2.
6. Abrir puertos en Windows XP
Para que el Postgres acepte conexiones remotas desde fuera del servidor debemos abrir el puerto en del equipo, en nuestro caso el Puerto 5432 TCP. Abajo se explica cómo se hace en Windows XP.
El firewall (corta fuegos) de Windows XP nos protege contra invasiones externas. Pero a veces es necesario permitir el acceso a nuestro equipo a través de determinados puertos (Sockets). Si queremos abrir uno, o varios, de estos puertos debemos realizar el proceso siguiente:
Vamos a Inicio à Panel de control. En la ventana que se abre seleccionamos Conexiones de red e Internet. En la nueva ventana pulsamos sobre Conexiones de red.
Nos colocamos encima de la conexión que tenemos habilitada y, en el menú contextual que se abre al pulsar el botón derecho del ratón, escogemos Propiedades. En la nueva ventana activamos Opciones Avanzadas, tal como vemos en la siguiente imagen (no saldría la sección Conexión compartida a Internet si ésta no existiese):
Pulsamos sobre el botón Configuración y vamos a la pestaña Opciones Avanzadas. Nos surge una ventana similar a la que tenemos a continuación:
Pulsamos sobre el botón Configuración. Nos surge una ventana similar a la que tenemos a continuación:
Pulsamos ahora el botón Agregar y llenamos los datos que se nos solicitan. Datos que vemos en la ventana siguiente:
En Descripción del servicio le damos un nombre, el que nosotros queramos, que nos sirva para identificar siempre el servicio, como ejemplo Puerto 5432 TCP. En Nombre o dirección IP… debemos poner el nombre que tiene nuestro equipo o el que proporciona el servicio (o su dirección IP) (Por lo general es 127.0.0.1). En Número de puerto externo… y Número de puerto interno… tendremos que indicar el puerto que queremos abrir (no tienen porque ser el mismo), activando además si el servicio es TCP o UDP.
Por ejemplo, si queremos abrir el puerto 5432 TCP, escribiríamos: en Descripción del servicio, Puerto 5432 TCP (u otra cualquiera), en Nombre o dirección IP…, 127.0.0.1, en Número de puerto externo… y Número de puerto interno…, 5432. Y, por último, activamos el botón TCP.
Pulsando sobre el botón Aceptar, nos aparece la ventana donde se muestra el puerto 5432 seleccionado:
Iremos cerrando las distintas ventanas. El puerto quedará así abierto. El proceso lo podemos repetir para todos los puertos que queramos.
Un ejemplo claro sobre todo lo anterior lo tenemos en el proceso de apertura de puertos que efectúa el programa Messenger, necesario para la activación de determinados servicios.
Espero que les sea de Utilidad,
Sergio Monsalve Betancur
Email: sergio_monsa@hotmail.com
Comentarios
Publicar un comentario