Pdf de la pagina oficial: https://netbeans.org/project_downloads/www/shortcuts.pdf
lunes, 30 de junio de 2014
jueves, 19 de junio de 2014
[JAVA EE] Autentificación de usuarios usando JAAS en aplicación web
Java Authentication and Authorization Service es una plataforma que permite a las aplicaciones de java crear ambientes seguros para las aplicaciones, los cuales puedes restringir que tipo de peticiones acepta en base a los encabezados HTTP y que usuarios tienen permisos.
Lo que vamos a hacer es una pequeña aplicación implementada en Glassfish 4.0 y utilizando Netbeans en la cual en una aplicación web tendremos cuatro archivos jsp, uno de bienvenido a la aplicación (index.jsp), uno de login (login.jsp) que nos ayudara a pedir las credenciales de los usuarios, una de error (error.jsp) que se mostrara cuando el usuario no de las credenciales correctas y por ultimo tendremos una pagina inicial (index.jsp) puesta en una carpeta adicional (protegido) que permitira dar la bienvenida a los usuarios que fueron autentificados de manera correcta.
Empezamos creando una aplicación web para java utilizando Java EE 7
Una vez creado tu proyecto procedemos a crear cada uno de los archivos en este caso ya nos crea iun index, aunque no sea jsp porque depende la versión de netbeans puedemos dejarlo con el mismo codigo. En este caso el archivo index.jsp tendra el siguiente codigo
<!DOCTYPE html>
<html>
<head>
<title>TODO supply a title</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div>Bienvenido a mi aplicación </div>
</body>
</html>
Damos botón derecho y creamos el archivo error.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>Error !</h1>
</body>
</html>
Damos clic derecho en web pages y ponemos Folder en este caso le pongo el nombre de protegido
Damos clic derecho en dicho folder creado y damos clic derecho new -> Jsp y creamos el index.jsp que nos indicara que ya estamos en un ambiente protegido
<!DOCTYPE html>
<html>
<head>
<title>TODO supply a title</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div>Bienvenido a entorno protegido </div>
</body>
</html>
Por ultimo creamos en la carpeta de Web Pages el login.jsp que nos permitira hacer la autentificacion con el nombre del usuario y contraseña. El cuadro de texto del nombre debe llamarse j_username, el cuatro de texto debe de llamarse j_password por ultimo solo la acción del submit del formulario debe de llamar a j_security_check
Codigo de login.jsp
Listo!, Ahora solo tenemos que configurar nuestro sitio para esto damos clic derecho en el proyecto y agregamos el deployment descriptor que es quien manejara los parametros de los datos protegidos.
Primero le marcamos en el web.xml como se hara la autentificación
Luego posteriormente damos las restricciones para la carpeta que ese estara utilizando como protegida en el web.xml
Y por ultimo damos de alta los roles que son necesarios
Aquí muestro el web.xml completo
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- Configuracion de mi login -->
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/error.jsp</form-error-page>
</form-login-config>
</login-config>
<!-- Configurar los roles de seguridad -->
<security-role>
<role-name>admin</role-name>
</security-role>
<!-- Vienen las restricciones de mi sitio -->
<security-constraint>
<display-name>Contexto Seguro</display-name>
<web-resource-collection>
<web-resource-name>admin</web-resource-name>
<url-pattern>/protegido/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
<!-- ............................. -->
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
</web-app>
Ahora solo mapearemos los roles con los grupos de los usuarios ya que en el repositorio de datos estaremos trabajando con grupos, para eso ocupamos un xml que permita ese puente con el servidor en el caso de glassfish utilizamos glassfish-web.xml su codigo:
Por ultimo solo configuraremos un usuario, para esto ponemos en nuestro navegador la dirección
localhost:4848
Esto abrira el panel de configuración de Glassfish , para eso nos vamos a ir a la opcion de configuración -> Server config -> Seguridad -> Dominios -> file, es la autentificacion que tiene por default el servidor por lo que agregaremos un usuario.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app error-url="">
<context-root>/jaas</context-root>
<class-loader delegate="true"/>
<jsp-config>
<property name="keepgenerated" value="true">
<description>Keep a copy of the generated servlet class' java code.</description>
</property>
</jsp-config>
<security-role-mapping>
<role-name>admin</role-name>
<group-name>Users</group-name>
</security-role-mapping>
</glassfish-web-app>
Por ultimo solo configuraremos un usuario, para esto ponemos en nuestro navegador la dirección
localhost:4848
Esto abrira el panel de configuración de Glassfish , para eso nos vamos a ir a la opcion de configuración -> Server config -> Seguridad -> Dominios -> file, es la autentificacion que tiene por default el servidor por lo que agregaremos un usuario.
Ahi agregamos un usuari, no ilvidemos que debe de ser el grupo Users porque es como lo mapeamos en el XML del glassfish
Con esto cada que vayamos a entrar a localhos:8080/mi proyecto/protegido automaticamente el servidor tratara de verificar que tienen una sesión activa si no la tiene lo mandara a login, el cual le pedira los datos de usuario y contraseña que son los que dio de alta, si los da erroneos lo mandara directamente a error.jsp, si los da correcto les permitira entrar.
jueves, 5 de junio de 2014
Configurar Variables de entorno para Java en windows
Configurar Variables de entorno
- En Windows, abra el cuadro de diálogo Environment Variables, entrando a propiedades del sistema -> Configuracion avanzada
- Configure la variable de entorno JAVA_HOME en el directorio donde instaló el JDK, por ejemplo: C:\Program Files\Java\jdk1.7.0_60. En Windows de 64 bits, la ruta predeterminada es C:\Program Files(x86)\Java\jdk1.7.0_60. Puede checarlo en sus propios archivos de los equipos
- En la variable de entorno PATH, agregue %JAVA_HOME%\bin; ó C:\Program Files\Java\jdk1.7.0_60\bin al principio de la cadena, no olvide el ";". Haga clic en aceptar para guardar y cerrar el cuadro de diálogo Environment Variables.
- Compruebe que las variables de entorno estén configuradas correctamente. Escriba java -version y asegúrese de que la versión de Java sea la misma que la versión que ha configurado en la variable de entorno:
- Abra una ventana del símbolo del sistema.
java version "1.7.0_60" Java(TM) SE Runtime Environment (build 1.7.0_60-b07) Java HotSpot(TM) Client VM (build 19.1-b02, mixed mode, sharing)
Nota: Puede añadir una mas si es que no la tiene con el nombre de ClassPath y valor un punto
domingo, 20 de abril de 2014
[c# y Mysql] Mandar un arreglo de numeros a un procedimiento almacenado
Hoy tengo un problema que no habia podido resolver, aunque la verdad me cuesta mucho trabajo manejar un objeto persistente a la base de datos las transacciones en red regularmente son un poco lentos en C#(cosa que no me ocurre con JAVA). Por lo que el problema que tengo hoy es meter una serie de folios a la base de datos pero no quiero mandar una sentencia por cada folio porque como mi servidor esta en un maquina diferente dentro de una red, mandare el conjunto de folios dentro de un arreglo y lo procesare a traves de un procedimiento almacenado por lo que les comento el ejemplo completo. Primero creare una clase que me permitira generar una secuencia de folios para no tener problema, creare un windows form y hare un formulario como el siguiente:
Primero validaremos que los dos primeros solo acepten digitos por lo que los amarramos a un mismo evento de tipo keypress. En este caso se llama isDigit aunque no regresara algo pues nos servira para evitar que se de eco en el cuadro de texto.
private void isDigit(object sender, KeyPressEventArgs e)
{
if (!Char.IsDigit(e.KeyChar))
e.KeyChar = '\0';
}
Para el comision como solo necesito que valide que acepte numerico solo le puse una mascara de tipo currency.
Ahora lo que necesitaremos en programar el boton de la palomita en este caso vamos a formatear la entrada que necesitamos y posteriormente se instanciara una clase que tendra la llama al procedimiento almacenado, el codigo es el siguiente:
private void agregaFolios(object sender, EventArgs e)
{
//convertimos lo que tiene el cuadro de texto a enteros
int inicial = Convert.ToInt32(txtinicial.Text);
int final = Convert.ToInt32(txtfinal.Text);
//verificamos que folios tengan una secuencia
if( inicial <= final)
{
//cadena que tendra todos los numeros separados con ,
string folios="";
//ciclo que permite recorrer los valores y ponerlos en una cadena
for (int i = inicial; i <= final; i++)
{
folios += i;
folios += ","; // no se preocupen porque termine con comas el procedimiento lo resolvera
}
//las validaciones basicas se cumplieron
// ahora haremos el procedimiento del registro por lo que pondre que el formulario me regrese OK para validacion posterior
this.DialogResult = DialogResult.OK;
// Ahora instanciamos la clase que necesito
OpeAgentes soliciudes = new OpeAgentes();
// mandamos los datos en este caso solo necesitan folios y los datos que quieran mandar.
soliciudes.Addsolicitudes(folios, idagente, frmPanel.userActive.Iduser,Convert.ToDouble(textEdit1.Text));
//cerramos el formulario
this.Dispose();
this.Close();
}
else
MessageBox.Show("El folio inicial debe de ser menor que el final");
}
Ahora abrimos la clase OpeAgentes y haremos el metodo Addsolicitudes para habilitar el insert.
public void Addsolicitudes(string folios, int idagente, int user, double comision)
{
MySqlConnection SQLConexion = default(MySqlConnection);
try
{
//creamos la conexion con la cadena
SQLConexion = new MySqlConnection(SQLmConnStr);
SQLConexion.Open(); //abrimos la conexion
//mandamos llamar el procedimiento
MySqlCommand SQLComando = new MySqlCommand("addfoliossolicitudes", SQLConexion);
SQLComando.CommandType = CommandType.StoredProcedure;
//agregamos los parametros que necesitara el procedimiento
SQLComando.Parameters.AddWithValue("arrayFolio", folios);
SQLComando.Parameters.AddWithValue("pagente", idagente);
SQLComando.Parameters.AddWithValue("pcomision", comision);
SQLComando.Parameters.AddWithValue("piduser", user);
//--- Ejecutar SQL
SQLComando.ExecuteNonQuery();
SQLComando.Dispose();
SQLConexion.Close();
SQLConexion.Dispose();
}
catch (MySqlException ex)
{
Console.Write(ex);
if (SQLConexion.State == ConnectionState.Open)
{
SQLConexion.Close();
SQLConexion.Dispose();
}
}
finally
{
if (SQLConexion.State == ConnectionState.Open)
{
SQLConexion.Close();
SQLConexion.Dispose();
}
}
}
Ya por ultimo realizamos nuestro procedimiento almacenado para esto utilizaremos los siguiente
CREATE DEFINER=`root`@`localhost` PROCEDURE `addfoliossolicitudes`(arrayFolio text, pagente int, pcomision double, piduser int)
BEGIN
WHILE (LOCATE(',', arrayFolio) > 0)
DO
SET @value = ELT(1, arrayFolio);
SET @FOLIO = SUBSTRING(arrayFolio, 1, LOCATE(',',arrayFolio)-1);
SET arrayFolio = SUBSTRING(arrayFolio, LOCATE(',', arrayFolio) + 1);
-- Se le pone IGNORE para si ya hay un folio solo ignore el error y siga con los demas folios
-- INSERT QUE SE REPITE por cada folio que tenga
INSERT IGNORE INTO `solicitudes`(x,y,z,w,u,v,j)
VALUES(@FOLIO,pagente,pcomision,0,piduser,now(),'Algo');
END WHILE;
END
Y listo en este caso di de alta del 100 al 150 y el resultado es:
Espero les pueda servir
Etiquetas:
almacenamiento,
array,
arreglo,
c#,
csharp,
datos,
datos.,
insert,
mysql,
param,
procedure,
programacion,
stored,
tablas,
visual,
visual estudio
viernes, 14 de marzo de 2014
[c#] Codigo para settear un datasource a un reporte creado a mano
Muchas veces me he preguntado como podía mandar llamar un reporte con datos de un dataset, sin necesidad de amarrarlo a una base de datos por lo que simplemente cree un dataset con los campos que necesito del reporte, lo enlace a mi reporte y con el siguiente código lo mande settear
reportes.datatset.DataSetPagos nuevo = new reportes.datatset.DataSetPagos();
//add data
nuevo.PagosRealizados.AddPagosRealizadosRow("prueba", "mes", "ano", "importe", "registra", "fecha");
ReportDataSource reportDataSource = new ReportDataSource();
//set in the report
reportDataSource.Name = "DatasetPagos";
reportDataSource.Value = nuevo.Tables["PagosRealizados"];
this.reportViewer1.LocalReport.DataSources.Add(reportDataSource);
reportViewer1.Refresh();
this.reportViewer1.RefreshReport();
Espero a alguien le sirva y si no me sirve a mi por lo tanto aquí lo guardare.
jueves, 13 de febrero de 2014
[Video] Porque aprender a programar
Buscando en Internet me encontré este video de youtube de la cuenta de Martin Cruz, donde aparecen algunas de las grandes figuras de la programación explicando porque deberiamos aprender a programar es un video muy bueno
Lo que si es que es un profesión muy bonita, si te dedicas a la programación, que tecnologías usas o simplemente porque quieres aprender un poco puedes hacerlo en un grupo de facebook
https://www.facebook.com/groups/unpocodeprogrmacion/
Saludos
Lo que si es que es un profesión muy bonita, si te dedicas a la programación, que tecnologías usas o simplemente porque quieres aprender un poco puedes hacerlo en un grupo de facebook
https://www.facebook.com/groups/unpocodeprogrmacion/
Saludos
martes, 11 de febrero de 2014
[MYSQL] Buscar varios ID no consecutivos utilizando una sola consulta
Hace un rato tenia un problema con respecto a como decir si un folio que quiero liberar ya fue liberado anteriormente, por la situación que una empresa libera folios según la región que se maneja, por lo que quería ver la manera de mandar un arreglo como parámetros a MYSQL para no tener que hacer una consulta por cada uno de los folios. La respuesta fue mas sencilla gracias al apoyo del licenciado. Lo único que se hizo fue poner todos los folios en una cadena separandolos por una coma, suponiendo que tengo un arreglo con los numeros de folio (OJO no necesariamente están consecutivos porque si no pues un between me ayudaría muy rápidamente). Por lo que supongamos que tenemos un arreglo llamado folios con la programación solo concatene de la siguiente manera (c#):
string dato = "";
foreach(int i in folios)
{
dato = dato + Convert.ToString(i);
dato = dato + ",";
}
dato = dato.Remove(dato.Length - 2);
Una vez tenido eso mande llamar el procedimiento tomando en cuenta que lo único que quiero saber es cuantos folios están repetidos.
MySqlCommand SQLComando = new MySqlCommand("buscaFolios", SQLConexion);
SQLComando.CommandType = CommandType.StoredProcedure;
SQLComando.Parameters.AddWithValue("pparam", dato);
MySqlDataReader reader = SQLComando.ExecuteReader();
reader.Read();
int numero = Convert.ToInt32(reader["numero"]);
if (numero == 0)
{
MessageBox.Show("no folios repetidos");
}
else
MessageBox.Show("Existe ya " + numero + " de folios repetidos en la base de datos", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
Almacenándolo en la variable numero si es 0 quiere decir que los folios no han sido usados, si no quiere decir que ya existen. Para el procedimiento almacenado puse lo siguiente :
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `buscaFolios`(IN pparam TEXT)
BEGIN
SELECT count(*) as numero FROM mitablita WHERE pparam LIKE CONCAT('%', micampo, '%');
END
Y con esto ya tenemos un resultado como el siguiente:
Espero les ayude
Suscribirse a:
Entradas (Atom)
