miércoles, 22 de enero de 2014

Compartir cookies entre dominios (Crossdomain cookies)

La semana pasada me tope con un problema muy particular, actualmente estoy laborando en una institución que tiene implementado un esquema de alta disponibilidad (HA) el cual consiste en un balanceador de carga y dos servidores cada uno con su replica de la aplicación web, digamos pe1.dominio.com y pe2.dominio.com, por lo que si existe una configuración frecuente en una de ellas al redirigir a la otra mediante el balanceador las cookies no pueden ser vistas y la configuración frecuente del usuario no se mostrará. Lo que se requiere evidentemente es que dos dominios compartan de alguna manera las cookies con la configuración frecuente requerida en el login.
Entonces me puse a investigar un poco, de todo lo que pude encontrar seleccione inicialmente dos alternativas una que no muy legal por asi decirlo y que no es compatible con todos los navegadores por el javascript que se debe de usar, es la siguiente: método via XSS . La otra opción era recurrir al almacenamiento en cliente propio del html5.
Finalmente me di cuenta que no existe un estándar para compartir las cookies entre dominios, en teoría una cookie sirve para un dominio y un navegador, por lo que hacerlo vía javascript no es compatible con todos los navegadores, pero pense un poco mejor y habría otra opción (al menos en teoria): 

1. Centralizar todas las cookies en un único tercer dominio, digamos gestorcookie.dominio.com 
2. Cuando el usuario hace una petición a pe1.dominio.com o a pe2.dominio.com le debe redirigir a gestorcookie.dominio.com
3. gestorcookie.dominio.com le vuelve a dirigir de nuevo a pe1.dominio.com o a pe2.dominio.com segun sea el origen con la información que se necesita.

Aclaro que quizás desde otro punto de vista no sea muy seguro, y se tiene que crear algún tipo de artificio con variables post o get entre el dominio gestor de cookies y los dominios pe1 y pe2 tanto para la creación como para la lectura de este tipo de variables. Ahora la pregunta: Alguien se atreve a implementarlo? . Si logran hacerlo por favor compartan. Hasta luego.

jueves, 16 de enero de 2014

Comunicación entre aplicaciones web usando xml, java y javascript

En estos días me tope con un problema a resolver y se trata de verificar la creación de un archivo PDF en una aplicación web distinta a la mia, el cual en el ejemplo que explicaré a continuación denominaremos cargo. Evidentemente tuve que modificar las dos aplicaciones para que se puedan comunicar de alguna manera, en este caso opte por XML, la arquitectura quedó masomenos del siguiente modo:


En donde Rich Client vendria a ser la aplicacion cliente y Server es la aplicacion donde se vericará la creación/existencia del registro en base de datos o archivo en PDF en este caso ya que podría servir para verificar ambos.

Primero configuramos en el Server el XML de respuesta que se enviará al cliente en base a algunos parámetros get, en este caso el número de cargo y el tipo de cargo, para lo cual necesitamos crear un servlet al cual nombrare ValorPosible.java en la aplicación servidor que contenga lo siguiente:

response.setContentType("text/xml;charset=ISO-8859-1");
      PrintWriter out = response.getWriter(); 
      int tipoval = Tool.parseInt(request.getParameter("tipoval"));
      String resultado = "-1";
     
      switch(tipoval)
      {
      case 70://validar si  hay algun tipo de documento registrado de un cargo
        {
            String nCargo = request.getParameter("nCargo");
            String nTipo = request.getParameter("nTipo");
            String query = "select count (*) NUM from w_doc_cargo where ncargo="+nCargo+" and ntipo="+nTipo;
            int conta =Tool.parseInt(Tool.obtieneDatos(query).getString("NUM"));
            out.print(
                  " \n" +
                  " \n" +
                  "" + conta  + " \n" +
                  "");
              break;
        }
    }
    out.close();
}


Ahora configuraremos la aplicación cliente, primero debemos agregar en la pagina JSP que desea verificar la existencia del archivo la siguiente funcion javascript, si desean pueden hacerlo invocando un archivo js externo o dentro del jsp no hay problema.

            
function retValXml(url1)
{
           if (window.XMLHttpRequest)
             {
             xmlHttp=new XMLHttpRequest();
             }
           else // for older IE 5/6
             {
             xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
             }
           var url=url1;
           xmlHttp.open("GET",url,false);
           xmlHttp.send();
           var dom=xmlHttp.responseText;
           return dom.split("Valor")[1].substr(1, dom.split("Valor")[1].length-3);
}

También agrego otra función javascript que será finalmente la que determinará la exitencia del registro o archivo en la aplicación servidor mediante la comunicación por XML.

            
function VisualizarPDF(nCargo, nTipo)
{   var url="http://server/servlets/ValorPosible?tipoval=70&nCargo=" + nCargo;
    var ret = retValXml(url);
    if(trim(nCargo)=="")
    {
        alert("Ingrese un número de cargo");
    }
    else if(ret=="0")
    {       
        alert("El número de cargo no existe");
    }
    else
    {
        //...Aqui va el codigo para redirigir hacia la url/ubicación predefinida de los cargos
        window.location.href = 'http://server/ruta/predefinida/pdfs/' + nCargo + ".pdf";
    }
}

Nótese que en la pagina JSP de la aplicación cliente en la funcion javascript anterior invocamos al servlet de la aplicación servidor en la línea:

var url="http://server/servlets/ValorPosible?tipoval=70&nCargo=" + nCargo;

Solo nos quedaría testear nuestra funcion invocandola desde un hipervinculo o enlace de la siguiente manera:

<a href="#" onclick="javascript:VisualizarPDF(1,70);" > Descargar </a>

Evidentemente en la aplicación este link debe tener el parámetro número de cargo como dinámico en la función VisualizarPDF en este caso estoy pasando el codigo de cargo "1", despues de verificar la existencia se redirige hacia el archivo "1.pdf" ubicado en la ruta predefinida de archivos en la aplicacion servidor o en la que configuremos en el código.

Hasta luego.

viernes, 10 de enero de 2014

Editor de gráficos web con hoja de cálculo en google drive

Después de un largo tiempo ausente me anime a publicar algo así que al actualizarme un poco en visualization encontré un componente gráfico muy útil que se llama chart editor, para visitar la página y descargar el código original en code playground click aquí. Así que me puse a modificar un poco el código del editor original lo cual iré comentando en este artículo.

Primero debemos entender como es que genera los diferentes tipos de gráficos este asistente en web, por lo general podemos usar un rango seleccionado de celdas de una hoja de calculo alojada en google drive, debemos tener en cuenta que tal hoja de calculo debe estar en modo compartido público de los contrario no podrá cargarse la data, hay otro modo de usar este generador de gráficos web al establece un data table haciendo uso de JSON lo cual publicaré en otro artículo.

Entonces manos a la obra, primero debemos crear una hoja de calculo en drive y compartirla como pública de la siguiente manera:


Después click en el botón compartir y definir como público.


La dirección pública generada por drive de mi hoja de cálculo por ejemplo es:

https://docs.google.com/spreadsheet/ccc?key=0AplEIWl3vfe3dEk2TkJrdjBESkpkcHFJRV9lLUJ0bmc&usp=sharing

Luego modificamos el código del chart editor en el campo denominado dataSourceUrl y establecemos el rango de celdas en ese campo


Primero debemos cambiar el parámetro llamado key por el parámetro key de la dirección publica generada por drive de nuestra propia hoja de calculo, también el parámetro range en mi caso puse B3:C5 pues es el intervalo en el que se encuentra la data en la hoja de calculo (notar el intervalo en la segunda imagen de este articulo que muestra el contenido de la hoja de calculo).

Finalmente probamos el código abriendo el archivo html modificado en el navegador


Para cambiar de tipo de gráfico solo deben darle click en la opción abrir chart wizard y si quieren obtener el código estático para embeberlo en cualquier pagina denle click en obtener embed y copian el código generado en el text area de la parte inferior.

Vale resaltar que modifique un poco el código original del chart editor de google code playground para que me generase un código embebido y así poder usarlo en todos lados sin necesidad de conexión a internet, si alguien encuentra otra forma de hacerlo por favor compartirlo. Finalmente les dejo mi código modificado del chart editor a continuación: Ver/Descargar Código HTML.


viernes, 24 de septiembre de 2010

Buscar contenido dentro de un feed o rss especifico

Hola a todos, este post va dirigido a personas que tienen un blog y han querido poner un gadget de busqueda sin que salga el famoso mensajito "con la tecnologia de google", no me malentiendan la busqueda es utilizando el motor de google pero sin el famoso logo, para hacer esto vamos a utilizar el API de google para Feeds los que deseen saber mas pueden entrar a la siguiente direccion http://code.google.com/apis/ajax/playground/?exp=libraries#find_feed sino tambien pueden bajar mi ejemplo al final del post.

Simplemente tenemos que modificar una linea de codigo del javascript para variar el ejemplo para que busque en nuestro blog(excepto si deseas agregarle algo de diseño con css), en mi caso yo ya lo tengo implementado en mi blog al costado izquierdo abajo de mi perfil.

En mi ejemplo customizado tendrian que variar la siguiente linea:


var query = 'site:humancompiler.blogspot.com '+document.getElementById('c4').value;

Solo deben reemplazar la URL de mi blog por su blog o dominio con una fuente rss, a continuacion pueden bajar mi ejemplo completo, para ponerlo en su blog solo deben poner esa pagina con un iframe, para probar mi ejemplo busquen cualquier palabra que contenga algun post de mi blog.



jueves, 23 de septiembre de 2010

Formatear un input tipo text a entero, o con 2 decimales, o con separador de n caracteres en n caracteres

Hola a todos, despues d eun largo tiempo de ausencia retomo la blogosfera para compartir algo con lo que estruve lidiando esta semana, se me presento el problema de formatear una caja de texto para que acepte solo numeros enteros y otra caja de texto para q acepte numeros con n decimales, les explicare el codigo a usar y al final del articulo dejare los archivos para que descarguen los ejemplos.

Primero veremos el ejemplo para numero entero:

Javascript a utilizar:


function validarEntero(valor){
//intento convertir a entero.
//si era un entero no le afecta, si no lo era lo intenta convertir
valor = parseInt(valor)
//Compruebo si es un valor numérico
if (isNaN(valor)) {
//entonces (no es un numero) devuelvo el valor cadena vacia
return ""
}else{
//En caso contrario (Si era un número) devuelvo el valor
return valor
}
}
function validarFormulario(){
//extraemos el valor del campo
textoCampo = window.document.formul.texto.value
//lo validamos como entero
textoCampo = validarEntero(textoCampo)
//colocamos el valor de nuevo
window.document.formul.texto.value = textoCampo
}


Y dentro del tag body ponemos el objeto input dentro de un form:


< method="post" name="formul" action="">
Teclea un número:
< id="texto" onkeyup="validarFormulario()" onchange="validarFormulario()" name="texto">
< /form>


Ahora veremos el ejemplo para numero con 2 decimales, para esto hago la observacion que el usuario no ingresara el punto decimal por ejemplo si se desa ingresar 45.68 el usuario solo tecleara 4568 y el punto se añadira automaticamente, otro ejemplo si se desa ingresar 45.6 el usuario debera teclear solamente 4560 y se añadira el punto automaticamente.

Javascript a utilizar:


function format(input)
{
var num = input.value.replace(/\./g,'');
if(!isNaN(num)){
if(num.length>2)
{
num=num.substring(0,num.length-2)+'.'+num.substring(num.length-2);
}
input.value = num;
}

else{ alert('Solo se permiten numeros');
input.value = input.value.replace(/[^\d\.]*/g,'');
}
}


Y dentro del tag body ponemos el objeto input dentro de un form:


< form>
< type="text" id="c4" name="c4" runat="server" onkeyup="format(this)" onchange="format(this)">
< /form>


Bueno aqui les dejo los ejemplos a descargar, por tiempo no les comente el codigo del separador pero les dejo el archivo es el tercer archivo. Saludos y espero que les sirva, agradecer no cuesta nada, comenten si les gusto el post...










lunes, 16 de noviembre de 2009

Como Obtener El Navegador Web y La Versión usando PHP

Es clasico toparse con problemas de diseño en web, especificamente con internet explorer 6 por lo que a continuación les recomiendo usar dos funciones, la primera es para obtener el nombre del navegador web desde el que se accede y la otra es para obtener la version de este, estas funciones son muy útiles a la hora de diferenciar contenidos debido al renderizado de cada cliente web.

-Función para obtener el nombre del navegador:


function get_user_browser()
{
$u_agent = $_SERVER['HTTP_USER_AGENT'];
$ub = '';
if(preg_match('/MSIE/i',$u_agent))
{
$ub = "ie";
}
elseif(preg_match('/Firefox/i',$u_agent))
{
$ub = "firefox";
}
elseif(preg_match('/Safari/i',$u_agent))
{
$ub = "safari";
}
elseif(preg_match('/Chrome/i',$u_agent))
{
$ub = "chrome";
}
elseif(preg_match('/Flock/i',$u_agent))
{
$ub = "flock";
}
elseif(preg_match('/Opera/i',$u_agent))
{
$ub = "opera";
}

return $ub;
}


-Función para obtener la versión del navegador:


function gbversion()
{
$Name="";
$Version="";
$browsers = array("firefox", "msie", "opera", "chrome", "safari",
"mozilla", "seamonkey", "konqueror", "netscape",
"gecko", "navigator", "mosaic", "lynx", "amaya",
"omniweb", "avant", "camino", "flock", "aol");
$Agent = strtolower($_SERVER['HTTP_USER_AGENT']);
foreach($browsers as $browser)
{
if (preg_match("#($browser)[/ ]?([0-9.]*)#", $Agent, $match))
{
$Name = $match[1] ;
$Version = $match[2] ;
break ;
}
}
return $Version;
}


-Como en mi caso el problema solo se daba cuando usaba internet explorer 6 use el siguiente codigo:


if(get_user_browser()=="ie" && gbversion()=="6.0")
{
echo "hacer ie6";
}
else
{
echo "hacer otro";
}

viernes, 31 de julio de 2009

Crear Reportes Gráficos Con Google Visualization

La semana pasada me tope con un requerimiento particular, este consistia en crear un reporte gráfico(especificamente un pie chart) pero sin usar controles predefinidos en dll y pues digamos que ahora la gente no esta dispuesta a perder mucho tiempo, encontré dos curiosas alternativas dadas por google una es Google Visualization y la otra es Google Chart las dos son buenas sin embargo elegí la primera por que daba mejor vistosidad por su contenido y manejo de eventos. Mientras en Google Charts se consigue generar una imagen estática, en Google Visualization se consigue una animación, por ejemplo se puede dar click en una sección del pie chart y se puede observar el detalle. El resultado fue así, aunque esta es solo es la captura de pantalla del html...
Las lineas que genere son las siguientes:

data.addRows(5);
data.setValue(0, 0, 'Willy');
data.setValue(0, 1, 27);
data.setValue(1, 0, 'Cesar');
data.setValue(1, 1, 10);
data.setValue(2, 0, 'Harold');
data.setValue(2, 1, 5);
data.setValue(3, 0, 'Jorge');
data.setValue(3, 1, 8);
data.setValue(4, 0, 'Marco');
data.setValue(4, 1, 7);

El 5 de la primera linea es el numero de areás que va tener el pie chart, por cada registro se añaden dos lineas por ejemplo para willy se añaden estas dos lineas

data.setValue(0, 0, 'Willy');
data.setValue(0, 1, 27);

siendo la primera el nombre y la segunda el valor recuperado, el porcentaje lo calcula el mismo web service de google no deben preocuparse en generar eso. En este caso el ejemplo es estático sin embargo se pueden generar estas lineas desde cualquier lenguaje como java, php, asp o c sharp.

A continuación dejo el código ejemplo... Saludos
Descargar Ejemplo