Anda di halaman 1dari 84

Applicationsrseaux

HTTP,Accsauxressources

EtienneDuris

Typage des ressources Internet

Types MIME (Multi-purpose Internet Mail Extension)

RFC 2046. Compos par un type et un sous-type

Les types principaux sont les suivants

text

image

audio

video

message

multipart

application

Ex: text/html, image/gif, application/octet-stream, etc.

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 2

Types MIME (2)

Possibilit de spcifier un paramtre du sous-type

Aprs le sous-type et un point-virgule

Par exemple, codage des caractres pour le type texte

text/html; charset=iso-8859-1

Pour les documents composites contenant diffrents types


MIME

multipart avec boundary pour dlimiter les parties

Sous-types:

mixed (par dfaut),


alternative (la mme information dans diffrents formats)

La syntaxe des types MIME est ouverte

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 3

Les URI

Uniform Resource Identifier (RFC 2396)

URL (Locator): localisation sur le rseau

URN (Name): indpendant de la localisation (site mirroir)

URI identifie une ressource partir d'un schma

http, ftp, mailto, etc.

Attention: tous les URI ne sont pas ncessairement associs des


protocoles de communication

Exemple: URN:ISBN:2-7117-8689-7

Syntaxe gnrale:

[<schma>:]<partie dpendante du schma>[#fragment]

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 4

Syntaxe dans les URI

Le schma

doit commencer par une lettre minuscule, puis tre compos de lettres
minuscules, de chiffres et des signes "+", "." et "-"

La partie dpendante du schma

Compose de caractres ASCII ou de caractres cods en hexadcimal


de la forme "%xx"

Certains caractres peuvent avoir une interprtation spcifique (ils sont


en gnral traduits automatiquement, si besoin, par les navigateurs). Il
s'agit de l'espace et de
" # < > ` | % { } \ ^ [ ] + ; / ? : @ = &

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 5

URI hierarchiques

Certains URI sont dits hirarchiques (par opposition


opaques): leur partie dpendante du schma peut tre
dcompose comme suit:
[<schma>:][//<authority>][<path>][?<query>][#<fragment>]

<authority>: autorit responsable du nommage de la ressource

<path>: chemin d'accs la ressource: segments spars par des "/"


et suivis d'un ou plusieurs paramtres spars par des ";"

<query>: chane de caractres interprte par les deux champs


prcdents

Si l'autorit est lie un serveur, elle a la forme suivante:


[<user-info>@]<machine>[:<port>]

Si port n'est pas spcifi, port par dfaut associ au schma

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 6

Schmas http et https

Schma http

http://<machine>:<port>/<path>?<query>

Port par dfaut 80

<path> peut tre interprt comme un chemin d'accs dans un


systme de fichiers, mais pas forcment

<query> informations supplmentaires (paramtres pour


l'excution d'une commande, par exemple)

Schma https

Protocole HTTP au dessus du protocole SSL

Mme format, mais port par dfaut 443

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 7

Schma ftp

Transfrer un fichier ou lister un rpertoire

ftp://<user>:<passwd>@<machine>:<port>/<r1>/<r2>/...
.../name;type=<typecode>

Si ni <user> ni <passwd> ne sont spcifis, quivaut ftp anonyme


avec l'adresse e-mail en passwd

Port par dfaut 21

Suite <r1>/<r2>/.../name correspond au chemin d'accs relatif au


rpertoire de <user>.

;type=<typecode> est optionnel (typecode vaut "d" pour lister un


rpertoire, "i" pour binaire, "a" pour ASCII)

Exemples :

ftp://ftp.inria.fr/rfc
ftp://duris:monmo2pas@igm.univ-mlv.fr/W3/img.gif;type=i

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 8

Schma mailto

Dsigne les botes aux lettres, courrier lectronique

RFC 822

Historiquement URL, mais qqfois considr comme URN

mailto:<adr1>,<adr2>?<header1>=<value1>&<header2>=<value2>

<adr i>

<header i>=<value i>

sont les adresses destinataires du courrier

Si <header>

sont des en-ttes placer dans le courrier.


vaut body, c'est le corps du message

Au moins les en-ttes body et subject doivent tre reconnus

Exemples:
mailto:roussel@univ-mlv.fr
mailto:roussel@univ-mlv.fr,bedon@univ-mlv.fr?subject=test&body=test

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 9

Schma telnet

Terminal interactif

telnet://<user>:<passwd>@<machine>:<port>/

Port par dfaut 23

Ouvre un terminal sur la machine spcifie, avec comme nom


d'utilisateur <user>, condition que le mot de passe soit valide

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 10

Schma file

Accs un systme de fichier (en gnral local)

file://<machine>/<path>

file:///home/duris/COURS/JAVA/http/progJavaHTTP.sxi

On n'utilise pas, en gnral, la partie machine, mais le "/" du


path doit, en principe, tre prsent
Mme pour des fichiers Windows, les sparateurs sont des "/"

file:///C:/Program%20Files/

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 11

Les URI relatifs

Concerne les URI hirarchiques

Parler d'une ressource relativement un URI de base. Forme la +


complte d'un URI relatif:

//<net_loc>/<path1>/.../<pathn>;<params>?<query>

Chacun des prfixes peut tre omis et sera remplac par l'URI de base
(s'il est moins prcis)

http://igm.univ-mlv.fr/~roussel/test/index.html

toto.html signifie alors


http://igm.univ-mlv.fr/~roussel/test/toto.html

/~duris/index.html signifie alors


http://igm.univ-mlv.fr/~duris/index.html

//etudiant.univ-mlv.fr signifie
http://etudiant.univ-mlv.fr/

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

alors

Page 12

Le protocole HTTP

(Hyper Text Transfert Protocol) RFC 2616 (version 1.1)

Protocole sans tat, rapide, lger, de niveau application


permettant le transfert de donnes au dessus d'une
connexion de type TCP (sure)

Utilise les URLs

Port par dfaut 80

Bas sur le paradigme de requte / rponse

Chaque requte et chaque rponse est un


message HTTP

Largement utilis sur le World Wide Web

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 13

Principe Requte/Rponse

Connexion TCP tablie entre un client et le port 80 (en gnral)


du serveur HTTP

Envoi par le client d'un message HTTP, dit requte

Traitement de cette requte et envoi par le serveur d'un


message, dit rponse, au client.

En HTTP 0.9 et 1.0, la connexion est ferme par le serveur


aprs chaque rponse

En HTTP 1.1, il est possible de conserver la mme connexion


TCP pour plusieurs changes de requtes/rponses.

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 14

Format des messages HTTP

Ligne de dbut
Champ d'en-tte_1: valeur_1
...
Champ d'en-tte_n: valeur_n

// ligne vide \r\n


[ corps ventuel ]

La prsence de zro, un ou plusieurs champs d'en-tte permet


de spcifier des paramtres

La prsence d'un corps de message dpend de la ligne de


dbut de ce message

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 15

Message de requte

Constitution de la premire ligne de requte

Mthode Ressource Version


Exemple:
GET /index.html HTTP/1.1
Host: www.univ-mlv.fr

Mthode: GET, HEAD, POST, PUT, TRACE,...

Ressource: identifie la ressource recherche

Reprsente le type d'opration effectuer

HTTP/1.1 exige que le champ Host soit spcifi

Version: identifie la version du protocole utilise

Si rien n'est spcifi, la version HTTP 0.9 est considre

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 16

Message de rponse

Constitution de la ligne dite de statut

Version Code Message Exemple:


HTTP/1.1 200 OK
Server: Netscape-Enterprise/4.1
Date: Wed, 18 Sep 2002 09:30:24 GMT
...
Content-type: text/html
Content-length: 13298

<!DOCTYPE HTML PUBLIC ....


<html><head>
...
</html>

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 17

Les codes de statut

Organiss en 5 catgories

1xx informatifs : accepts uniquement dans les versions 1.1.


Rponse intermdiaire du serveur.
Ex: 100 Continue

2xx de succs : la rception, la comprhension ou l'acceptation de


la requte est russie. Ex: 200 OK

3xx de redirection : d'autres actions sont requises pour traiter la


requte. Ex: 301 Moved Permanently

4xx erreurs du client : erreur de syntaxe ou de spcification.


Ex: 404 Not Found

5xx erreurs du serveur : serveur incapable de rpondre.


Ex: 501 Method Not Implemented

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 18

Quelques champs d'en-tte

Spcifiques (requtes/rponses) ou bien gnraux:

Server (rponse): informations sur le serveur HTTP

Date (gnral): estampille les messages HTTP

Last-modified (serveur): date de dernire modification

ETag (): identifiant de la ressource gr par le serveur

Content-type (gnral): type le corps du message

Content-length (gnral): nombre d'octets du corps

Accept: text/plain (requte): ce qu'accepte le client

Accept-charset, Accept-language, Accept-encoding


Content-encoding, Transfert-encoding...

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 19

Quelques requtes

GET: rcuprer une ressource

HEAD: identique GET, mais sans corps de msg

TRACE: cho de la requte

Peut servir savoir si une ressource existe et si elle a chang, sans


ncessairement la rcuprer

le serveur renvoit, dans le corps du message, le message qu'il a reu du


client (diagnostique)

OPTIONS: demande d'information sur les mthodes

Le serveur renvoit toutes les mthodes qu'il implante dans le champ


d'en-tte Allow

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 20

Connexion persistante ou "keep alive"

Avant 1.1, champ Content-length pas obligatoire:

Comme le serveur fermait la connexion la fin de la rponse, ce champ


servait simplement vrifier que OK

Avec la connexion persistante (keep alive)

Serveur peut garder la connexion aprs la fin de rponse

Plus efficace (dlais d'ouverture et fermeture de connexion)

Possibilit d'exploiter le full-duplex de la connexion TCP


(plusieurs transactions peuvent se recouvrir)

Toutes les rponses doivent contenir Content-length


(sauf rponses sans corps de message ou chunked)

Indispensable pour dterminer la fin d'un message

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 21

% telnet www.w3.org 80
Trying 193.51.208.67...
Connected to www.w3.org.
Escape character is '^]'
GET /Overview HTTP/1.1
Host: www.w3.org
HTTP/1.1 200 OK
Date: Sun, 30 Jun 2002 15:33:43 GMT
Server: Apache/1.3.6 (Unix) PHP/3.0.9
Last-Modified: Sat, 29 Jun 2002 16:08:59 GMT
ETag: "2d2c96-2c69-3778ef9b"
Accept-Ranges: bytes
Content-Length: 11369
Content-Type: text/html; charset=iso-8859-1
<!DOCTYPE HTML PUBLIC ...
<html lang="en"> ... le code du document html ...
</html>

La connexion n'est pas ferme...


Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 22

HEAD /Overview HTTP/1.1


Host: www.w3.org
HTTP/1.1 200 OK
Date: Sun, 30 Jun 2002 15:33:58 GMT
Server: Apache/1.3.6 (Unix) PHP/3.0.9
Last-Modified: Sat, 29 Jun 2002 16:08:59 GMT
ETag: "2d2c96-2c69-3778ef9b"
Accept-Ranges: bytes
Content-Length: 11369
Content-Type: text/html; charset=iso-8859-1
OPTIONS / HTTP/1.1
Host: www.w3.org
Connection: close
HTTP/1.1 200 OK
Date: Sun, 30 Jun 2002 15:34:17 GMT
Server: Apache/1.3.6 (Unix) PHP/3.0.9
Content-Length: 0
Allow: GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, PATCH,
PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK, TRACE
Connection: close
Connection closed by foreign host.
%
Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 23

L'authentification

Pour limiter l'accs aux ressources qq clients

Mcanisme de challenge/crdit pour l'authentification des


requtes

Utilise les champs WWW-Authenticate et Autorization

Lors d'une requte sur une ressource protge

Serveur rpond 401 Unauthorized avec, un champ


WWW-Authenticate qui contient au moins un challenge
applicable la ressource concerne (une liste)

Un challenge est constitu d'un schma (mot, ex: Basic), suivi de paires
attribut=valeur. Exemple:
Basic realm= "zone-protection-2"

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 24

L'authentification (suite)

Le client doit alors rmettre sa requte avec un crdit


dans le champ Autorization. Exemple:

Autorization: Basic blablabla


o blablabla reprsente le codage

en base 64 de la chane

login:passwd

Attention, base 64 est rversible, et le crdit passe en clair

Autre schma: Digest

Requiert une valeur d'autorisation obtenue par hachage


cryptographique utilisant, en plus de user et passwd de client,
des informations lies la requte et une valeur alatoire tire
par le serveur

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 25

Authentification (exemple)

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 26

Envoyer des donnes

Une requte peut servir envoyer des informations vers


le serveur HTTP

Mthode POST, dans le corps du message, mais aussi

Mthode GET, dans l'URL sous la forme de "query string":


permet de transmettre quelques arguments

Ces donnes sont principalement utilises pour "gnrer"


une ressource dynamiquement

Utilise des "programmes" satellites au serveur

CGI, Servlettes/JSP, PHP, ASP...

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 27

Les formulaires HTML (GET)

Permet de dfinir des zones de saisie pour le client

<form enctype="application/x-www-form-urlencoded"
action="http://www.serv.fr/path"
method="GET">
<input type="text" name="user" value="votre nom">
<input type="submit" name="ok" value="Envoyer">
</form>

Un clic sur Envoyer cre une requte GET l'URL suivant:


http://www.serv.fr/path?user=Etienne+Duris&ok=Envoyer

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 28

Les formulaires HTML (POST)

<form action="http://www.serv.fr/path" method="POST">


<input type="text" name="user" value="votre nom">
<input type="submit" name="ok" value="Envoyer">
</form>

Mme apparence dans un navigateur

Un clic sur Envoyer cre une requte POST

l'URL http://www.serv.fr/path,

Avec comme champs d'en-tte


Host: www.serv.fr
Content-Type: application/x-www-form-urlencoded
Content-Length: 25

dont le corps du message contient


user=votre+nom&ok=Envoyer

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 29

Formulaire plus riche (illustration)

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 30

<form enctype="application/x-www-form-urlencoded"
action="http://www.serv.fr/path" method="GET">
Zone de texte (nom) :
<input type="text" size="30" name="user" value="votre nom"><hr>
<textarea name="srctext" rows="6" cols="40">
Tapez votre message ici.
</textarea><hr>
Zone de boutons (age) : Quel ge avez vous?
moins de 18 ans <input type="radio" name="age" value="-18">
de 19 35 ans <input type="radio" name="age" value="19-35">
de 36 50 ans <input type="radio" name="age" value="36-50" checked>
plus de 50 ans<input type="radio" name="age" value="50-"><hr>
Zone de menu (disponibilit) : Vous tes
<select name="dispo">
<option value="ok">disponible
<option selected value="ko">indisponible
</select><hr>
<input type="hidden" name="client" value="a1234-567-8901">
<input type="submit" name="choix1" value="Accepter">
<input type="submit" name="choix2" value="Refuser">
<input type="reset" value="Rinitialiser">
<hr>
</form>

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 31

Corps de message par morceaux

Lorsqu'une requte gnre une rponse longue

On devrait attendre toute la gnration de la rponse afin de connatre


sa taille AVANT de crer l'en-tte de la rponse et son champ
Content-Length

On peut alors dcouper la rponse en morceraux (chunked) et


commencer envoyer les premiers avant d'avoir fini de gnrer la
totalit du document

Utilise le champ Transfert-Encoding: chunked

Il n'y a plus de champ d'en-tte Content-length

Chaque morceau est prfix par sa taille

Le premier morceau de taille nulle indique la fin du corps

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 32

Chunked (exemple)

GET /search?q=test HTTP/1.1


Host: www.google.fr
HTTP/1.1 200 OK
Server: GWS/2.0
Date: Mon, 23 Sep 2002 11:58:56 GMT
Transfer-Encoding: chunked
Content-Type: text/html
b3f
<html><head>
..... Premier morceau ...
3ce2
..... Deuxime morceau ...
</body></html>
0

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 33

Envoyer des fichiers

Si le formulaire spcifie un nom de fichier, c'est le


contenu du fichier qu'on dsire envoyer

Ie type (enctype) ne doit alors plus tre


"application/x-www-form-urlencoded", mais
"multipart/form-data", introduit en HTML 4 pour cela

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 34

Envoyer des fichiers (code)

<form enctype="multipart/form-data"
action="/sendfile" method="POST">
Fichier 1 : <input type="file"
name="fichier1" size="20"><br><br>
Fichier 2 : <input type="file"
name="fichier2" size="20"><br><br>
<input type="hidden" name="ID" value="roussel">
<input type="submit" name="submit" value="Envoyer">
</form>

Supposons que le fichier contienne le texte suivant:

Test de fichier

Alors la requte gnre par un click sur Envoyer sera la


suivante...

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 35

POST /sendfile HTTP/1.1


Host: server
Content-Type: multipart/form-data; boundary=ABCDEF
Content-Length: 372

Envoyer des fichiers (requte gnre)

--ABCDEF
Content-Disposition: form-data; name="fichier1"; filename="test.txt"
Content-Type: text/plain
Test de fichier
--ABCDEF
Content-Disposition: form-data; name="fichier2"; filename=""
Content-Type: application/octet-stream

--ABCDEF
Content-Disposition: form-data; name="ID"
roussel
--ABCDEF
Content-Disposition: form-data; name="submit"
Envoyer
--ABCDEF-Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 36

Requte GET ou POST

Les deux mthodes sont utilisables dans un formulaire

Diffrences principales

POST transmet les donnes dans le corps

GET transmet les donnes dans l'URL

POST + sthtique (arguments n'apparaissent pas)

POST non limit en taille (les serveurs limitent une taille


maximale pour les URLs). Dans ce cas, code de statut
414 Requested-URI Too Large

Un formulaire GET peut tre rejou en conservant l'URL


(bookmarks du navigateur)

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 37

D'autres requtes

PUT permet d'envoyer au serveur HTTP des donnes


(fichiers) qu'il devra stocker

Diffrent de POST, dont les donnes sont destines une


ressource identifie par l'URL (qui doit normalement interprter
les donnes)

Dans le cas de PUT, les donnes sont la ressource placer


l'endroit spcifi par l'URL

Mise jour (200 OK) ou cration (201 Created)

DELETE permet de supprimer des donnes

Requirent le droit d'accs (authentification)

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 38

Les relais

Modle client/serveur trop simpliste

Beaucoup de machines intermdiaires qui jouent le rle de


serveur pour le client et de client pour le serveur

Peuvent galement stocker temporairement des rponses pour


les rejouer la prochaine requte identique: proxy cache

Un client peut spcifier explicitement (statiquement) qu'il veut


utiliser un proxy

Nombreux champs d'en-tte spcifiques

Proxy-Authenticate, Proxy-Authorization, Via,


Max-Forwards, Cache-Control (Pragma: no-cache), Vary...

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 39

Session Tracking

HTTP protocole sans tat. Comment savoir quelle tait la


prcdente requte du mme client?

Ide: faire sauvegarder un tat par le client, qu'il


devra renvoyer dans la prochaine requte

Champs hidden des formulaires

Rcriture des URL des liens hypertextes contenus dans les


documents retourns. Exemple:
<a href="http://serveur/request_for_client_03728612">

Ne requiert aucune participation du client

Cookies (plus simple pour le serveur)


introduit par Netscape, puis RFC 2109
Requiert la participation du client

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 40

Cookies

C'est une paire <cl>=<valeur>

Initialement fournie par le serveur dans une rponse

Stocke par le client (navigateur)

Puis retransmise par le client lorsqu'il met des requtes

Spcifi par un champ d'en-tte dans la rponse

Set-Cookie: <cl>=<valeur> [;
[;
[;
[;

expires=<DATE>]
path=<PATH>]
domain=<DOM>]
secure]

Rejou par les clients:

Cookie: <cl1>=<valeur1>; <cl2>=<valeur2> ...

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 41

Cookies (suite)

Attributs optionnels

expires: pour la date de premption. Au del, le client ne doit


pas conserver le cookie

domain et path servent dterminer les URL pour lesquels ce


cookie doit tre utilis
(par dfaut, ceux de l'URL de la requte sont utiliss)

Les cookies dont la valeur de domain est diffrente du domaine du


serveur ayant gnr la rponse doivent tre ignors

Les cookies trop larges (moins de deux . ) ignors

secure: cookie n'utiliser que si connexion scurise

Si mme path et mme domain, le nouveau crase l'ancien. Si


path diffre, on stocke et renvoit les deux.

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 42

java.net.URI

Depuis j2sdk1.4: manipulation syntaxique des URI

Neuf composants rpertoris sur un URI

scheme String

scheme-specific-part

authority String

user-info String

host String

port int

path String

query String

fragment String

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

String

Page 43

Classe URI

Constructeur acceptant la chane URI en argument

Vrifie la syntaxe des URI (RFC 2396):

URI u1 = new URI("http://igm.univ-mlv.fr");

URI u2 = new URI("nimporte:quoi");

URI u3 = new URI("relatif");

URI u4 = new URI("\\\interdit");


// lve une URISyntaxException

Mthode statique create(String uri) identique

Mais lve une IllegalArgumentException qu'on a pas besoin


de rcuprer ni de propager (RuntimeException).

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 44

Classe URI (suite)

Quatre autres constructeurs spcifiant des parties

URI (String schema, String user, String machine,


int port, String path, String query, String fragment)
Ex:URI("ftp", "user", "www.test.fr", 21, "/d/file.txt", "param=val", "ancre") qui
correspond ftp://user@www.test.fr:21/d/file.txt?param=val#ancre

URI (String schema, String autorit,


String path, String query, String fragment)
Ex:URI("ftp", "user@www.test.fr:21", "/d/file.txt", "param=val", "ancre")

URI(String schema, String partieDpendante, String fragment)


Ex:URI("ftp", "user@www.test.fr:21/d/file.txt?param=val", "ancre")

URI(String schema, String machine, String path, String fragment)


quivalent un appel au premier constructeur avec
URI(schma, null, machine, -1, path, fragment)

Plus gnralement, null ou -1 pour un champ absent

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 45

Classe URI (spcificits)

Principal avantage: permet d'utiliser des caractres


Unicode en plus des caractres ASCII

URI ipv6 = new URI("sch","1080::02C:417A","/mon fichier",null);


System.out.println(ipv6);
// Affiche: sch:[1080::02C:417A]/mon%20fichier

"Analyse" des parties de l'URL, w.r.t le constructeur


URI bad1 = new URI ("sch://500.1.2.3/");
System.out.println(bad1); // Affiche: sch://500.1.2.3/
l'authorit de nommage pourrait tre considre comme non lie un serveur

URI bad2 = new URI ("sch", "500.1.2.3", "/", null);


System.out.println(bad2);
// lve: URISyntaxException: Malformed IPv4 address...
ici, le 2nd argument est (syntaxiquement) une adresse IP

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 46

Classe URI (accesseurs)

Dcoupage d'un objet URI en morceaux

getScheme(), getUserInfo(), getHost(), getAuthority(), getPort(),


getPath(), getQuery(), getFragment()

isOpaque(), getSchemeSpecificPart()

Mthode parseServerAuthority() vrifie que l'autorit


correspond des informations relatives un serveur

Sinon lve URISyntaxException

getRawUserInfo(), getRawAuthority(), getRawPath(), etc...


donnent les champs avant dcodage Unicode

getASCIIString() donne cet URI en US-ASCII

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 47

Classe URI (relatifs et absolus)

Dans le cas d'un URI reprsentant un URI relatif, toutes les


mthodes correspondant une partie manquante retournent null

Mthode resolve(URI relatif)

Retourne l'URI absolu correspondant l'URI realtif pass en argument,


rsolu par rapport l'URI de base sur lequel la mthode est appele

Existe avec un argument de type String

Mthode relativize(URI uri)

Retourne l'URI relatif qui reprsente uri par rapport l'URI de base sur
lequel est appel la mthode

Mthode normalize() limine les parties inutiles

http://machine/dir/./subdir/../file.html => http://machine/dir/file.html

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 48

Classes URI et URL

Instance de la classe URI

Rfrence la RFC 2396, au sens syntaxique du terme.

Peut tre absolu ou relatif

Analys selon la syntaxe gnrique, indpendamment du schma.

Pas de rsolution du nom de l'hte, ni gestionnaire de schma.

galit, hachage et comparaison sur les caractres dcrivant l'URI.

Instance de la classe URL

Composants syntaxiques + informations pour l'accs la ressource.

Doit tre absolu, c'est- dire spcifier un schma.

Analys en fonction du schma.

Donne lieu l'tablissement d'un gestionnaire de schma associ.

Ne peut pas crer d'URL pour un schma dont on a pas le gestionnaire.

galit, hachage et comparaison dpendent du schma et de l'hte.


Page 49

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Classe URL

Historiquement antrieure URI

Ne respecte pas rigoureusement la terminologie des URI (RFC 2396)

Interprtation restricitve (ex: schma = protocole, path = file)

Aucun codage sur les morceaux de l'URL

Comment contruire un URL (MalformedURLException)

URL url = new URI(...).toURL();

Six constructeurs

URL(String spec)

URL(String scheme, String host, int port, String path)

URL(String scheme, String host, String path)

URL(URL context, String spec)

URL(URL context, String spec, URLStreamHandler)

URL(String sch, String host, int port, String path,URLStreamHandler)

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 50

URL: accs aux caractristiques

Mthodes d'accs aux diffrentes parties de l'URL

getProtocol(), getAuthority(), getHost(), getPort(),


getDefaultPort(), getFile() (avec <query>), getPath() (sans
<query>), getQuery(), getRef()

toExternalForm() retourne la forme canonique de l'URL

Deux mthodes de comparaison

equals() retourne true si les 2 URL sont diffrents de null, et


rfrencent exactement la mme ancre de la mme ressource
sur la mme machine

sameFile() identique mais retourne true mme si les ancres


diffrent

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 51

Comparaison entre URIs / entre URLs

La classe URI ne s'occupe que des caractres


URI uri1 = new URI("http://igm.univ-mlv.fr/~duris/index.html");
URI uri2 = new URI("http://monge.univ-mlv.fr/~duris/index.html");
System.out.println(uri1.equals(uri2));
// Affiche: false

La classe URL analyse la localisation du contenu


...plus particulirement la machine et le port
URL url1 = new URL("http://igm.univ-mlv.fr/~duris/index.html");
URL url2 = new URL("http://monge.univ-mlv.fr/~duris/index.html");
URL url3 = new URL("http://193.55.63.80:80/~duris/index.html");
System.out.println(url1.equals(url2));
// Affiche: true
System.out.println(url1.equals(url3));
// Affiche: true

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 52

URL: accs au contenu

La mthode getContent() retourne un objet correspondant la


ressource

URL u = new URL("http://igm.univ-mlv.fr/~duris/logo.gif");


System.out.println(u.getContent());
// Affiche: sun.awt.image.URLImageSource@a0dcd9

Rcuprer un flot de lecture sur cette ressource

InputStream openStream()

Pas toujours trs pertinent

Ces deux mthodes sont des raccourcis de

openConnection().getContent()

openConnection().getInputStream()

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 53

Classe URLConnection

Gestionnaire de connection

Classe abstraite commune tous les objets qui grent


les connexions vers des ressources rfrences par des
URL

Mthodes indpendantes du schma

Rcupration d'attributs de la connexion

Passage d'attributs la connexion

En gnral, une instance de URLConnection est cre


par un appel openConnection() sur un objet URL

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 54

Cycle de vie de URLConnection

1. L'objet reprsentant la connexion est cr par invocation de


la mthode openConnection() sur un URL donn

2. Les paramtres de cette (future) connexion peuvent tre


manipuls

3. La connexion est rellement tablie par un appel la


mthode connect()

4. L'objet (la ressource) distant(e) peut tre accd(e) ainsi que


les champs d'en-tte associs cette connexion

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 55

Manipuler les paramtres de connexion

Les paramtres de la connexion doivent tre fixs avant


qu'elle soit effectivement tablie

setRequestProperty(String key, String value)

getRequestProperty(String key)

Mthodes ddies certains paramtres: doInput, doOutput,


allowUserInteraction, ifModifiedSince, useCaches...

Les mthodes setDefaultAllowUserInteraction() et


setDefaultUseCaches() donnent des valeurs par dfaut au
paramtre correspondant pour toutes les futures connexions

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 56

Paramtres de connexion: exemple

// Cration de l'url
URL url = new URL("http://www.univ-mlv.fr/index.html");
// Cration de l'objet connexion
URLConnection uc = url.openConnection();
// spcification de paramtres pour la connexion
uc.setRequestProperty("Connection","close");
SimpleDateFormat f = new SimpleDateFormat("dd/MM/yy zzzz");
Date d = f.parse("01/01/2002 GMT", new ParsePosition(0));
uc.setIfModifiedSince(d.getTime());

Gnre les en-ttes suivants dans la requte


Connection: close
If-Modified-Since: Tue, 01, Jan 2002 00:00:00 GMT

Et d'autres, par dfaut, dont


User-Agent: Java/1.5.0

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 57

Utiliser la connexion

Commencer par appeler connect()

La plupart des mthodes suivantes font implicitement un appel


connect() s'il n'a pas dj t fait

Exploitation de la connexion

getContent() donne la ressource sous la forme d'objet

getHeaderField() donne la valeur d'un champ d'en-tte

getInputStream() flot de lecture sur le contenu

getOutputStream() flot d'criture sur la connexion

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 58

Rcupration des champs d'en-tte

getHeaderField() est dclin pour certains champs d'entte spcifiques (valeurs de retour de type String ou int):

getContentType(), getContentEncoding(), getContentLength(),


getDate(), getExpiration(), getLastModified()

Mthodes utilitaires

int getHeaderFieldInt(String key, int defaut)


long getHeaderFieldDate(String key, long defaut)
String getHeaderFieldKey(int n)
String getHeaderField(int n)

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 59

Sous-classes de URLConnection

HttpURLConnection (classe abstraite)

Mthodes d'accs spcifiques au protocole HTTP, ex:

setRequestMethod() spcifie la mthode de requte

getResponseCode() et getResponseMessage() donnent le


code et le message de rponse (constantes dfinies)

setFollowRedirects() pour suivre les redirections (3xx) pour les


instances de cette classe de gestionnaire, et
setInstanceFollowRedirects() pour une instance particulire

disconnect() demande la dconnexion si keep alive

usingProxy() permet d'indiquer le passage par un relais

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 60

Sous-classes de URLConnection (2)

JarURLConnection (classe abstraite)

Accs une archive Java (Jar) locale ou distante

URL de la forme jar:<url>!/<entry> par exemple:


jar:http://www.server.org/archive.jar!/dir/TheClass.class

Mthodes d'accs aux diffrentes parties et aux diffrents


attributs des entres de l'archive

Permet de rcuprer des objets de la classe


java.util.jar.JarEntry

Permet d'obtenir un flot de lecture sur l'entre spcifie par


l'URL

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 61

Authentification

Concerne les champs d'en-tte Authorization ou ProxyAuthorization lors de rponses

401 Unauthorized ou 407 Proxy Authentication Required.

Classe abstraite Authenticator

Gestionnaire d'authentification, install par la mthode statique


setDefault(Authenticator a)

Une fois install, chaque requte reevant une rponse 401 ou


407 fait appel, via l'objet URL, la mthode statique
requestPasswordAuthentication() qui appelle la mthode
protge getPasswordAuthentication() qui retourne un objet de
classe PasswordAuthentication

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 62

Authentification (2)

Classe PasswordAuthentication reprsente

Un identificateur (String)

Un mot de passe (char [])

Par dfaut getPasswordAuthentication() retourne null

Redfinir cette mthode dans une sous classe concrte de


Authenticator d'une mthode

Utiliser les mthodes getRequestingSite() (machine),


getRequestingProtocol(), getRequestingScheme(),
getRequestingPrompt() (realm du challenge),
getRequestingPort() de la classe Authenticator

L'objet URL place ces valeurs dans les champs d'en-tte

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 63

Gestionnaires

Architecture ouverte autour des URL pour ajouter:

De nouveaux schmas d'URL

De nouveaux types de ressources reconnus

Ses propres implantations des gestionnaires existants

Les classes d'objets concerns sont:

Gestionnaires de schmas (URLStreamHandler)

Gestionnaires de connexion (URLConnection)

Analyse de l'URL et cration du gestionnaire de connexion

Grer l'accs la ressource et ses attributs via un protocole

Gestionnaires de contenus (ContentHandler)

Transforme le flot sur la ressource en un objet Java

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 64

Gestionnaires par dfaut

Gestionnaire de schma cr dynamiquement

la premire cration d'URL ayant ce schma <s>

sun.net.www.protocol.<s>.Handler

MalformedURLException si aucune classe ne correspond

Gestionnaire de schma dtermine la classe des


gestionnaires de connexion

openConnection() retourne un gestionnaire de connexion

Gestionnaire de contenu cr par gestion de connexion

en fonction du type MIME <type>/<soustype> de la ressource

sa premire rencontre, lorsque getContent() est appele

sun.net.www.content.<type>.<soustype>

UnknownServiceException si aucune classe trouve de ce nom

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 65

Mcanisme gestionnaires

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 66

Mise en place de ses propres gestionnaires

Pour utiliser son propore gestionnaire de schma

Le passer en argument du constructeur de la classe URL

Sinon, installer une fabrique, implantant l'interface


URLStreamHandlerFactory, par la mthde
setURLStreamHandlerFactory() de la classe URL.

Elle retourne l'objet URLStreamHandler correspondant au protocole


qu'elle sait traiter, ou sinon doit retourner null pour que le schma par
dfaut s'applique

Sa mthode openConnection() retourne un gestionnaire de connexion


spcifique, sous-classe de URLConnection

Mme principe existe pour les gestionnaires de contenu

URLConnection uc = ...;
uc.setContentHandlerFactory(ContentHandlerFactory chf);

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 67

Applettes

Dlocaliser l'excution de programmes sur le client

Spcifi dans une page HTML (balises <applet>)

C'est le navigateur du client qui excute le bytecode

Participe l'quilibrage de charge (load balancing)

Utilise les mcanismes de chargement de classe


distance

URLClassLoader

Permet de trouver et charger une classe parmi un ensemble


d'URL de base, locaux ou distants

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 68

Chargement de classe

Pour utiliser une classe (ou interface), la machine


virtuelle doit avoir charg son bytecode

C'est un chargeur de classe qui s'en occupe

Classe abstraite java.lang.ClassLoader

A toute classe A est associ un chargeur

Celui-ci est responsable du chargement des classes qui sont


utilises par A, et transitivement...

Possibilit de dlguer le chargement un autre chargeur

Possibilit de demander si la classe n'a pas dj t charge

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 69

Chargement de classe (2)

Pour la machine virtuelle, chaque classe charge est identifie


par:

Son nom complet (avec package, ex: java.lang.String)

Son chargeur (celui qui a effectu le chargement du bytecode)

IMPORTANT: deux classes diffrentes de mme nom complet peuvent


cohabiter dans la machine virtuelle si elles n'ont pas t charges par le
mme chargeur

En plus, une politique de scurit est associe chacune de


ces classes charges

Ide: mme degr de scurit pour des classes provenant du mme


endroit

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 70

Chargeur de bootstrap

Les objets chargeurs de classes sont des instances


d'une sous-classe de ClassLoader

Le bytecode de cette sous-classe doit avoir t charg...

Ce mcanisme rcursif se termine par un chargeur de classe


particulier dit bootstrap classloader

La mthode Class getClassLoader() applique sur un


objet charg par le bootstrap classloader retourne null

Sinon, elle retourne l'instance de ClassLoader qui a charg la


classe ayant cr cet objet

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 71

Trois groupes de classes

Les classes de bootstrap

Ncessaires l'environnement d'excution standard

Distribues par Sun dans la plate-forme standard et supportes dans le


futur. Ex: les classes de rt.jar

Fichiers d'archives spcifis par sun.boot.class.path

Les classes de bibliothque d'extensions standard

Fichiers d'archives spcifis par java.ext.dirs

Les classes dfinies par l'utilisateur

Par dfaut, seul le rpertoire courrant, mais on peut spcifier avec


l'option -classpath ou variable d'environnement CLASSPATH
(java.class.path)

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 72

La classe ClassLoader

Par dfaut, une classe est d'abord recherche parmi les


classes de bootstrap, puis parmi les classes d'extension
et enfin seulement parmi les classes utilisateur

Les chargeurs de classes sont organiss


hirarchiquement => notion de dlgation

A chaque demande de chargement, un chargeur de classe


dlgue le chargement de la classe son chargeur de classe
parent, avant de tenter de le faire rellement lui-mme en cas
d'chec du chargeur parent

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 73

Les mthodes de ClassLoader

Class loadClass(String name)

Class findLoadedClass(String name)

Demande au chargeur d'initier le chargement d'une classe (via des


dlgations ventuelles)

Demande au chargeur s'il a dj rellement charg une classe

Class findClass(String name)

Demande au chargeur de charger rellement une classe (sans aucune


dlgation un autre chargeur)

ClassLoader getParent()

void resolveClass(Class c)

Prpare l'instance c pour son utilisation prochaine, fait des vrifications


de bytecode, prpare et alloue des structures, ralise l'dition de liens

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 74

Schma de dlgation

Le chargeur de classe, via sa mthode loadClass(), commence


par rechercher, grce la mthode findLoadedClass(), s'il n'a
pas dj charg la classe.

S'il ne l'a pas dj rellement charge, il tente de dlguer le


chargement au chargeur de classe parent grce getParent()

Si le chargeur de classe parent n'a pas trouv la classe, alors le


chargeur courrant appelle la mthode findClass()

En cas d'chec au final, une exception


ClassNotFoundException est leve

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 75

Pseudo-code de chargement de classe


public Class loadClass(String name, boolean resolve)
throws ClassNotFoundException {
// Recherche de la classe parmi les classes dj charges
Class c = findLoadedClass(name);
if (c != null) return c;
try {
// Rcupre le chargeur parent (rfrence suppose non nulle)
ClassLoader parent = getParent();
c = parent.loadClass(name); //Recherche avec le chargeur parent
if (c != null) return c;
} catch (ClassNotFoundException e) {} // Le parent n'a pas trouv
/* Si le chargeur parent n'a pas charg la classe, c'est au
chargeur courant de le faire. Si une RuntimeException est
survenue pendant que le parent chargeait la classe, ou
pendant le getParent(), ou bien encore pendant l'appel
suivant, il faut la propager. */
c = findClass(name);
if (resolve) resolveClass(c);
return c;
}
Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 76

Modifier le comportement par dfaut

Pour modifier le comportement par dfaut du chargement


de classe

mais sans changer le schma de dlgation, il faut redfinir


dans son propre chargeur de classe la mthode findClass(), et
ne pas modifier la mthode loadClass()

La mthode findClass() se charge de construire un objet de la


classe Class grce la mthode
Class defineClass(String name, byte[] b, int off, int len,
ProtectionDomain domain) throws ClassFormatError

La mthode resolveClass() finira de prparer la classe charge


en vue de son utilisation

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 77

Cration d'objet et excution de code

Une fois la classe obtenue et charge par le chargeur de


classe (celui qui a appel la mthode defineClass())

On peut en crer des instances (newInstance(), par exemple)

Toutes les classes requises pour excuter du code sur l'objet


ainsi obtenu seront charges par le mme chargeur de classe

Il est ainsi possible que la mme classe soit charge par deux
chargeurs diffrents: les deux classes charges sont
incompatibles

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 78

Sous-classes de ClassLoader

SecureClassLoader (hrite de ClassLoader)

Utilise la politique de scurit courante pour dfinir le domaine


de scurit en fonction d'un objet de la classe CodeSource
(encapsule les notions d'URL de base et de certificats des
signataires du code)

URLClassLoader (hrite de SecureClassLoader)

Dfinit en plus une stratgie de recherche des classes parmi


une liste d'URL correspondant

des rpertoires si les URL se terminent par des "/"

ou des archives JAR dans tous les autres cas

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 79

URLClassLoader

Constructeur le plus gnral

URLClassLoader(URL[] urls, ClassLoader parent,


URLStreamHandlerFactory fabrique)

En plus des mthodes loadClass(), findClass(), etc...


plusieurs mthodes permettent de manipuler l'objet
chargeur de classe relativement aux ressources qu'il
peut dsigner

URL findResource(String nom)

Enumeration findResources(String nom)

URL[] getURLs()

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 80

java.applet.Applet

Recherche, chargement, excution et contrle de l'applette sont


la charge du navigateur

Le programmeur dispose de quatre mthodes

init() appele aprs le chargement et l'initialisation (conf)

start() appele aprs init(), puis chaque fois que la fentre redevient
visible

stop() appele chaque fois que la fentre est cache, pour suspendre
l'animation par exemple

destroy() appele pour terminer le cycle de vie de l'applette et librer


les ressources

Ces mthodes ne font rien par dfaut, sauf isActive()

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 81

Graphique et navigateur

Graphique

java.applet.Applet hrite de java.awt.Panel

Pour swing javax.swing.JApplet hrite de Applet

Dans un document HTML,

entre les balises <applet> et </applet>, par exemple:

<applet code="NomDeClasse" width=150 height=80>


<param name="NomParamtre" value="Valeur">
</applet>

ventuellement, spcifier grce codebase l'URL o trouver le


bytecode si localisation diffrente

getCodeBase() versus getDocumentBase()

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 82

Souche et Contexte

Une applette peut interagir avec le navigateur

setStub() est appele par le navigateur la cration de


l'applette, pour positionner une souche (AppletStub)
Cette souche sert d'interface entre le navigateur et l'applette

isActive(), getAppletContext(), getCodeBase(), getDocumentBase(),


getParameter(), etc...

getAppletContext() retourne un objet reprsentant le contexte


d'excution de l'applette (AppletContext).
C'est le mme objet contexte pour toutes les applettes d'un
mme document HTML

Possibilit de les rcuprer via getApplets()

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 83

Droits des applettes

Par dfaut, les navigateurs interdisent

L'accs au systme de fichier local (lecture et criture)

Le lancement de processus au moyen de System.exec()

Le chargement de bibliothque ou la dfinition de mthodes natives

L'accs ou la modification de proprits systmes donnant des


informations sur l'utilisateur ou la machine locale (ex: user.name)

L'accs un autre groupe de processus lgers

L'installation de ClassLoader ou Factory

La connexion vers une autre adresse Internet que celle d'o provient
l'applette

L'acceptation de nouvelles connexions

Sinon, il faut signer l'applet et utiliser la politique de scurit

Etienne Duris ESIPE - Universit de Marne la Valle Avril 2012

Page 84

Anda mungkin juga menyukai