Torna alla pagina di Tecnologie Web
:: Appello d'esame di Tecnologie Web - 09/02/2009 ::
Esercizio 1
HTTP: cos’è, metodi principali, schemi di autenticazione.
SOLUZIONE
Hyper Text Transfer Protocol è un protocollo per traferire dati tramite indirizzamento IP e protocollo di trasporto TCP. Esistono due versioni: 1.0 e 1.1 per la quale è garantita la compatibilità con la precedente versione. La principale differenza tra le due è che la priva versione non ha connessione persistente, cioè non mantiene attivo lo stato di connessione e per richiedere diversi oggetti bisogna continuare a fare richieste di connessione; mentre con la 1.1 la connessione resta aperta fin quando non sono stati trasferiti tutti gli oggetti nella pagina. I metodi sono uguali per lntrambe le versioni:
- option: richiede ad un server informazioni sulle opzioni di comunicazione disponibili
- get: richiede qualunque oggetto sia stato identificato dalla URL di richiesta
- head: uguale a get ma il server non deve includere un messaggio nel body della risposta
- post: richiede che il server di destinazione accetti l'oggetto identificato dalla URL dellla richiesta
- put: richiede che l'oggetto conenuto nella richiesta sia salvato dal server alla URL specificata
- delete: richiede la cancellaione dell'oggetto identificato dalla URL della richiesta
- trace: richiede che il server destinatario risponda con lo stesso messaggio di richiesta come body, usato per la verifica dei messaggi
Due sono le modalità di autenticazione HTTP:
- Basic Authentication Scheme dove il client si autentica rispetto ad un server attraverso uno userID e una password inviate come un'unica stringa separata da : e codificate in base 64 ma trasmessi in chiaro
- Digest Authentication Scheme che si basa sulle funzioni di hash non invertibili che permettono di spedire il contenuto in modo cifrato. Per aumentarne la sicurezza alla funzione MAC viene anche aggiunto un valore segreto detto nounce definito dal server e comunicato al client che dovrà spedire, con il resto del messaggio, per autenticarsi al server stesso.
Esercizio 2
Dato il seguente documento XML “books.xml”:
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
2a. scrivere e spiegare il risultato per ognuna delle seguenti XQuery:a- doc("books.xml")/bookstore/book/titleb- doc("books.xml")/bookstore/book[price<30]c- doc("books.xml")/bookstore/book[price>30]/titled-
for $x in doc("books.xml")/bookstore/book
where $x/price>30
order by $x/title
return $x/title
e-
<ul>
{
for $x in doc("books.xml")/bookstore/book/title
order by $x
return <li>{data($x)}</li>
}
</ul>
SOLUZIONE
a- restituisce tutti i titoli dei libri presenti nel file XML book.xml, perché parte dal nodo radice, entra nell'elemento bookstore, poi nel book e preleva i titoli.
Everyday Italian
Harry Potter
XQuery Kick Start
Learning XML
b- restituisce il libro che ha un prezzo inferiore a 30 dollari. In questo caso solo harry potter.
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
c- restituisce i titoli dei libri che hanno un prezzo superiore a 30 dollari, quindi:
Everyday Italian
XQuery Kick Start
Learning XML
d- restituisce, tramite un costrutto flowr, i titoli dei libri con prezzo maggiore di 30 ordinati in ordine alfabetico.
Everyday Italian
Learning XML
XQuery Kick Start
e- restituisce i titoli dei libri in ordine alfabetico, ma questa volta in una lista non ordinata:
* Everyday Italian
* Harry Potter
* Learning XML
* XQuery Kick Start
2b. Cosa sono le espressioni flwor?
SOLUZIONE
Le espressioni FLWOR sono il costrutto più comune e potente di XQuery. Sono simili al costrutto SELECT-FROM-WHERE di SQL ma anzichè essere applicati a relazioni tra tabelle associano variabili a valori utliazzando i costrutti for e let e usano tali associazioni per produrre i risultati. FLWOR è l'acronimo di: For - Let - Where - Order - Return, dove:
- For: associa una o più variabili alle esprezzioni che seguono la keyword in
- Let: associa delle variabili all'intero risultato di un'espressione eventualmente aggiungendo questa associazione a quelle generate da un costrutto for
- Where: filtra le tuple prodotte da una for o let scartando quelle che non soddisfano la condizione necessaria
- Order: ordina le tuple prodotte dalla for o dalla let (dove per tupla si intende la combinazione delle associazioni tra variabile e valori creata da un for o un let)
- Return: crea il risultato dell'espressione FLWOR
Esercizio 3
Web services: cosa sono e come funzionano.
SOLUZIONE
Rappresentano una soluzione per permettere a sistemi eterogenei di lavorare insieme per realizzare il service oriented computing(programmazione con componenti distribuite sul web). Sono componenti software indipendenti dalla piattaforma e dall'implementazione: un client non può dire quale linguaggio, quale sistema operativo o tipo di computer è stato usato. Usando XML per codificare le comunicazioni, sono infatti indipendenti da piattaforme o linguaggi di programmazione: esso garantisce ricchezza espressiva, estendibilità, portabilità e facilità di comprensione. Inoltre possono essere validati da entrambe le parti che parti che comunicano.
Possono essere:
- descritti usando un linguaggio di descrizione del servizio (un web service deve descrivere se stesso: quali tipi di richieste può soddisfare, quali sono gli argomenti, quale il trasporto)
- pubblicati in un registro di servizi per sapere dove è localizzato
- invocati mediante un'API solitamente tramite la rete
- composti con altri servizi e il servizio può a sua volta essere client di un altro servizio
L'architettura del web service è basata su 3 entità:
- service requestor: richiede l'esecuzione del web service
- service provider: implementa il servizio e lo rende disponibile per il web
- service registry: offre un servizio di pubblicazione e ricerca dei servizi disponibili
Esercizio 4
Session tracking: cos’è? Illustrare la soluzione a tale problema basata sull’uso dell’interfaccia HttpSession, specificandone i vantaggi.
SOLUZIONE
HTTP è un protocollo stateless cioè ho una connessione separata per ogni accesso del client a pagine Web e il server non mantiene informazioni contestuali sul client che effettua l'accesso. E' un problema quando capita che devo manterene la sessione quando ad esempio faccio shopping on line. Per mantenere la sessione precedente ci sono 3 diversi metodi:
- uso di cookies
- riscrittura di URL
- uso dell'interfaccia HttpSession interfaccia ad alto livello costruita sopra
cookies e URL rewriting (deve quindi supportare entrambi precedenti metodi)
HttpSession ha 4 operazioni fondamentali:
- Operazione 1: accedere all'oggetto di sessione associato alla richiesta corrente. Per accedere agli oggetti di tipo HttpSession (che sono hashtable, cioè a ognuno è associata una chiave univoca) utilizzo la chiamata
request.getSession
. Il sistema estrae così lo userID da un cookie o dalla URL e lo confronta con gli elementi hashati della tabella: se ce n'è uno uguale ripristina la sessione altrimenti ne crea una nuova.
- Operazione 2: cercare informazioni associate alla sessione. Cerco sul server facendo la chiamata
getAttribute
del metodo HttpSession. Se conosco già il valore della chiave posso usare getAttribute("key")
per cercare valori precendente memorizzati.
- Operazione 3: immagazzinare infomazioni nella sessione. Attraverso la chiamata
setAttribute
creo un nuovo attributo o se c'è già lo sovrascrivo. Per eliminare un valore senza rimpiazzarlo uso removeAttribute
.
- Operazione 4: eliminazione dati di sessione. Ci sono 3 modi per eliminare i dati:
removeAttribute ("key")
per eliminare i valori associati a una specifica chiave; invalidate
per eliminare l'intera sessione corrente; logout
per eliminare tutte le sessioni relative all'utente.
Esercizio 5
Dichiarazioni JSP: cosa sono? Scrivere un pezzo di codice che ne mostri l’utilizzo.
SOLUZIONE
Le JSP sono formate da codice HTML + frammenti di codice Java. Le componenti di una JSP sono gli elementi ed i template.
Gli elementi contengono gli elementi di script (utilizzati per rendere una pagina dinamica) che contengono a loro volta le dichiarazioni.
Le dichiarazioni sono frammenti di codice Java utilizzato per dichiarare nuovi metodi o classi o variabili globali. Definite da: <%! codice Java %>. Vengono eseguite PRIMA di _jspService().
<%! int pageCount = 0;
void addCount (){
pageCount++;
}%>
Esercizio 6
Spiegare il funzionamento e commentare dettagliatamente il seguente pezzo di codice.
import java.util.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class LinkTracker extends HttpServlet {
static private Hashtable hashLinks = new Hashtable();
String tstamp;
public LinkTracker() {
tstamp = new Date().toString();
}
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
String questoLink = request.getParameter("link");
if (questoLink != null && !questoLink.equals("")) {
synchronized (hashLinks){
Integer count = (Integer) hashLinks.get(questoLink);
if (count == null) {
hashLinks.put(questoLink, new Integer(1));
}
else {
hashLinks.put(questoLink, new Integer(1+count.intValue()));
}
}
response.sendRedirect(questoLink);
}
else {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
request.getSession();
out.println("<html>");
out.println("<head>");
out.println("<title>Links Tracker Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<p>Links Tracked Since");
out.println(tstamp+":</p>");
if (hashLinks.size() != 0) {
Enumeration enumLinks = hashLinks.keys();
while (enumLinks.hasMoreElements())
{
String key = (String)enumLinks.nextElement();
int count = ((Integer)hashLinks.get(key)).intValue();
out.println(key+" : "+count+" visits<br>");
}
}
else {
out.println("No links have been tracked!<br>");
}
out.println("</body>");
out.println("</html>");
}
}
public void doPost(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
doGet(request, response);
}
}
SOLUZIONE
Questo file è una Servlet che ha la funzione di LinkTracker in quanto quantifica quante volte viene cliccato un link. La quantità di clic viene visualizzata in codice HTML, se non è stato effettuato nessun clic viene visualizzato il messaggio: "No links have been tracked!".
Il metodo HTTP utilizzato per verificare quante volte il link è stato cliccato è il doGET, il quale accoda l'informazione alla URL.
Viene creata una hashtable, cioè una tabella con chiave-valore. Se la variabile stringa "questoLink" non è nulla o vuota viene effettuata una sincronizzazione della tabella e viene incrementato il contatore intero "count", se "count" è nullo viene inizializzato a 1.
Se la variabile questoLink non è vuota o nulla viene stampato l'HTML tramite PrintWriter. Come prima informazione viene stampata la data dell'ultimo accesso, che era stata salvata nella variabile "tstamp" tramite il metodo LinkTracker() e convertita in stringa.
Tramite un ciclo while vengono stampati i valori delle varie "key" presenti nella hashTable col contatore di visite effettuate.
Torna alla pagina di Tecnologie Web