View
222
Download
0
Embed Size (px)
Citation preview
LCFIBJordi Girona 1-3, Mòdul B6E-08034 Barcelona, Spain
[email protected]://www.fib.upc.es/LCFIB/
Tecnologies web
Una visió global de les tecnologies i arquitectures que hi ha darrera de les aplicacions web, especialment les basades en Java
LCFIB- 2008
Les tecnologies web engloben…
Els dissenyadors gràfics, que seran experts en…
– HTML, CSS, usabilitat … Els programadors, que hauran de conèixer…
– PHP, ASP, JSP… Els analistes o “arquitectes”, que hauran de dominar…
– J2EE, Frameworks, webservices… La gent de sistemes a qui li preocuparà…
– Seguretat, escalabilitat…
En aquest seminari, intentarem parlar una mica de totes aquestes àrees de coneixement.
LCFIB- 2008
Índex
Tecnologies de client: del HTML a AJAX. Conceptes bàsics d'aplicacions web. Les arquitectures basades en Java (de JSP a JEE) El mon dels frameworks: Spring, Struts, Hibernate... Seguretat en aplicacions web Elements d'una infrastructura web.
Últim dia:
– Casos pràctics sobre aplicacions web a la FIB
LCFIBJordi Girona 1-3, Mòdul B6E-08034 Barcelona, Spain
[email protected]://www.fib.upc.es/LCFIB/
Les tecnologies del client.Del HTML a AJAX
LCFIB- 2008
De què parlarem?
CSS DOM Javascript AJAX Altres tecnologies per aplicacions riques
LCFIB- 2008
Els estàndards W3C
És un organisme que es dedica a promoure els estàndards al web, dissenyant especificacions i eines
Tenen una oficina a Espanya: http://www.w3c.es/ No només HTML, sino molts altres temes relacionats amb el
web:
– Accés universal (iniciativa WAI)
– Web semàntica (RDF)
– Multimedia (SVG, SMIL)
– Web services (SOAP,WSDL)
– ... http://www.w3c.es/divulgacion/guiasbreves/
LCFIB- 2008
CSS
Fulls d'estil, que es poden tenir un un fitxer a part del HTML o entre els tags <style></style>
Defineixen atributs de visualització de:
– Els tags HTML normals i corrents
– Classes que podem associar a una part del text• <span class=”titol”>Aixo es un titol</span>
– Elements amb un identificador únic• <span id=”menu1”>Primer menu</span>
Separar la presentació del contingut, faciliten la coherència Permet tenir un HTML molt mes senzill i estructurat
LCFIB- 2008
Tipus de propietats que hi ha a CSS
Podem jugar amb
– Marges
– Mides
– Posicions en pantalla
– Tipus de lletra
– Imatges i colors de fons
– Visualització o no d’un element
Aplicar uns estils depenent de la plataforma
– Fer que un menu es vegi en pantalla i no a l’imprimir
– Fer que un disseny s'adapti a una PDA
LCFIB- 2008
El mon ideal: HTML valid + CSS
Idealment, tots els webs haurien de tenir HTML vàlid El CSS hauria de proporcionar tota la presentació Exemple de fins on podem arribar:
http://www.csszengarden.com
Realment el que normalment tenim es...
– HTML que es veu be, però que no es 100% vàlid
– Format incorporat dintre del HTML (taules)
– Webs totalment correctes que es veuen malament en algun navegador per diferències en implementació
LCFIB- 2008
Un exemple de problemes de CSS
<style> .postit { width: 200px; /* amplada de 200 px */padding: 25px; /* deixem un marge de 25 px */background: yellow;
}
</style>
<div class="postit">
<p>Aixo amb explorer medeix 200 pixels i amb Mozilla, 250.</p>
<p>El "padding" s'afegeix de formes diferents.</p>
</div>
Diferents navegadors representen CSS diferent
LCFIB- 2008
El problema de CSS
LCFIB- 2008
Treballant amb CSS
Web developer extension
– Validadors de HTML
– Edició de CSS “on the fly” Firebug
– Inspecció d’elements i els seus estils Fitxa de les propietats
http://www.ilovejackdaniels.com/cheat-sheets/css-cheat-sheet/
Treballar amb CSS es dur. S'ha de provar amb tots els navegadors i tot i així d'han de recorrer a "hacks" per que les coses quedin com volem
LCFIB- 2008
L’estructura de la pàgina i el DOM
Document Object Model: model d'objectes de la pàgina que exposa el navegador als llenguatges de script.
API que ens permet accedir al que esta mostrant el navegador o manipular el seu comportament
DOM = Javascript? NO.
– Javascript ens permet accedir a la pàgina mostrada i al navegador utilitzant el DOM
Accedint al DOM podem veure i manipular les propietats definides a través de CSS
Podem accedir a elements qualsevol de la pàgina si els identifiquem amb un ID únic al HTML
LCFIB- 2008
El DOM ha existit des de sempre...
<script>
function comprova() {
if (document.forms[0].elements[0].value=="") {
alert("Escriu un titol!");
}
return false; // evita que enviem les dades
}
</script>
...
<form name="pelicula" onSubmit="comprova()">
<input type="text" type="titol" >
<input type="submit" value="OK">
</form>
LCFIB- 2008
L'evolució del DOM “simple”
El DOM “simple” permetia accedir només a
– Valor de camps de formularis
– Frames i finestres Extensions propietaries i incompatibles
– Netscape 4: layers (document.layers[])
– Explorer: array “all”, amb els elements de la pàgina
– Ens obligava a fer 2 versions de les pàgines! Últimes versions de navegadors
– Implementació estàndard del DOM versió 2
– document.getElementById() per accedir als elements
LCFIB- 2008
Exemple: àrea desplegable amb DOM
<script>
function desplegar(id) {
valor=document.getElementById(id).style.display;
if (valor!="block") {valor="block";} else {valor="none";}
document.getElementById(id).style.display=valor;
}
</script>
<style>
.desplegable {display:none}
</style>
...
<div><a href=”javascript:desplegar('op1')">Desplegar</a></div>
<div class="desplegable" id="op1">
Aquest text apareixerà i desapareixerà</div>
LCFIB- 2008
Javascript + DOM
Obrim la porta a manipular la pàgina un cop carregada Funcions per accedir i manipular l’arbre, normalment a partir
del seu ID
– node=getElementById(“x”)
– node.appendChildren(node2)
– node.parentElement
Podem mostrar, amagar, moure elements de la pàgina i crear interfaces molt mes agradables i usables.
Hem d’estar preparats per patir diferències entre navegadors
– Hi ha llibreries que ens permeten abstrure'ns
LCFIB- 2008
Un exemple: tiddlywiki
Representa tot el que es pot arribar a fer
http://www.tiddlywiki.org
Hi podem veure...
– Creació de nous nodes a l’arbre HTML
– Efectes de visualització
– Programació avançada en Javascript
– Accés a objectes interns del navegador per guardar
– I a sobre... pot ser útil!
LCFIB- 2008
La revolució AJAX
AJAX=Asynchronous JavaScript+XML Treballar des del navegador comunicant-se amb el servidor
pero sense necessitat de recarregar les pàgines Ús extensiu de l’objecte XMLHttpRequest
– Permet fer peticions HTTP des de Javascript
– Executa codi JavaScript en resposta a la crida Manipulem el DOM de la pàgina Resultat: pàgines interactives amb 0 recarregues Problemes:
– depenem molt del navegador
– dificultat de desenvolupament
LCFIB- 2008
Fluxe d’execució de AJAX
Tenim un objecte AJAX Creem una instancia i li diem:
– URL a la que connecta
– Funció de callback En rebre la resposta, executem
el callback (assincronament) El callback rep XML, HTML,
JSON... Variant: fem que periodicament
es vagin actualitzant les dades (per exemple per veure actualitzacions de mail)
LCFIB- 2008
Un exemple: Google Maps
Parteix el mapa en “rajoles”, casdascuna amb una URL fixa per posició i nivell de zoom
– Mateixa tecnologia dels jocs 2D (tiles) Quan volem marcar una posició al mapa, hi coloca un
indicador amb un PNG amb transparencies Quan fem un recorregut, genera un PNG amb la ruta i la
posiciona Fa les cerques carregant-les en un iframe
– retorna XML i per JS el parseja i coloca sobre el mapa
– genera també la llista de resultats
– No HTTPRequest, així podem fer “back” Ens proporciona una API que utilitza AJAX
LCFIB- 2008
Més exemples
GMail
– només demana la pàgina sencera al principi
– Demana via xmlhttprequest fragments de Javascript
– Via DOM, modifica la pàgina amb la informacio del JavaScript
Pàgina personalitzada de Google eyeOS
– “sistema operatiu” al navegador
– Un dels creadors era fiber Flickr, ta-da list, Basecamp... Parcialment a filmaffinity (al votar), a atrapalo (buscar vols)...
LCFIB- 2008
Què no és AJAX?
AJAX és un nom que ha funcionat tan bé que s’aplica a coses que no tenen res a veure.
AJAX no es només Javascript
– Si no hi ha interacció amb el servidor, no es AJAX
AJAX no es només XMLHTTPRequest
– Es poden simular recàrregues amb un frame ocult.
– http://developer.apple.com/internet/webcontent/iframe.html
Parlem amb propietat, que per algo som enginyers!
LCFIB- 2008
Conclusions AJAX
AJAX es útil per:
– Tenir interfícies més dinàmiques
– Pantalles en la que les recàrregues molesten
– Aconseguir efectes propis d’aplicacions d’escriptori (autocompletar...)
Però en canvi no es correcte per
– Llistats: url que hem de poder passar a la gent
– Quan el botó de tornar enrere té sentit
– En resum: quan NO estem programant una aplicació
LCFIB- 2008
Javascript avançat
Amb la manipulació del DOM i AJAX, Javascript demostra que serveix per mes que validar formularis i fer “rollovers”
Necessitem capacitats més avançades per fer que poguem realment “programar aplicacions” en Javascript.
– Crear objectes i classes
– Passar com a paràmetres estructures complexes
– Crear “callbacks” en resposta a events
– Facilitar l’us de AJAX
– Accedir facilment al DOM Algunes d’aquestes capacitats depenen del navegador i es fa
necessari una llibreria que ens abstregui
LCFIB- 2008
JSON. Tipus complexes en Javascript
Javascript Object Notation Es una forma en que podem declarar un objecte en Javascript
i que també serveix com a notació per dades estructurades{aula:’Tecnologies web’,
professors:[
{nom:’Jaume’,cognom:’Moral’},
{nom:’Daniel’,cognom:’Golobart’}
]}
Permet “simular” passar paràmetres a una funció per nom o pasar estructures complexes
Molt utilitzat en llibreries, per simplificar les API. Similar a XML en el que permet expressar, pero més llegible
per les persones
LCFIB- 2008
La llibreria Prototype
Molt bon dissenyada i base d’altres llibreries Proporciona una capa per programar més còmodament Funció equivalent a document.getElementById()
$(‘element’)
Gestió d’incompatibilitats. executa fins que funcioni algo:Try.these {
funcio1(),
funcio2()
}
Registrar handlers pels events.Event.observe(‘element_id’,’click’,callback,false);
LCFIB- 2008
Llibreria Prototype (2)
Objecte AJAX
var myAjax = new Ajax.Updater('element_a_actualitzar','http://servidor/url',{method: 'get', parameters:'p=nosque' }
);
Ajuda en la sintaxi per declarar classes
MevaClasse = Class.create();MevaClasse.prototype = { initialize : function(el) { this.el = el; }, ...}
m=new MevaClasse(el);
LCFIB- 2008
Llibreria script.aculo.us
Llibreria construida sobre Prototype Efectes i animacions (no AJAX) de forma molt senzilla Drag & drop Per AJAX
– Autocompletar
– Edició “in place” com el tiddlywiki
– Lligar el drag and drop Molt senzilla d’utilitzar:
Effect.BlindDown('id_of_element', {duration:3});
Ajax.InPlaceEditor('editme', '/demoajaxreturn.php');
Paradoxalment té un web tremendament mal dissenyat
LCFIB- 2008
Altres llibreries útils
Yahoo User Interface library (YUI)
– http://developer.yahoo.com/yui/
– Similar a script.aculo.us
– Molt ben documentada Google Web Toolkit (GWT)
– http://code.google.com/webtoolkit/
– Orientada únicament a AJAX
– Es una llibreria Java que genera el Javascript
– Parteix de la base que no hem de programar Javascript JQuery
– http://jquery.com/
LCFIB- 2008
i el Flash? Millor FLEX
Supera a HTML + Javascript amb temes relacionats amb gràfics vectorials, pero no en temes d'interfaces d'usuari
Encara que es pugui generar d'altres formes, el normal es fer-ho a partir del Flash Editor. Incomode (per programadors)
La solució: FLEX 2
– Framework basat en Flash per aplicacions "riques"
– Llenguatge per generar interfícies MXML(similar a HTML) + ActionScript (similar a Javascript)… sense problemes de navegador!
– Permet accedir a dades remotes per HTTP
– SDK gratuit, un compilador que genera fitxers .swf
– Es pot integrar a Eclipse
LCFIB- 2008
Altres tecnologies per les RIA (Rich Internet Applications)
OpenLaszlo
– Framework OpenSource que genera HTML+Javascript o Fitxers Flash (SWF) a partir de LZX
Silverlight
– Es l'alternativa a Flex de Microsoft.
– XAML per definir l'interface + programació en algun llenguatge de la família .NET
Adobe AIR
– Permet crear aplicacions multiplataforma d'escriptori com si fossin aplicacions web. Poden estar basades en HTML+Javascript o en FLEX
Els oblidats: Java Applets / Controls ActiveX
LCFIB- 2008
Conclusions
Una pàgina web no es una pàgina immutable i estàtica
– La seva extructura s'exposa via DOM
– Es pot manipular i canviar la visualització
– Pot respondre a events Javascript
– Pot demanar informació a un servidor via AJAX Pero…
– Hem de tenir en compte diferències entre navegadors
– Hem de recorrer a llibreries per facilitar la programació
Hi ha alternatives a la idea de HTML + Javascript que poden evitar aquesta complexitat.
LCFIBJordi Girona 1-3, Mòdul B6E-08034 Barcelona, Spain
[email protected]://www.fib.upc.es/LCFIB/
Conceptes bàsics d'aplicacions web.
LCFIB- 2008
De què parlarem?
La interacció bàsica amb aplicacions web Pas de paràmetres Sessions Cookies Proteccions / seguretat Connexions a BD
LCFIB- 2008
Interacció bàsica amb aplicacions web
Com pot comunicar-se una pàgina web amb el servidor? Utilitzant el protocol HTTP
Seguint un link
– Demana al servidor una certa URL, que pot ser una pàgina generada pel servidor i el navegador la carrega.
Enviant un formulari
– Li enviem les dades que acabem d'omplir Amb una petició tipus AJAX
– El navegador fa una petició "en background" i sense recarregar la pàgina
Veurem quins elements intervenen en aquesta comunicació
LCFIB- 2008
Pas de paràmetres
Les aplicacions web permeten el pas de paràmetres de 2 formes: GET i POST
GET
– S'afegeixen els paràmetres a la URL POST
– S'envien com una segona part de la petició Aquesta informació es posa al formulari que envia els
paràmetres. Hi ha una tercera forma que ens permet enviar fitxer complets
al servidor (fer uploads). S'envia codificat en MIME Els parametres son strings. Qualsevol tipus complex requereix
un tractament dels que s'encarrega la plataforma escollida
LCFIB- 2008
Sessions
Cada petició HTTP és independent de les altres. Problema quan volem desenvolupar aplicacions.
El protocol no proporciona cap mètode per saber des del servidor quines peticions ens arriben del mateix client, no incorpora el concepte de sessió.
Tècniques per aconseguir tenir estat:
– Cookies amb un identificador de sessió
– Paràmetre ID_SESSIO Altres possibles tècniques
– Adreça IP. No sempre funciona.
LCFIB- 2008
Mites sobre la falta d’estat
“Jo treballo amb IIS i el servidor ja suporta
sessions, sense necessitar cookies”
“Per què hem de passar un identificador de sessió?
Encara que desactivem les cookies el PHP
ja té una variable amb la sessió.”
Aquestes frases ens mostren que no s’ha entès el significat de “sense estat”. Espero no sentir-les de vosaltres…
Si volem sessions, el navegador sempre ha d’enviar alguna dada en les seves peticions per identificar-se. El servidor no fa miracles
LCFIB- 2008
Cookies
Les cookies permeten guardar al client petites quantitats d’informació i després tornar-les a enviar cap al servidor.
Un servidor ens pot enviar una cookie quan demanem qualsevol fitxer, afegint una capçalera de l’estil...
Set-Cookie: foo=bar; path=/; expires Mon, 21-Feb-2005 13:46:00 GMT
Quan fem una altra petició al mateix servidor, enviem aquesta informació en una capçalera extra
Cookie: foo=bar
Les cookies no les demana el servidor: les envia automàticament el navegador com si fos un paràmetre
LCFIB- 2008
Cookies de sessio
Les cookies que no tenen data de caducitat duren fins que es tanca el navegador. Son cookies de sessió
Les plataformes de desenvolupament web més conegudes (JSP, ASP, PHP…) utilitzen cookies per mantenir la sessió
La primera vegada que ens connectem al web, ens donen un identificador aleatori, que anirem enviant mentre no tanquem el navegador
El servidor es guardarà valors associats a aquest identificador (una mena de taula de hash)
Cookies habituals:
– JSESSIONID, PHPSESSID, ASPSESSIONID
LCFIB- 2008
Eines per treballar amb cookies
Si estem desenvolupant una aplicació web i les coses no acaben de funcionar, pot ser interessant veure que esta passan amb les cookies
Live http headers
– Permet veure les capçaleres HTTP que s'estan passant entre el client i el servidor. Entre elles, les cookies
Add'n'edit cookie
– Permet manipular les cookies que tenim i canviar el valor
Exemple: Bústia
LCFIB- 2008
Paràmetre ID_SESSIO
És un substitut de les cookies, amb exactament la mateixa idea de la cookie de sessió, però passat explícitament com un paràmetre o una part de la URL
És més difícil d'implementar, perquè les nostres aplicacions l'han de passar explícitament a qualsevol petició que es faci al servidor, reescrivint les URL a les pàgines.
Podem perdre la sessió si fem una petició al servidor sense l’identificador (per exemple, una pàgina estàtica)
No es guarda cap informació: el id_sessió només serà vàlid fins que tanquem el navegador
Funciona sempre, ja que no depenem d'una funcionalitat que pot estar desactivada.
LCFIB- 2008
Perquè no podem utilitzar la IP?
Si necessitem un identificador per identificar el client… perquè no utilitzem l’adreça IP origen?
– Cas 1: tenim una màquina multiusuari amb diferents usuaris accedint a la vegada a internet. Tots ells serien tractats com la mateixa persona.
– Cas 2: Hi ha una màquina intermitja que fa de proxy. Automàticament, totes les peticions que fem tenen com a origen la IP del proxy
LCFIB- 2008
Perquè ens pot servir la sessió?
Saber que una sèrie de peticions ha vingut del mateix usuari, sense haver de confiar en la IP
Guardar temporalment al servidor informació de l’usuari
– Carret de la compra Guardar-se el fet que ja hem introduit un username i
password valids i estem autentificats. Permet guardar valors que han d’estar disponibles en altres
pàgines i sense haver d’enviar més cookies
– Exemple: idioma triat
LCFIB- 2008
Quan acaben les sessions?
En sistemes orientats a connexió, la sessió acaba quan tallem la connexió. En web no existeix aixo
3 possibilitats
– Tanquem el navegador. S’esborra la cookie pero no la informació que teníem al servidor
– Caduca. Els servidors es configuren perque la informació de la sessió caduqui passats uns minuts d’inactivitat
– Invalidem la sessio. Anem a una pàgina que esborra la informació de la sessió
Una sessió no invalidada ni caducada és perfectament vàlida al servidor. Si tenim el seu identificador, la podem “robar”
LCFIB- 2008
Seguretat declarativa
És afegir autentificació i autorització dels usuaris en una aplicació sense haver de tocar el codi
autentificació: és el fet de saber que una persona es qui diu ser (normalment, en base a un usuari i password)
2 grans formes:
– HTTP Basic authentication (amb un popup)
– Basada en forms i sessions autorització: és el fet de permetre o no a un usuari l’accés a
un cert recurs (normalment, en base als rols d’aquest usuari) Per exemple, JSP permet fer-ho al fitxer web.xml, PHP a la
configuració del servidor Apache
LCFIB- 2008
Accés a bases de dades
Generar pàgines dinàmiques normalment implica treballar amb alguna bases de dades
En una aplicació no web, podem connectar una vegada al principi de l'aplicació i desconnectar al final.
En una aplicació web, no tenim clar quan ens desconnectem, així que no podem mantenir una connexió oberta "per sempre"
Obrir i tancar connexions continuament cada vegada que hem d'accedir a la BD té un cost
Solució: pool de connexions
– Tenim una sèrie de connexions obertes
– Agafem una quan la necessitem i la tornem al pool
– Permet aprofitar millor els recursos
LCFIB- 2008
Conclusions
Programem amb el que programem, hem de tenir molt clars una sèrie de conceptes
– Els diferents tipus de pas de paràmetres
– Els problemes que ens poden portar les sessions
– El fet de no tenir estat i els problemes que implica
– La millor forma de plantejar la seguretat d'una aplicació és de forma declarativa.
– Els problemes que poden representar els accessos a les bases de dades
La plataforma que escollim per programar probablement ja ens aïllarà d'aquests conceptes, però és bo saber-los.
LCFIBJordi Girona 1-3, Mòdul B6E-08034 Barcelona, Spain
[email protected]://www.fib.upc.es/LCFIB/
Les arquitectures basades en Java (de JSP a JEE)
LCFIB- 2008
De què parlarem
Java com a llenguatge per fer aplicacions web Servlets JSP El concepte d'aplicació web L'especificació JEE Els servidors JEE
LCFIB- 2008
Java: un llenguatge buscant el seu lloc
Java va sorgir fa ja més de 10 anys Primera utilitat: petits programes que s'executen al navegador
(amb el plugin de Java): els Applets
– A la època, la única forma d'afegir més interactivitat
– Complexitat per tenir el plugin correcte
– Actualment quasi no s'utilitzen (millor Flash o similars) Segon intent: Java per aplicacions d'escriptori
– No gaire èxit. Aplicacions massa pesades Tercer intent: Java al servidor
– Al no tenir interfície d'usuari, funcionava millor
– Aplicacions web
LCFIB- 2008
Servlets
Framework per generar pàgines web des de classes Java Tenim accés a la petició, la resposta, la sessió i a paràmetres
d’aplicació Anem escrivint la pàgina des del programa, generant el codi
HTML per programa. (Sí, es molt lleig!) Necessitem un contenidor de servlets, bàsicament es un
programa Java que carrega els Servlets i els executa en resposta a la nostra petició
El servidor més conegut es Apache Tomcat
– Servidor de referència (quan surt una nova especificació, es qui l'implementa)
LCFIB- 2008
Exemple de Servlet (1)
import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ServletConsulta extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
LCFIB- 2008
Exemple de Servlet (2)
out.println("<HTML>");
out.println("<BODY>");
out.println("<TABLE border=1>");
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn=
DriverManager.getConnection("jdbc:odbc:authors");
Statement stmt=conn.createStatement();
ResultSet rset=
stmt.executeQuery("SELECT * FROM AUTHORS");
int cols=rset.getMetaData().getColumnCount();
LCFIB- 2008
Exemple de Servlet (3)
while(rset.next()) {
out.println("<TR>");
for (int i=1;i<=cols;i++) {
out.println("<TD>"+rset.getString(i)+"</TD>");
}
out.println("</TR>");
}
out.println("</BODY>");
out.println("</HTML>");
rset.close();stmt.close();conn.close();
} catch (Exception e) {
out.println(e.toString());
}
}
}
LCFIB- 2008
JSP
JSP permet tenir pàgines HTML amb codi Java que s'executa abans de tornar-la cap al client.
Permet cridar altres classes Java, on hi haurà el gruix del codi. Les JSP fan de vista, amb un mínim de codi. Per exemple...
<jsp:useBean id="cart" scope="session” class="session.Carts” />
</jsp:useBean>
No s’interpreta el codi cada vegada. La primera invocació fa que es compili la pàgina i es converteixi en un servlet.
LCFIB- 2008
Exemple amb JSP (1)
<%@ page language="java" import="java.sql.*" %>
<HTML>
<BODY>
<%
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn=
DriverManager.getConnection("jdbc:odbc:authors");
Statement stmt=conn.createStatement();
ResultSet rset=
stmt.executeQuery("SELECT * From authors");
int cols=rset.getMetaData().getColumnCount();
%>
LCFIB- 2008
Exemple amb JSP (2)
<TABLE border = 1>
<% while(rset.next()) { %>
<TR>
<% for (int i=1;i<=cols;i++) { %>
<TD> <%= rset.getString(i) %> </TD>
<% } %>
</TR>
<% } %>
</TABLE>
<% rset.close();
stmt.close();
conn.close(); %>
</BODY>
</HTML>
LCFIB- 2008
La idea de Tag Libs
JSP permet declarar nous tags per posar a les notres pàgines i associar-los a codi java
Podem aconseguir una molt més gran separació entre presentació i codi: idea de JSP sense codi Java
Per una llista de Tag Libs ja programats...
– http://jakarta.apache.org/taglibs/ Hi ha una llibreria estàndar (JSTL), que permet no haver de
recorrer a Java dintre de JSP per moltes coses.
– Iteradors, condicionals...
– Nou lleguatge per expressions: expression language
– Ben utilitzada, converteix un JSP en una plantilla
LCFIB- 2008
Exemple de pàgina amb Tag Libs
<sql:driver var="dataSource"
driver="sun.jdbc.odbc.JdbcOdbcDriver” url="jdbc:odbc:authors">
<sql:query var="authors" dataSource="$dataSource">
SELECT * FROM Authors
</sql:query>
<table>
<c:forEach var="row" items="$authors.rows">
<tr>
<td>${row.Au_ID}</td>
<td>${row.Author}</td>
<td>${row.YearBorn}</td>
<td>
</c:forEach>
</table>
LCFIB- 2008
Aplicacions JSP/Servlet: Web applicacions
Concepte d’aplicació, no només pàgines independents. Separarem en una estructura de directoris...
– Pàgines estàtiques i JSP
– Classes Java que s’executen com a servlets
– Classes Java d’utilitats (JavaBeans) o Taglibs Configurarem l’aplicació al fitxer web.xml…
– Paràmetres d’inicialització
– Mapejos de URL a servlets
– Usuaris, grups i autoritzacions
– Recursos externs que necessitem (p.e. DataSources) Empaquetarem tot aixo en un fitxer .WAR
(Web Application Archive)
LCFIB- 2008
Llibreries que ens poden ser útils
Java té moltissimes llibreries, moltes d'elles útils per web log4j
– Sistema de logs configurable
– Per posar “xivatos” i treure'ls fàcilment Velocity, Freemaker
– Sistema de plantilles en Java
– Per si no ens agraden les JSP HttpClient
– Per poder connectar-nos a altres servidors web iText
– Generar PDF
LCFIB- 2008
Conclusions sobre Servlets/JSP
Bona idea d'aplicació web en que posem en un sol paquet
– Aplicació
– Fitxers de configuració S’ha convertit en un estàndard amb molta acceptació,
especialment al mon empresarial Suport per fer aplicacions estructurades Llibreries de qualsevol cosa: busqueu abans de desenvolupar!
Per donar suport a necessitats mes avançades sobretot en el mon empresarial es va crear l'especificació JEE (abans coneguda com a J2EE)
LCFIB- 2008
Un canvi de filosofia
Fins ara ens hem plantejat el desenvolupament de contingut dinàmic des del punt de vista web
Quan ens estem plantejant una aplicació més gran, per exemple, un sistema de banca on-line, hem de pensar d’una altra forma
Pàgines webPàgines
dinàmiques
AplicacióAplicació ambinterfície web
LCFIB- 2008
Model general d’aplicacions de 3 capes
BD
Lògicade negoci
Clients no web
Presentació
Altressistemes
LCFIB- 2008
Arquitectura JEE
Arquitectura completa d’aplicacions de n-capes basat en la plataforma Java
Idea principal: aplicacions a la capa intermitja, accessibles a través navegadors web o altres tipus de client
– Components per la lògica de negoci
– Capa de presentació
JEE és un Model de programació
– Com hem de desenvolupar les aplicacions? JEE és una Plataforma:
– Què necessitem per executar-les?
LCFIB- 2008
Elements del Model d’Aplicació
Model de components
– EJB (Enterprise Java Beans) Capa de presentació
– Servlets /JSP Protocol per comunicar components remots
– RMI / IIOP Accés a bases de dades o altres fonts d’informació
– JDBC (Bases de dades relacionals)
– JNDI (Serveis de directori)
– JavaMail (Correu electrònic)
– JTA (Transaccions)
LCFIB- 2008
Esquema de l’arquitectura
LCFIB- 2008
Què és un EJB?
Són components de l’aplicació que s’executen a la capa intermitja i que executen la lògica de negoci. El que us expliquen com “capa de domini”
Han d’executar-se en un servidor de EJB, que els hi proporcionarà serveis transaccionals, persistència, alta disponibilitat...
Ha passat per unes especificacions molt complexes que han fet que no s’utilitzessin gaire.
L’especificació actual (EJB 3.0) es basa en les anotacions de Java 5.0 per configurar-les.
– @Stateful, @Stateless
– @Remote
LCFIB- 2008
Exemple. Botiga de llibres
LCFIB- 2008
Servidors JEE
Per poder executar una aplicació que utilitzi EJB, necessitem un servidor que sigui "JEE compliant"
Hi ha una gran quantitat d'aquests servidors que basen el seu negoci en els serveis d'assessorament i consultoria
A l'estar dirigits bàsicament a empreses es centren en temes d'alta disponibilitat.
– Jboss, líder dintre dels Open Source
– Glassfish de Sun Microsystems, ara en Open Source
– Oracle Application Server
– BEA Weblogic
– IBM Websphere
– ...
LCFIB- 2008
Conclusions d'arquitectures Java
Java ha trobat un lloc com a plataforma pel desenvolupament d'aplicacions empresarials
JEE són actualment 23 especificacions diferents que ha de complir qualsevol servidor per ser "JEE compliant"
Una aplicació JEE teòricament es pot executar en qualsevol d'aquests servidors "sense canvis"
És necessaria tota aquesta complexitat? Normalment, no
Un servidor com Tomcat (no totalment JEE ni de lluny) pot executar la majoria d'aplicacions Java que necessitem
Per exemple, el Racó
LCFIBJordi Girona 1-3, Mòdul B6E-08034 Barcelona, Spain
[email protected]://www.fib.upc.es/LCFIB/
Frameworks i altres llibreries d’aplicacions web
LCFIB- 2008
Frameworks
Que és exactament un framework? Struts Spring i com lligar-lo amb Struts Hibernate L'arquitectura completa El nouvingut: Ruby on rails
Mantra d’aquesta lliçó:
– Tothom es troba els mateixos problemes
– Hi ha gent que sap mes que nosaltres que els ha resolt
– No reinventem la roda
LCFIB- 2008
Framework <> plataforma <> llibreria
Una plataforma normalment implica una decisió de
– Hardware
– Servidors
– Llenguatge de programació Una llibreria normalment s’utilitza per solucionar un problema
concret En canvi un framework...
“Un framework, es un conjunt de llibreries per una determinada plataforma que condicionen totalment la forma en que ens plantegem, organitzem i desenvolupem una aplicació“(definició pròpia)
LCFIB- 2008
Perquè un framework?
En un primer moment
– Són excessivament restrictius
– Les coses passen i no sabem perque Amb el temps
– No hem de pensar desde zero. Programar es converteix en “omplir forats”
– Facilitem el manteniment. Qualsevol persona que conegui el framework triat podrà modificar fàcilment la nostra aplicació
En general es bo utilitzar un framework quan veiem que la nostra aplicació pot ser complexa o altres persones l’hauran de mantenir
El problema es: quin framework triar?
LCFIB- 2008
JEE es un framework?
Presentació amb JSP / Servlets Model implementat amb EJB Interacció amb la base de dades feta pel contenidor Aixo condiciona totalment com ha de ser la nostra aplicació,
per tant JEE es un framework
Podem pensar en JEE només com un conjunt de llibreries que podem fer servir o no
Podem triar no fer servir EJB Podem decidir fer nosaltres la persistència amb BD En resum, podem decidir passar del framework de JEE
LCFIB- 2008
Frameworks i llibreries per JEE que s'han imposat
Struts
– Capa de presentació
– Permet estructurar les aplicacions segons el patró MVC Spring
– Ens permet estructurar la capa de domini
– Es basa en el patró Dependency injection Hibernate
– No es pot considerar propiament un framework, sino un mapejador d'objectes a bases de dades relacionals
Els veurem un a un per veure que ens poden oferir i entendre com colaboren per formar una gran plataforma
LCFIB- 2008
L'aplicació d'exemple
Farem un petit gestor de tasques Una tasca tindrà un nom i una prioritat Hi ha haurà una pantalla de llistar les tasques Podrem editar-les, esborrar-les i crear-ne de noves
Una paraula d'advertència. És necessari utilitzar 3 frameworks per una aplicació tan tonta?
La resposta es NO En aquest cas ho estem fent per mostrar les idees claus
d'aquests 3 frameworks. No hem de fer aplicacions "overengineered". El codi que
menys falla es aquell que no existeix.
LCFIB- 2008
Forçant MVC: Struts
Struts és un framework que ens permet forçar les nostres aplicacions a utilitzar MVC
– Proporciona un servlet controlador configurable amb un fitxer XML amb les accions a executar per cada una de les URL de l'aplicació (les classes Actions)
– Tenim uns objectes (els ActionForms) que permeten accedir desde les Actions als valors entrats als formularis de les nostres pàgines.
– Les Actions actuen sobre les classes Java que formen el model, que son les que realment fan la feina
– A les vistes, ens proporciona tags que ens ajuden a visualitzar les dades dels formularis o obtingudes per les Actions
LCFIB- 2008
Exemple: form nova tasca
<html:form action="/guardarTasca">
<html:hidden property="id" />
Nom: <html:text property="nom"/>
<br>
Prioritat: <html:text property="prioritat"/>
<html:submit value="Guardar"/>
</html:form>
Taglibs pels elements del form (nom, propietat, id) que es mapegen amb les propietats de l'ActionForm
Fem referència a URL declarades al struts-config.xml
LCFIB- 2008
El ActionForm associat a aquest formulari
<form-bean name="tascaForm" type="org.apache.struts.action.DynaActionForm">
<form-property name="id" type="java.lang.Integer" initial="-1" />
<form-property name="nom" type="java.lang.String" />
<form-property name="prioritat" type="java.lang.Integer" initial="1" />
</form-bean>
Descrivim les propietats del form Podem fer la classe per programa o declarar-la al struts-
config.xml (es aquest cas)
LCFIB- 2008
Una Action al struts-config.xml
<action path="/guardarTasca"
type="presentacio.GuardarTascaAction"
name="tascaForm"
scope="request">
<forward name="success" path="/llistaTasques.do"
redirect="true"/>
<forward name="error" path="/errorTasca.jsp"/>
</action>
Per cada acció de la nostra aplicació tenim
– què s'executa (en aquest cas el GuardarTascaAction)
– quins paràmetres li arriben (estaran al tascaForm)
– vistes on podem anar després de executar-la
LCFIB- 2008
La Action GuardarTascaAction
public class GuardarTascaAction extends Action {
public ActionForward execute(
ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
DynaActionForm f=(DynaActionForm)form; try {
// Crear una tasca i guardar-la obtenint les dades de
// f.get("nom") i f.get("prioritat")
return mapping.findForward("success");
} Catch (Exception e) {
return mapping.findForward("error");
}
}
}
LCFIB- 2008
Exemple de Action i Vista lligades
La Action obté una llista de tasques...
Tasca[] tasques= gt.llistar();
request.setAttribute("tasques",tasques);
return mapping.findForward("success");
La vista visualitza les dades colocades per la Action...
<c:forEach var="tasca" items="${tasques}">
<tr>
<td>${tasca.id}</td>
<td>${tasca.nom}</td>
<td>${tasca.prioritat}</td>
</c:forEach>
LCFIB- 2008
Flux d'una aplicació struts
Demanem una URL struts (normalment acaba en .do) Totes aquestes URL van a parar al servlet controlador Empaquetem els paràmetres (si n'hi ha) en la classe de tipus
ActionForm especificada. Mirem al fitxer XML quina classe hem d'executar per la URL
que ens han demant Executem el mètode execute() de la ActionClass que toqui
passant-li el ActionForm amb els paràmetres La Action retorna quina vista ha de mostrar i posa les dades
necessaries a l'entorn. La vista es construeix consultant les dades que la Action li
proporciona
LCFIB- 2008
Flux d'una aplicació struts
LCFIB- 2008
Més sobre struts
D'entrada sembla complicat En una aplicació gran, ajuda molt a la organització. No ens obliga a utilitzar tecnologies concretes
– domini o persistència com volguem
– Les vistes, no necessàriament JSP
Que mes permet?
– Sistematitzar les validacions. Podem fer que el ActionForm validi els valors entrats, per programa o per configuració
– Plugin Tiles. Idea de jsp:include
– Internacionalització dels missatges (fitxer properties)
LCFIB- 2008
Conclusions sobre Struts
Struts es un dels primers frameworks MVC que va sortir per Java
Permet automatitzar processos que poden donar lloc a errors com per exemple les validacions
Ordena el nostre codi
– Les Actions no tenen res de codi de presentació
– El pas de paràmetres cap a les accions queda especificat a través de les propietats dels objectes Form
– Les vistes no "executen" res, només mostren
– El nostre struts-config.xml mostra el flux de l'aplicació (el podriem dibuixar com un diagrama d'estats)
LCFIB- 2008
Spring
Es un framework de frameworks, pero en aquest cas ens centrarem en el contenidor lleuger
Serveix per organizar millor la nostra capa de domini
– Programació basada en interfaces
– Èmfasi en el baix acoblament de les classes
Exemple: l'aplicació de les tasques
– Tindrem la classe "Tasca"
– Necessitarem un GestorTasques, que serà una façana de tot el nostre sistema
– El GestorTasques utilitzarà un TascaDAO per guardar les tasques. Per ara, en tindrem un de prova
LCFIB- 2008
Capa de domini de l’aplicació d’exemple
GestorTasques
TascaDAO
<<interface>>
ProvesTascaDAO JDBCTascaDAO
DataSource
Tasca
LCFIB- 2008
Si no utilitzem Spring...
Qui crea el gestorTasques? Es crea en cada petició?
– Podem utilitzar el patró Singleton
Si el gestorSoci utilitza un objecte de tipus DAO, li especifiquem quin es per programa?
– Si, es clar. Com a molt podriem tenir un fitxer de propietats si volem que es pugui canviar
Com li diem la base de dades al DAO?
– Utilitzarà JNDI per anar-la a buscar o bé la configurarem en un fitxer de propietats també
LCFIB- 2008
Si utilitzem Spring...
Spring ens permetrà
– Llegir un fitxer de configuració on li diem els objectes que formen el nostre sistema
– Si una classe depèn de una altra, farem aquesta dependència explícita al fitxer. A nivell de programació, tindrem un “setter” d’aquesta propietat.
– Spring fa de “muntador” de l’aplicació
Es basa en Inversion of Control o principi de Hollywood,
– "No ens truquis, dona'ns el número i et truquem nosaltres"
– No creis els objectes. Deixa un "set" i te l'assignarà Spring
LCFIB- 2008
Què hauríem d’afegir a les nostres classes?
El nostre DAO necessita un Datasource? Li afegimDataSource setDataSource (Datasource ds) {
this.ds=ds;
}
El nostre GestorTasques necessita un TascaDAO?TascaDAO setTascaDAO (TascaDAO dao) {
this.dao=dao;
}
Fixem-nos que TascaDAO es un interface. Aixo permet canviar facilment la implementació que utilitzarà el GestorTasques tocant la configuració de Spring.
LCFIB- 2008
Fitxer de configuració Spring (proves)
<beans>
<bean id="gestorTasques" class="exemple.GestorTasques">
<property name="tascaDAO">
<ref bean="provesTascaDAO"/>
</property>
</bean>
<bean id="provesTascaDAO" class="exemple.ProvesTascaDAO">
<property name="tasques">
<list>
<bean class="exemple.Tasca">
<property name="id" value="1"/>
<property name="nom" value="Acabar transparencies"/>
<property name="prioritat" value="1"/>
</bean> ...
</list>
</property>
</bean>
</beans>
LCFIB- 2008
Fitxer de configuració real
<beans>
<bean id="mysqlDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/aules" />
<property name="username" value="aules" />
</bean>
<bean id="gestorTasques" class="exemple.GestorTasques">
<property name="tascaDAO">
<ref bean="JDBCTascaDAO"/>
</property>
</bean>
<bean id="JDBCTascaDAO" class="exemple.JDBCTascaDAO">
<property name="dataSource">
<ref bean="mysqlDataSource"/>
</property>
</bean>
</beans>
LCFIB- 2008
Què fa Spring amb aixo?
El contenidor (que s'anomena ApplicationContext) només es crearà una vegada, quan s’inicialitzi l’aplicació, que pot ser web o noApplicationContext ctx = new
ClassPathXmlApplicationContext("applicationContext.xml");
En el moment en que inicialitzem el contenidor...
– Spring parsejarà el fitxer i crearà les instàncies
– Cridarà els “setters” de les propietats per passar-li els paràmetres especificats
A través del contenidor, podrem accedir a les instàncies creadesctx.getBean("gestorTasques"));
LCFIB- 2008
Què mes ens permet Spring?
Permet fer referències per tipus
– exemple: crear un DataSource i passar-lo a totes les classes que en necessitin un
Spring JDBC
– Exepcions “amb sentit”
– Ens podem oblidar d’obrir i tancar connexions Spring MVC
– Similar a struts, però integrat al contenidor. AOP (Aspect Oriented Programming)
– Permet configurar codi a executar quan cridem un mètode d’un bean obtingut de Spring. Interceptors.
– Serveix per marcar transaccions
LCFIB- 2008
Conclusions sobre Spring
Es un framework poc habitual: no ens condiciona massa la forma de programar, només ens estructura
Un cop entès el concepte de Inversion of Control i utilitzat de forma bàsica, no es gens complicat
Les nostres classes no son conscients de que l’estem utilitzant. Fins i tot podriem arribar a canviar-lo o prescindir d’un framework de la capa de domini
Únic punt negatiu: els fitxers de configuració son horribles.
LCFIB- 2008
Hibernate
Intenta solucionar l’etern problema de la persistència
– Per un costat tenim la nostra aplicació amb objectes
– Per l’altre, una BD relacional (mysql, Oracle…)
– Com les casem? hibernate Hibernate es un mapejador Objecte-Relacional. No és un
framework tal i com l’hem definit. Fitxer XML amb
– els mapejos propietats <-> columnes
– relacions entre elles Ofereix una capa de persistència pels objectes A la vegada, ofereix una forma de consultar-los
– Igual que SQL, pero amb els objectes
LCFIB- 2008
Hibernate: exemple de guardar un objecte
// ...Configuration cfg = new Configuration() .addClass(Product.class) .addClass(Order.class) .addClass(OrderItem.class);
// ...Order order = new Order();order.addProduct(milk, 3);order.addProduct(coffee, 5);
// ...sess = sf.openSession();Transaction t = sess.beginTransaction();sess.save(order);t.commit();sess.close();
LCFIB- 2008
Hibernate: exemple de consulta
// ...String query = "select o from o " + "in class test.hibernate.Order " + "where o.priceTotal > :priceTotalLower " + "and o.priceTotal < :priceTotalUpper";
// ... Query q = sess.createQuery(query);q.setDouble("priceTotalLower", Double.parseDouble(args[0]));q.setDouble("priceTotalUpper", Double.parseDouble(args[1]));
List list = q.list();// ...sess.close();// ...
LCFIB- 2008
Relacions
Implementa relacions entre classes Exemple: equips i jugadors
<hibernate-mapping> <class name="example.Team" table="teams"> <id name="id" column="team_id" type="long" unsaved-value="null"> <generator class="hilo"/> </id> <property name="name" column="team_name" type="string" length="15" not-null="true"/> <property name="city" column="city" type="string" length="15" not-null="true"/> <set name="players" cascade="all" inverse="true" lazy="true"> <key column="team_id"/> <one-to-many class="example.Player"/> </set> </class></hibernate-mapping>
LCFIB- 2008
Com soluciona les relacions?
A partir d’aquest fitxer, genera l’esquelet de la classe Bidireccional:
– Des del jugador, podem accedir a l’equip (getTeam)
– Des de l’equip podem accedir al jugadors (getPlayers)
– Ens torna un Set (conjunt) de resultats Lazy:
– Quan carreguem un jugador, no carrega els jugadors
– Quan volem els jugadors, s’accedeix a BD
– No podem tancar la sessió Cascade
– Mateix sentit que a bases de dades
LCFIB- 2008
Hibernate a l'exemple de les tasques
Farem un DAO utilitzant Hibernate Li passarem la configuració amb Spring Mapejarem la taula "tasques"
<hibernate-mapping>
<class name="exemple.Tasca" table="TASQUES">
<id name="id" column="ID">
<generator class="increment"/>
</id>
<property name="nom" column="NOM"/>
<property name="prioritat" column="PRIORITAT"/>
</class>
</hibernate-mapping>
LCFIB- 2008
Conclusions sobre Hibernate
Hibernate posa una capa important respecte a executar SQL contra una base de dades
– Pot tenir mètodes de cache que acceleren les nostres consultes i optimitzar la velocitat
– Pot generar un SQL molt més costós que el que podriem generar nosaltres mateixos directament
En general, Hibernate requereix uns coneixements importants de la plataforma per treure el màxim rendiment
Consell particular: Si no us espanta el SQL, utilitzeu JDBCTemplate. No es tan sofisticat, pero dona més sensació de control.
LCFIB- 2008
Resumint l'exemple
Amb Struts hem fet la capa de presentació
– pantalles amb JSP
– Controlador amb les "Action" Amb Spring hem organitzat la capa de domini
– Creació i configuració dels gestors
– Configuració general de l'aplicació Amb Hibernate hem accedit a la BD
– Hem accedit a una base de dades relacional sense abandonar la orientació a objectes
Hem utilitzat les 3 tecnologies conjuntament sense interferències entre elles
LCFIB- 2008
Relació entre Struts i Spring
Plugin de struts al fitxer struts-config.xml
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/applicationContext.xml"/></plug-in>
Canviem les ActionClass per ActionSupport
public class EditarTascaAction extends ActionSupport {
public ActionForward execute(...) throws Exception {
ApplicationContext ctx = getWebApplicationContext();
GestorTasques gt= (GestorTasques)(ctx.getBean("gestorTasques"));
LCFIB- 2008
Cap on anem?
Struts 2
– Evolució de Struts, amb alguns canvis importants
– Ha agafat idees de Spring Anotacions
– Novetat de Java 1.5
– Permet fer comentaris que després es puguin llegir, es a dir, afegir informació a les classes, mètodes i propietats
– Permet estalviar-nos alguns fitxers de configuració
– Exemples: columnes de BD a que equivalen propietats
LCFIB- 2008
Necessitem eines!
xDoclet
– Generador automàtic de fitxers a partir de “meta-informacio” als fitxers Java
– Es com un JavaDoc ++, les anotacions ho han copiat Eclipse + plugins adequats
– Entorn de desenvolupament extensible
– Desenvolupar amb el plugin adequat pot suposar que una tecnologia sigui o no usable.
ANT i Maven
– Entorns per compilar, similar al Make Junit
– Framework per proves unitaries.
LCFIB- 2008
Conclusions de frameworks
Utilitzar Spring, Struts i Hibernate es complex La corba d'aprenentatge es important Costa dominar-los al 100% Canviem programació per configuració de fitxers XML Tenim més codi del que voldríem, tot i que tenim eines que
ens ajuden a generar-lo Tot es dolent? No
– Ens obliguen a fer la nostra aplicació més ordenada
– Importants per la mantenibilitat
Existexen frameworks centrats en simplificar? SI
LCFIB- 2008
Ruby on Rails
Ruby és un llenguatge de programació (poc conegut) Rails és un framework per programar aplicacions web Diferència:
– No fa servir fitxers XML i molt poca configuració
– Intenta reduir el codi al màxim
– Es publicita amb videos tipus teletienda
Voleu provar?
– http://instantrails.rubyforge.org/wiki/wiki.pl
– Llibre “Agile Web Development with Rails“
LCFIB- 2008
L'exemple de les tasques (I)
Pas 1: crear l’aplicació
$ rails tasques Pas 2: configurar la BD
– Tocar el fitxer config/database.yml (no XML!) Pas 3: crear la taula i la base de dades al mysql
create table tasks(id int auto_increment primary key, nom char(50), prioritat integer(1));
Pas 4: “programar” el model
– No hem de crear ni configurar res
$ ruby script/generate model task
LCFIB- 2008
L’exemple de les tasques (II)
Pas 5: crear el controlador i les vistes
$ ruby script/generate controller task
i editar el fitxer que esta a app\controllers
Class TaskController < ApplicationController
scaffold :task
end
Pas 6: executar el servidor
$ ruby script/server
Pas 7: provar l'aplicació
http://localhost:3000/task
LCFIB- 2008
Conclusions sobre rails
Aire fresc en el mon dels frameworks “Convention over configuration”
– Suposarem que les coses es diuen d’una certa forma
– Guanyem coherència i estalviem errors Substitueix XML per un format mes senzill Mapeig totalment transparent objecte/relacional URL amb sentit (edit, new...) Podem posar en marxa un prototip en un temps mínim Però... Convencions innecessàries basades en l’anglès (plurals i
noms de columnes) Ruby es un llenguatge desconegut i aixo fa por
LCFIB- 2008
A l’ombra de rails...
Django (Python)
– Parteix de classes i no de la BD Symfony (PHP) CakePHP (PHP)
– Necessiten de les novetats de PHP5 Trails (i també Grails)
– Internament, utilitza Spring, Tapestry i Hibernate
Rails ha revolucionat el mon dels frameworks, creant-ne de mes alt nivell
LCFIBJordi Girona 1-3, Mòdul B6E-08034 Barcelona, Spain
[email protected]://www.fib.upc.es/LCFIB/
La seguretat en entorns web: servidor i aplicacions
LCFIB- 2008
Seguretat
De què parlarem?
– HTTPS i certificats
– Programar pensant en la seguretat
LCFIB- 2008
HTTP
IP
TCP
SSL
IP
TCP
HTTPS
El protocol HTTPS
HTTPS és la versió encriptada de HTTP Es basa en afegir una nova capa (SSL - Secure Socket Layer)
sobre TCP/IP que permet connexions encriptades, utilitzant algorismes de clau pública i privada.
SSL és aplicable a altres protocols també
LCFIB- 2008
Comunicació segura en web
Què ens interessa quan ens connectem a un web segur?
– Comunicació encriptada
– Assegurar-nos que ens comuniquem amb el web real
– NO és necessari que nosaltres tinguem una clau
L’establiment de la connexió: Handshaking
– Es negocia un protocol d’escriptació amb clau simètrica
– El servidor ens passa la seva clau pública
– Es passa encriptada una clau de sessió
– Encriptem les comunicacions amb aquesta clau
LCFIB- 2008
L'autenticitat de les claus
Qualsevol persona pot generar una clau pública i una privada i passar la seva clau pública dient que és la d'una altra persona
Pringadillo.com
Clau pública (real) de Amazon
Clau pública (falsa) de Amazon
Com sabem quina és la bona?
LCFIB- 2008
Les autoritats de certificació
Solució: les autoritats de certificació (CA) Fan de notaris: expedeixen certificats en els quals associen
una clau pública i una identitat, amb una data de caducitat Quan volem enviar la nostra clau pública a algú, el que
realment enviem és un certificat. El receptor pot comprovar a la CA si el certificat és correcte i
així assegurar-se que la clau pública correspon realment a la persona que l’ha enviat.
El client només hauria d'acceptar com a bons certificats signats per autoritats de certificació en les quals confia.
LCFIB- 2008
Què vol dir aquesta pantalla?
El navegador no té registrada l’autoritat de certificació. Pot tractar-se d’un certificat de proves
El nom que hi ha al certificat no coincideix amb el del web, o sigui que potser no és el seu
Hauríem de desconfiar i no donar al SI sense mirar que passa
LCFIB- 2008
Exemple de certificat en HTTPS
Així ens ensenya Internet Explorer un certificat...
LCFIB- 2008
Un pas més: Autentificació per certificat
Els clients també poden tenir un certificat propi per assegurar la seva identitat
Un servidor segur, podem obligar a exigir certificat al client per accedir a certes parts.
El servidor ha de tenir el certificat de l’autoritat certificadora del client per poder validar
Esquema complet de la comunicació segura.
El certificat es guarda encriptat al disc dur del navegador i per utilitzar-lo ens demanarà un password (PIN) per desencriptar
El password no viatja per la xarxa: únicament el certificat El certificat pot estar en una targeta: màxima seguretat
LCFIB- 2008
Les grans preguntes sobre Certificats i HTTPS
Què vol dir que no es confia en l’autoritat de certificació que ha emès el certificat?
– Per exemple, el certificat de raco.fib.upc.es està generat per esCERT (escert.upc.es), una autoritat no reconeguda per cap navegador d’entrada
– S’ha d’instalar el certificat de l’autoritat a la nostra màquina. En aquest cas, esta a http://escert.upc.es/_certs/escert_raiz.crt
Compte! Un error d’aquest tipus també pot indicar que es tracta d’un certificat “autosignat”, es a dir, de proves. Cap web “oficial” hauria de tenir un certificat d’aquest estil.
LCFIB- 2008
Les grans preguntes sobre Certificats i HTTPS
Vull fer proves amb un servidor segur a casa. Què he de fer?
– Per fer proves, podem utilitzar les utilitats OpenSSL (www.openssl.org) per generar certificats autosignats.
– Aquestes utilitats també permeten generar peticions de certificat que s’envien a una CA amb la idea que ens retornin un certificat vàlid signat
– Si utilitzem Apache, hem d’assegurar-nos de tenir el modul mod_ssl i dir-li on està el nostre certificat
LCFIB- 2008
Les grans preguntes sobre Certificats i HTTPS
Com obtinc un certificat personal?
– Si el volem per fer proves, qualsevol de les grans CA, ens ofereixen certificats per 30 o 60 dies. Aquest certificat ens pot servir per encriptar mails o signar codi.
– Podem obtenir un certificat “real” de la FNMT a
http://www.cert.fnmt.es/clase2/main.htm
Per obtenir aquest certificat, serà obligatori anar “físicament” a una oficina de l’Agència Tributària.
LCFIB- 2008
Les grans preguntes sobre Certificats i HTTPS
Què són els Applets / ActiveX signats?
– Podem utilitzar un certificat per fer la signatura d’una aplicació, per assegurar que no està manipulada i qui la proporciona
LCFIB- 2008
HTTPS és suficient?
HTTPS es basa en els algorismes de clau pública i privada. És a dir, que hem de guardar molt bé la clau privada.
Si una persona entra al sistema on es guarda la clau privada, i l'aconsegueix, pot fer-se passar per aquest sistema
Si volem tenir un grau de seguretat pràcticament total, hem de tenir una política de seguretat per evitar accessos no controlats a la nostra xarxa. Una eina important és el firewall
Hem d’estar segurs de tenir les últimes versions dels servidors i del sistema operatiu per assegurar-nos que no puguin accedir al nostre sistema a partir d’una vulnerabilitat coneguda
– Aprofitada per hackers
– Aprofitada per cucs o virus
LCFIB- 2008
Com ens poden atacar?
CGI o altres continguts dinàmics mal escrits, que no validen prou les entrades.
– Exemple: Paràmetres amb ../ Servidors mal configurats que permeten accés a llocs o codi
que no haurien de poder veure.
– Exemple: Índex de directoris Cross-side Javascript, que aprofiten la capacitat de que algú
introdueixi codi HTML a les nostres pàgines SQL Injection: possibilitat d’introduir paràmetres que
modifiquin una sentència SQL que executem. “Robar” sessions s’altres usuaris. DOS: peticions massives fins colapsar el servidor
LCFIB- 2008
Programar pensant en la seguretat
Si obrim un servidor web a l’exterior, no es un problema de seguretat greu
– Només serveix pàgines estàtiques Les aplicacions web mal programades programades poden
ser un problema se seguretat Permeten recuperar informació de la màquina Un error pot fer que poguem executar codi amb els privilegis
de l’usuari que executa el web Manipulant l’aplicació, podem fer coses que no hauriem de
poder fer … i tot aixo via web, sense arribat a entrar a la màquina! http://www.owasp.org: 10 problemes mes frequents
LCFIB- 2008
1.- Entrades no validades
Qualsevol paràmetre que arribi a les nostres pàgines de mans del client ha de ser validat
Les validacions han de ser completes, ja que hi ha valors que es poden escriure de més d’una forma
– S’ha de validar en la forma “canonica” Podem canviar els valors que apareixen a qualsevol URL
nomes editant la línia i provant. Els camps ocults que guarden informació es poden canviar
abans d’enviar Validació al client (Javascript) no es suficient. Exemple: Seleccionem un producte amb un preu al següent
formulari enviem el preu en un camp ocult…
LCFIB- 2008
2.- Autorització d’usuaris incorrecta
Quan un web ha d’estar protegit, moltes vegades només ens preocupem de que demani usuari i password
Quins rols poden accedir a quins serveis? Està especificat de forma declarativa? Què passa si accedim a la URL d’una pàgina que només esta
visible per un usuari privilegiat amb un usuari normal? Exemple:
– Web protegit. Sempre demana password
– Formulari que comprova que siguem “admin”
– El “action” d’aquest formulari no esta protegit Solució: seguretat declarativa sempre que es pugui. Revisar
qui pot accedir a cada pàgina
LCFIB- 2008
3.- Problemes amb les sessions o autorització
Si aconseguim el ID de sessió d’un altre usuari, ens podem fer passar per ell temporalment.
– Podem “esnifar” el ID d’un altre usuari amb la xarxa
– Podem mirar la cookie al seu navegador
– Si esta a la URL, ens la podem copiar (difícil si es llarga) Solució: ID llargs, millor per cookies, nomes amb HTTPS, que
caduquin ràpid. Atacs de “força bruta” d’usernames i passwords. Aprofitar les preguntes per recordar el password (solen ser
més facils que un password i no sempre son personals)
– Com es diu el meu gos? Segurament molta gent ho sap Solució: bona política de passwords
LCFIB- 2008
4.- Cross Site Javascript
Idea: fer que un altre usuari del web vagi a una pàgina on hi ha codi JavaScript escrit per nosaltres
Exemple:
– un forum, un sistema de missatges on podem enviar algo que veurà un usuari privilegiat.
– El codi, que s’afegeix a la pàgina, podria enviar la cookie de sessio (cas 3) per http a un servidor extern
– Manipular el DOM per canviar el contigut
Solució:Filtrar els tags en qualsevol paràmetre que s’envii cap a la nostra aplicació
LCFIB- 2008
5.- Buffer Overflow
Consisteix en aprofitar que no es comproven els límits en la longitud de les dades per executar instruccions
És un problema que afecta als servidors, programats en C i que no comproven límits de longitud
Difícil d’explotar a menys que es disposi del codi font del servidor
Important! Pot afectar també als navegadors (que es més normal que no s’actualitzin) via aplicacions web
Solució: estar al corrent de les vulnerabilitats dels servidors i clients i instalar sempre la última versió
LCFIB- 2008
6.- Injecció de codi
És un atac que implica modificar alguns dels paràmeters per fer que l’aplicació executi codi que “injectem” a l’aplicació
SQL (en l’autentificació d’usuaris)
– Select * from users where user=‘$u’ and pass=‘$p’
– Fem que $p valgui “x’ or ‘1’=‘1” Comandes de sistema operatiu
– System (“sendmail $mail”)
– Fem que $mail valgui “[email protected];rm –rf /” Directori “../”
– fopen ($fitxer)
– Li passem “../../../etc/password” Solució: Validar paràmetres
LCFIB- 2008
7.- Tractament dels errors incorrecte
Els errors poden desvetllar informació sobre el sistema que en la nostra aplicació no donem
Versions concretes de servidors Pantalles d’error on mostra el codi que falla Errors SQL que ens permeten coneixer les taules Errors de connexió que mostren on ens intenten connectar Errors relacionats amb fitxers
– Ens mostra el path del fitxer que no troba
– Ens diu que no tenim accés (no que no existeix)
Solució: configurar els servidors de producció perque els errors no es mostrin mai en pantalla, sino en fitxers de log
LCFIB- 2008
8.- Emmagatzemament insegur
Consisteix en el fet de guardar informació sensible de forma insegura al servidor.
Passwords per les connexions
– I si estan en un fitxer .inc i aquest fitxer es visible? Números de compte corrent
– I si podem fer SQL injection i veure aquest camp? Fitxers de configuració
– Pot ser que estiguin en un directori mapejat al web?
– Pot ser que hi poguem accedir amb ../ Solució: fer una llista de les informacions crítiques i veure que
podem fer per que no estiguin facilment disponibles
LCFIB- 2008
9.- Denial of Service (DOS)
Consisteixen en inundar el servidor de peticions perque no pugui donar servei als seus usuaris legítims
No s’aconsegueix accés al servidor És més un acte de protesta que de hacking Solució:
– A nivell d’aplicació no n’hi ha
– Per xarxa, es pot intentar tallar l’accés a l’atacant
LCFIB- 2008
10.- Configuració incorrecta del sistema
Deixar els exemples Comptes per defecte (amb passwords coneguts) Deixar la possibilitat del llistat de fitxers en un directori on hi
ha informació privilegiada Exemple: en PHP, fer includes de fitxers .inc que estan en un
directori visible via web. Els podrem visualitzar.
– O els posem on on son visibles
– O fem que els fitxers .inc també es considerin. Solució: mirar amb lupa les configuracions. Vigilar els valors
per defecte i treure tot el que específicament no necessitem
LCFIB- 2008
Programar pensant en la seguretat. Conclusions
Normalment, el problema es fiar-nos massa dels paràmetres que ens arriben. Validar-los en tot moment.
Assegurar-nos que coneixem be els nostres servidors i tenir les configuracions controlades.
Evitar fer coses que algú ja ha fet i ha comprovat que no té problemes de seguretat
– No tornar a implementar sistemes d’autentificació
Pensar que en qualsevol moment algu pot utilitzar les nostres pàgines de forma diferent a com fem que les utilitzin.
LCFIB- 2008
En resum
Utilizar SSL és una condició mínima quan volem un web segur.
La màxima seguretat la obtenim amb la utilització d’un certificat per part del client.
Hem de protegir la nostra màquina tant com sigui possible per tal que ningú hi pugui accedir excepte als serveis imprescindibles
Hem de tenir sempre últimes versions de tots els servidors que poguem fer servir
Hem de programar les aplicacions pensant en la seguretat: no confiar mai en que el que ens entra l’usuari és vàlid o inofensiu
LCFIBJordi Girona 1-3, Mòdul B6E-08034 Barcelona, Spain
[email protected]://www.fib.upc.es/LCFIB/
Elements d’una infrastructura web
LCFIB- 2008
De què parlarem?
Servidors d’aplicacions i servidors web Arquitectures per alta disponibilitat Arquitectures escalables
LCFIB- 2008
Quins elements tenim?
No només és un servidor web Necessitarem a més…
– Servidors d’aplicacions
– Bases de dades
– Balancejadors
– Servidors LDAP
– Servidors d’autentificació
– Firewalls
– … Veurem amb deteniment alguns d’aquests components
LCFIB- 2008
Què és un servidor d'aplicacions?
Definició àmplia:
Un servidor d'aplicacions és el servidor que hi ha a la capa intermitja, és a dir, entre el client i les fonts de dades
Definció restrictiva:
És aquell servidor que dóna suport als "thin clients", controlant les sessions dels usuaris, executant la lògica de negoci i connectant amb el recursos back-end, ja siguin dades, transaccions o contingut, donant a més suport per alta disponibilitat.
LCFIB- 2008
Quins components hi podem trobar?
Autorització
Clients no web
ServidorWeb
Conectorsaltres
sistemes
Conectorsamb BD
CachésPortals
BD
Altres sistem
es
Gestors contingut
Alta disponibilitat
...
Webservices
LCFIB- 2008
Així… que es un servidor d’aplicacions?
Cada fabricant té una idea diferent del que és La tendència es aglutinar molts productes per donar un valor
afegir al servidor Servidor web amb mòduls per executar certes aplicacions…
es pot considerar servidor d’aplicacions? Apache + Tomcat?
La gran majoria implementen la plataforma J2EE i per tant incorporen com a element principal un contenidor de EJB
Hi ha servidor d’aplicacions d’altres plataformes (.NET, Zope)
LCFIB- 2008
Balancejadors
Elements soft o hard que ens permeten distribuir la càrrega entre diferents sistemes
Han de detectar si un sistema ha deixat de respondre per no enviar-li més peticions
Diferents algorismes
– Aleatori
– Round robin
– Per pesos, afavorint als que tenen menys feina Important trobar un equilibri entre un bon idicador de la
càrrega del servidor i que el fet de calcular-lo no el saturi més.
LCFIB- 2008
Productes balacenjadors
PLB (Pure Load Balancer)– Software, Open Source– Molt senzill. No HTTPS– Només Round Robin– Alt rendiment
Pound– Software, Open Source– Suporta HTTPS, sessions amb paràmetre i cookie
Cisco Redirector– Hardware– Accelera SSL– Algorismes per pesos (temps de resposta)– Pot funcionar en cluster
LCFIB- 2008
Alta disponibilitat / escalabilitat / rendiment
Alta disponibilitat / tolerància a fallades és el fet d’aconseguir que el nostre sistema estigui disponible al 100% encara que falli alguna cosa
Rediment (performance)és la velocitat amb la que respon un sistema per una càrrega determinada
Balanceig de càrregaés distribuir la feina entre diversos sistemes per aixi tenir més rendiment.
Escalabilitatfa referència a la facilitat amb que es pot aconseguir que un sistema tingui major rendiment afegint recursos (o sigui, sense canviar el sistema)
– vertical: augmentant recursos del servidor– horitzontal: afegint més servidors
LCFIB- 2008
Tots els conceptes estan relacionats
Si volem que un sistema sigui tolerant a fallades, normalment haurem de tenir recursos duplicats
Aquests recursos duplicats, es poden utilitzar per augmentar el rendiment, repartint la càrrega
El sistema que permet tenir els recursos duplicats, també es pot utilitzar per afegir més recursos en cas de necessitar-los
Qualsevol SPOF (single point of failure), es converteix en un coll d’ampolla en quant a rendiment i dificulta l’escalabilitat.
LCFIB- 2008
El cercle viciós dels recursos
Els recursos dels nostres servidors son finits
– (cpu, xarxa, memoria, disc, connexions a BD…) Podem entrar en un cercle viciós:
– Si servim moltes peticions simulàniament, algun recurs començarà a esgotar-se
– Si s’esgota un recurs, tardarem més en respondre i s’acumularan les peticions
– Aixo provocarà cada vegada més peticions simultànies i un temps de resposta cada vegada més baix
– El sistema es colapsa. Conclusió: no podem servir més d’un número de peticions
per segon amb uns recursos concrets.
LCFIB- 2008
No malgastem recursos al servidor
Al servidor web, NO fer mai peticions al DNS quan escrivim la línia al fitxer de logs
NO carregar mòduls que no necessitem En el cas d’Apache (1.3)
– Arquitectura a base de processos
– StartServers: número de processos inicial
– MaxSpareServers: processos preparats
– MaxClients: màxim absolut de processos, per evitar el cercle viciós.
Keep-alive: manté la connexió oberta
– Útil per contingut estàtic
– Inútil si hi ha molts més usuaris que processos, deixa processos ocupats
LCFIB- 2008
No malgastem recursos a l’aplicació
Utilitzem pools de connexions
– Estalvia obrir i tancar connexions Optimitzem les consultes
– Utilitzar índexos a la BD
– Retornem només el que necessitem Intentar evitar les consultes
– Cachejar els resultats
Quan una aplicació no dona el rendiment que ha de donar, els canvis que representaran un salt qualitatiu son sempre a l’aplicació, no al servidor.
LCFIB- 2008
Aplicacions escalables
Si una aplicació no està ben feta, no serà escalable
Aplicacions sense estat.
– No tenen sessions
– No comparteixen res
– Perfectes per escalabilitat horitzontal Aplicacions que utilitzen caches
– A nivell de pàgina (normalment poc efectiu)
– A nivell de framents de pàgina
– Aplicar cache eficientment vol dir saber que es pot i que no es pot cachejar. No es pot fer gaire externament
LCFIB- 2008
Arquitectures possibles i la seva escalabilitat
Una màquina amb tot (servidor web + BD)
– Senzill
– Tenim un únic punt de fallida
– Pot no escalar verticalment
Una màquina per servidor web i una per BD
– Podem adaptar millor les màquines a les necessitats
– Seguim tenint punts de fallada
LCFIB- 2008
Arquitectures possibles i la seva escalabilitat
Multiples servidors web (balancejats) / una base de dades
– Necessitem un balancejador (web o soft)
– És la solució més habitual
– Fàcil escalar horitzontalment els servidors web
– Podem colapsar la BD
Molts servidors web / moltes BD
– No tenim punts de fallada, excepte els balancejadors
– Tenim un sistema més complex
– Les BD han de ser facilment replicables, per exemple si les actualitzacions es fan en una única instància.
LCFIB- 2008
Arquitectures amb servidor d’aplicacions
Afegim una capa més Servidor web i servidor d’aplicacions poden compartir màquina En màquines diferents, cada servidor web pot comunicar-se
amb el seu propi servidor d’aplicacions o entre tots.
Balacejar els servidors pot aportar un nivell extra de complexitat innecessari
Servidor
web
Servidor
web
Servidor aplicacio
Servidor aplicacio
Balancejadorweb
LCFIB- 2008
Factors a tenir en compte
Balanceig web
– Sticky sessions: una vegada començada una sessió, no la pot servir una altra màquina.
– Si un dels servidors web cau, com ho detecta el balancejador?
– Com repartim la carrega?
Cluster de servidors d’aplicacions
– Cada servidor web només es comunica amb el seu servidor d’aplicacions?
– S’ha de replicar la informació de les sessions perque qualsevol servidor d’aplicacions pugui continuar una sessió si cau el que la gestionava originalment?
LCFIB- 2008
Exemple: Tomcat
Considerarem Tomcat un servidor d’aplicacions Utilitzarem Apache davant de Tomcat per enviar-li únicament
les peticions relacionades amb Java Forma de lligar tots 2: mod_jk Com implementa sticky sessions Tomcat?
– Configurem cada Tomcat per afegir un prefix al valor de la cookie de sessió que genera
– Mod_jk buscar aquest valor i en funció d’ell l’envia a un servidor o un altre
Tomcat pot funcionar en cluster i replicar les sessions Podem “serialitzar” les sessions a BD per recupera-se d’una
caiguda
LCFIB- 2008
Consideracions
Per fer el cluster de Tomcats necessitem un interface de xarxa diferent o generarem molt tràfic
Si no fem el cluster, obliguem a recomençar la sessió Important: si la nostra aplicació no té estat, podem assignar-la
a qualsevol Tomcat. Conclusió: Escalabilitat a partir de la senzillesa
Tomcat
Tomcat
Apache+ mod_jk
LCFIB- 2008
Conclusions sobre alta disponibilitat / escalabilitat
El fet de posar un servidor d’aplicacions no garantitza res, hi ha una feina de configuració important.
El disseny de l’aplicació es importantíssim. Quan més senzilla sigui una aplicació, més facil serà fer-la
tolerant a fallades i escalable. Si compliquem l’arquitectura, hem d’anar en compte de no
crear punts de fallada o colls d’ampolla:
– Què passa si cau el balancejador hard?
– Què passa si cau la base de dades?
– Podem detectar el fet que un servei “es quedi tonto”?
– Pot ser que el servidor aguanti pero que se’ns colapsi l’ample de banda?
LCFIB- 2008
Per consultes sobre el seminari o temes web en general
Per suggerències o problemes amb el web de la FIB
Per suggerències o problemes amb quasevol tema
dels servidors o aules informàtiques de la FIB