Sei sulla pagina 1di 7

Abrir Bases de Datos desde un Applet en Internet

En mi caso utilizo como servidor de pginas 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 sern 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 mtodos adicionales // Use este mtodo 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 mtodo getMetaData para devolver el nmero of columnas columnas=(rs.getMetaData()).getColumnCount(); // use el mtodo 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 lnea. 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. Pltica 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 razn 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 parntesis indica el permiso que necesita: SocketPermission es el tipo de permiso. La direccin IP y un puerto en el servidor (192.168.0.10) es el objetivo. Connect es la accin Los archivos para la poltica de seguridad son java.security y java.policy que en mi caso estn 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 polticas de seguridad. Adems 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 poltica 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 Settings\nombre_usuario.

file:${user.home} en Windows XP es C:\Documents and

La primera solucin 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 cdigo va a tener permiso de conexin a la mquina:puerto especificados. Tener este archivo ya nos permite hacer algo, para empezar, ejecutar sin problemas el applet que antes nos daba error. La segunda solucin, para mi ms fcil, 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 cmo 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 travs 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 conexin que tenemos habilitada y, en el men contextual que se abre al pulsar el botn derecho del ratn, escogemos Propiedades. En la nueva ventana

activamos Opciones Avanzadas, tal como vemos en la siguiente imagen (no saldra la seccin Conexin compartida a Internet si sta no existiese):

Pulsamos sobre el botn Configuracin y vamos a la pestaa Opciones Avanzadas. Nos surge una ventana similar a la que tenemos a continuacin:

Pulsamos sobre el botn Configuracin. Nos surge una ventana similar a la que tenemos a continuacin:

Pulsamos ahora el botn Agregar y llenamos los datos que se nos solicitan. Datos que vemos en la ventana siguiente:

En Descripcin 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 direccin IP debemos poner el nombre que tiene nuestro equipo o el que proporciona el servicio (o su direccin IP) (Por lo general es 127.0.0.1). En Nmero de puerto externo y Nmero de puerto interno tendremos que indicar el puerto que queremos abrir (no tienen porque ser el mismo), activando adems si el servicio es TCP o UDP. Por ejemplo, si queremos abrir el puerto 5432 TCP, escribiramos: en Descripcin del servicio, Puerto 5432 TCP (u otra cualquiera), en Nombre o direccin IP, 127.0.0.1, en Nmero de puerto externo y Nmero de puerto interno, 5432. Y, por ltimo, activamos el botn TCP. Pulsando sobre el botn 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 efecta el programa Messenger, necesario para la activacin de determinados servicios. Espero que les sea de Utilidad,
Para seguridad ver el Link: http://www.proactiva-calidad.com/java/swing/applet_seguridad.htm

Sergio Monsalve Betancur Email: sergio_monsa@hotmail.com

Potrebbero piacerti anche