GET /~luc/WEB_AVANCE/s5-intro.html HTTP/1.1 Host: www.greyc.ensicaen.fr
HTTP/1.1 200 OK Content-type: text/html <html>...</html>
Notez le saut de ligne ! Il marque la fin de l'en tête et le début du contenu du message.
Notez également que text/html peut être remplacé par n'importe quel type-mime.
GET /~luc/WEB_AVANCE/s5-intro.html HTTP/1.1 Host: www.greyc.ensicaen.fr
HTTP/1.1 200 OK Content-type: text/html Set-Cookie: name=value; expires=date; path=/; domain=www.greyc.ensicaen.fr <html>...</html>
Set-Cookie: name=value; expires=date; path=/; domain=www.greyc.ensicaen.fr
Set-Cookie: name=value; expires=date; path=/; domain=www.greyc.ensicaen.fr
Wdy, DD-Mon-YYYY HH:MM:SS GMT
Exemple, Mercredi 20 août 2008 à 21h05:Wed, 20-08-2008 21:05:00 GMT
#!/bin/sh
expires=`date -d '+1 hour' +"%a, %d-%b-%Y %T GMT"`
echo "Content-type: text-html"
echo "Set-Cookie: seen=yes;expires=$expires"
echo ""
echo "<html><head><title>Hello</title></head><body><h1>"
if echo $HTTP_COOKIE | grep -q seen
then
echo "Je vous ai déja vu quelque part"
else
echo "Hello Etranger"
fi
echo "</h1></body></html>"
#!/bin/sh
get_val()
{
name=$1
if [ "$HTTP_COOKIE" = "" ]
then
echo
return -1
fi
ifs=$IFS
IFS=";"
set $HTTP_COOKIE
IFS=$ifs
for egal in $*
do
var=`echo $egal | cut -d"=" -f1`
if [ $var = $name ]
then
echo $egal | cut -d"=" -f2
return 0
fi
done
echo ""
return -2
}
setcookie(name, value, expire,path,domain);
<?php
setcookie("seen", "yes", time()+3600);
?>
<html>
<head><title>Hello</title></head>
<body><h1>
<?
if(isset($_COOKIE["seen"]))
echo "Je vous ai déja vu quelque part";
else
echo "Hello Etranger";
?>
</h1>
</body>
</html>
document.cookie = "name=value; expires=date; path=path; domain=domain";
var1=val1; var2=val2;...
Fonctionnement différent qu'en shell ou en PHP: Javascript est exécuté sur le navigateur !
<script language="Javascript">
var seen=true;
if((document.cookie.length==0)||(document.cookie.indexOf("seen=")==-1))
{
document.write("Hello Etranger!");
seen=false;
}
date=new Date();
date.setTime(date.getTime()+60*60*1000);
document.cookie="seen=yes; expires="+date.toGMTString()+"; path=/";
if(seen)
document.write("Je vous ai déjà vu quelque part..");
</script>
document.cookie est immédiatement modifié.
function createCookie(name,value,days,hours) {
if (days||hours) {
var date = new Date();
date.setTime(date.getTime()+(days*24*60*60*1000)+(hours*60*60*1000));
var expires = "; expires="+date.toGMTString();
}
else var expires = "";
document.cookie = name+"="+value+expires+"; path=/";
}
function readCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
return null;
}
function eraseCookie(name) {
createCookie(name,"",-1);
}
Un site de démonstration utilisant ce système est disponible ici.
bool session_start ( void )
Si la clé est transmise par
cookie, le start_session doit être positionné avant toute balise HTML
<?php // page1.php session_start(); echo 'Welcome to page #1'; $_SESSION['favcolor'] = 'green'; $_SESSION['time'] = time(); // Works if session cookie was accepted echo '<br /><a href="page2.php">page 2</a>'; // Or maybe pass along the session id, if needed echo '<br /><a href="page2.php?' . SID . '">page 2</a>'; ?>
bool session_destroy(void)
<?php
// Initialize the session.
// If you are using session_name("something"), don't forget it now!
session_start();
// Unset all of the session variables.
$_SESSION = array();
// If it's desired to kill the session, also delete the session cookie.
// Note: This will destroy the session, and not just the session data!
if (isset($_COOKIE[session_name()]))
setcookie(session_name(), '', time()-42000, '/');
// Finally, destroy the session.
session_destroy();
?>
AJAX(Asynchronous Javascript and Xml) est une méthode permettant d'interroger un serveur http a partir d'un navigateur et du language Javascript. Son avantage est de permettre une plus grande réactivité de l'interface par rapport au web classique.
Cette partie du cours est inspirée des cours de :requeteHTTP=new XmlHttpRequest();
requetteHttp=new ActiveXobject("Microsoft.XMLHTTP"); requetteHttp=new ActiveXobject("Msxml2.XMLHTTP"); | Valeurs | |
| 0 | Uninitialized |
| 1 | Loading, |
| 2 | Loaded, |
| 3 | Interactive, |
| 4 | Completed |
<script type="text/javascript" src="ajax.js">
</script>
<script type="text/javascript">
function sendRequest(url)
{
var requeteHttp=getRequestHttp();
if(requeteHttp==null)
{
alert("Impossible d'utiliser Ajax sur ce navigateur");
}
else
{
requeteHttp.open('GET',url,false);
requeteHttp.send(null);
if(requeteHttp.readyState==4) // requete achevé. Résultat transmis
{
if(requeteHttp.status==200)// fin correcte de la requete
alert(requeteHttp.responseText); //affichage du message
else
alert("Error :"+requeteHttp.status+",La requete ne s'est pas correctement executée");
}
}
return true;
}
</script>
</head>
<body>
<h1>Page 1 Ajax</h1>
<a href="#" onclick="return sendRequest('page2.php?messg=coucou');"> requete</a>
document.getElementById("toto").innerHTML=response;
header("Cache-Control: no-cache, must-revalidate");
echo date('h:i:s');
Notez l'utilisation du header pour forcer le rechargement de la page
par le navigateur.
var requeteHttp=getRequestHttp();
if(requeteHttp==null)
{
alert("Impossible d'utiliser Ajax sur ce navigateur");
}
else
{
requeteHttp.open('GET',url,true);
requeteHttp.onreadystatechange=process_request();
requeteHttp.send(null);
...
function sendRequest(url)
{
var requeteHttp=getRequestHttp();
if(requeteHttp==null)
{
alert("Impossible d'utiliser Ajax sur ce navigateur");
}
else
{
requeteHttp.open('GET',url,true);
requeteHttp.onreadystatechange=function (){ process_request(requeteHttp); };
requeteHttp.send(null);
}
return true;
}
requeteHttp.open('POST',url,true);
requeteHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
requeteHttp.send(var1=val1&var2=val2&....)
function postRequestWithParam(url,param)
{
var requeteHttp=getRequestHttp();
if(requeteHttp==null)
{
alert("Impossible d'utiliser Ajax sur ce navigateur");
}
else
{
requeteHttp.open('POST',url,true);
requeteHttp.onreadystatechange=function (){ process_request(requeteHttp); };
requeteHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
requeteHttp.send(param);
}
return true;
}
<?xml version="1.0" encoding="utf-8"?> <hotels> <hotel prix="48"> <name>Chez René **</name> <tel>33.(0)5.59.69.46.28.</tel> </hotel> <hotel prix="56"> <name>Hotel Constance </name> <tel> 33.(0)5.69.29.19.36.</tel> </hotel> </hotels>
Un fichier XHTML n'est qu'un
document XML particulier. AJAX va donc:
| Code | Type | ||
| 1 | Element | ||
| 2 | attribut (d'un noeud) | ||
| 3 | texte | ||
| 9 | Document |
| nom | Type | Modifiable | Description |
| nodeName | Chaîne | Non | Le nom de ce noeud, qui dépend de son type; voir la table ci-dessus. |
| nodeValue | Chaîne | Oui | La valeur de ce noeud, qui dépend de son type; voir la table ci-dessus. |
| nodeType | Entier | Non | Un code représentant le type d'objet sous-jacent, tel que défini ci-dessus. |
| parentNode | Node | Non | Le parent de ce noeud. |
| childNodes | NodeList | Non | La liste de noeuds constituée des enfants du noeud. |
| firstChild | Node | Non | Le premier enfant de ce noeud Si un tel noeud n'existe pas, la valeur null est retournée. |
| lastChild | Node | Non | Le dernier enfant de ce noeud Si un tel noeud n'existe pas, la valeur null est retournée. |
| previousSibling | Node | Non | Le noeud qui précède immédiatement le noeud courant. Si un tel noeud n'existe pas, la valeur null est retournée. |
| nextSibling | Node | Non | Le noeud qui suit immédiatement le noeud courant. Si un tel noeud n'existe pas, la valeur null est retournée. |
for(i=0;i<list.length;i++)
{
n=list.item(i);
...
}
| nom | Type | Modifiable | Description |
| name | Chaîne | Non | Retourne le nom de l'attribut courant. |
| specified | booleen | Non | Prend la valeur true si une valeur a été explicitement donnée à l'attribut courant dans le document original ; false sinon. |
| value | Chaîne | Oui | A l'utilisation, la valeur de l'attribut est retournée comme une chaîne de caractères. Les entités caractères et les entités générales de référence sont remplacées par leurs valeurs. |
fonction très utile.
...requeteHttp.onreadystatechange=function(){afficher_alert(requeteHttp);};...
et
function afficher_alert(requeteHttp)
{
var hotels=requeteHttp.responseXML.getElementsByTagName("hotel");
for(i=0;i<hotels.length;i++)
{
var hotel=hotels.item(i);
var prix =hotel.getAttributeNode("prix").value;
// var name=hotel.getElementsByTagName("name").item(0).firstChild.nodeValue;
var name=hotel.childNodes.item(1).firstChild.nodeValue;
var tel=hotel.getElementsByTagName("tel").item(0).firstChild.nodeValue;
alert("prix="+prix+"name="+name+"tel="+tel);
}
}
function afficher_alert2(requeteHttp)
{
var hotels=requeteHttp.responseXML.getElementsByTagName("hotel");
var obj=document.getElementById("answer1");
obj.innerHTML="
function afficher_table(requeteHttp)
{
var titles=Array("Prix","Nom","Tel");
var values=Array();
var hotels=requeteHttp.responseXML.getElementsByTagName("hotel");
var obj=document.getElementById("answer");
var table=document.createElement("table");
var oldTables=obj.getElementsByTagName("table");
if(oldTables.length==1)
obj.replaceChild(oldTables.item(0),table);
table.setAttribute("border","1");
var tr=document.createElement("tr");
var td;
for(i=0;i<3;i++)
{
td=document.createElement("td");
td.appendChild(document.createTextNode(titles[i]));
tr.appendChild(td);
}
table.appendChild(tr);
for(i=0;i<hotels.length;i++)
{
var hotel=hotels.item(i);
values[0] = hotel.getAttributeNode("prix").value;
values[1] = hotel.getElementsByTagName("name").item(0).firstChild.nodeValue;
values[2] = hotel.getElementsByTagName("tel").item(0).firstChild.nodeValue;
tr=document.createElement("tr");
for(j=0;j<3;j++)
{
td=document.createElement("td");
td.appendChild(document.createTextNode(values[j]));
tr.appendChild(td);
}
table.appendChild(tr);
}
obj.appendChild(table);
}
<li> <a href="#" onclick="javascript:post_sendRequest('hotels.xml',afficher_table);"> DOM</a></li>
</ul>
<div id="answer"></div>
<?xml version="1.0" encoding="iso-8859-1"?> <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">afin de précise la version de rss utilisée.
header('Content-type: application/atom+xml');
$dbconn=connexion();
function display_news($query,$i)
{
echo "item\n";
echo "title".pg_fetch_result($query,$i,2)."/title\n";
echo "description".pg_fetch_result($query,$i,3)."/description\n";
echo "pubDate".pg_fetch_result($query,$i,1)."/pubDate\n";
echo "link".pg_fetch_result($query,$i,4)."/link\n";
echo "/item\n";
}
echo '?xml version="1.0" encoding="utf-8"?';
?>
rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"
channel
titleIAPR TC 15 RSS/title
descriptionIAPR TC15 news /description
image
urlhttp://www.greyc.ensicaen.fr/iapr-tc15/images/gbr_logo.jpg/url
linkhttp://www.greyc.ensicaen.fr/iapr-tc15//link
/image
<?
$requete="select date of last update"; $query=pg_query($dbconn,$requete);
echo "lastBuildDate".pg_fetch_result($query,0,0)."/lastBuildDate\n";
pg_free_result($query);
?>
linkhttp://www.greyc.ensicaen.fr/iapr-tc15/rss.php/link
<?
$requete="select features of news order by date desc"; $query=pg_query($dbconn,$requete);
if(!$query){ echo "Query error :".$requete; exit;}
for($i=0;$i<pg_num_rows($query);$i++)
display_news($query,$i);
pg_free_result($query);pg_close($dbconn);
/channel/rss