Wspólny Interfe s Bramy Interfe s do serwera WWW Program serwer
Transkrypt
Wspólny Interfe s Bramy Interfe s do serwera WWW Program serwer
Komunikacja Pobierz formularz.html Przegldarka WWW Serwer WWW login=SUSZI haso=WSZiB CGI CGI (Common Gateway Interface) Wspólny Int erfejs Bram y do serwera WWW Program serw er WWW Int erfejs Dwie strategie Program generuj cy kod HTML PERL, Ruby, C, C+ + ... Kod HTML zawieraj cy program PHP, JSP (Java), ASP (VBScript ,Jscript , . .) Program generujcy kod HTML ... cout << <h1> << login << </h1> << endl; <h1>SUSZI</h1> if(prawidowy(login) && prawidowe(haso)) { cout << Witamy<< endl; Witamy ... ... } else cout << Nieprawidowy login lub haso << endl; ... Kod HTML zawierajcy program ... <h1>SUSZI</h1> <h1><% cout<< login << endl; %></h1> <% if(prawidowy(login) && prawidowe(haso)) { %> Witamy Witamy ... ... <% } else {%> Nieprawidowy login lub haso <% } %> ... Formularz HTML przykad 1 <form action="/cgi-bin/skrypt.cgi" method="GET" enctype="application/x-www-form-urlencoded"> <!--<form action="mailto:adres e-mail?subject=temat" method="POST" enctype="text/plain"> --> <label>Login <input type="TEXT" name="login"> </label><br> <label>Haso <input type="PASSWORD" name="haslo"> </label><br> <input type="SUBMIT"> <input type="RESET"> </form> Formularz HTML przykad 2 <form action="/cgi-bin/skrypt.cgi" method="POST" enctype="multipart/form-data"> <fieldset> <legend>Pola do wypenienia</legend> <textarea name="wiadomosc"> Tre wiadomoci </textarea> <br> Plik do wysania <input type="FILE" name="plik" accept="image/jpeg,image/gif"> <input type="HIDDEN" name="id_nadawcy" value="1"> </fieldset> <input type="SUBMIT"> <input type="RESET"> </form> XForms - wprowadzenie Aplik acja XML osadzana w inny ch dokum ent ach XML Niezale no od sprz t u i opr ogram ow ania Dane oddzielone od sposobu ich pr ezent acji Kont r ola dany ch w pr ow adzony ch przez u y t k ow nik a Mo liw o oper ow ania na z o ony ch dany ch zapisanych w XML or az pr zechow y w anie ak t ualnego st anu t y ch danych po st ronie klient a Mo liw o realizacji z o ony ch for m ularzy (w ielost ronicow e, m ast er -det ails, ) Mo liw o dy nam icznego st er ow ania w y gl dem for m ularza, akt yw no ci pól, it p. Mo liw o w y kony w ania oblicze , w y w iet lania rezult at ów oraz w st aw iania r ezult at ów do w y nik ow y ch dany ch Obs uga zdarze XForms przykad 1 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://www.w3.org/2002/xforms" lang="pl"> <head> <f:model xmlns=""> <f:instance> <dane><imie/><nazwisko/></dane> </f:instance> <f:submission id="1" method="post" action="skrypt.cgi"/> </f:model> </head> <body> <h1>Nasz pierwszy formularz XForms.</h1> <p>Podaj dane osobowe:</p><br/> <f:input ref="imie"><f:label>Imi: </f:label></f:input> <f:input ref="nazwisko"><f:label>Nazwisko: </f:label></f:input> <f:submit submission="1"><f:label>Wylij dane</f:label></f:submit> </body> </html> <?xml version=1.0 ?> <dane> <imie>Stanisaw</imie> <nazwisko>Polak</nazwisko> </dane> XForms - przykad 2 <html xmlns = "http://www.w3.org/1999/xhtml" xmlns:xf = "http://www.w3.org/2002/xforms" xmlns:xs = "http://www.w3.org/2001/XMLSchema"> <head><title>Prosty przykad</title> <style>xf\:input xf\:label {width: 8ex}</style> <xf:model id="model" xmlns=""> <xf:instance id="dane"> <dane> <napis>tekst</napis> <liczba>7</liczba> </dane> </xf:instance> <xf:instance id="temp"><temp><dlugosc/></temp></xf:instance> <xf:bind nodeset="liczba" type="xs:integer"/> <xf:bind id="i_dl" nodeset="instance('temp')/dlugosc" calculate="string-length(instance('dane')/napis)"/> <xf:submission id="zapis" action="file:w.xml" method="put" replace="none"/> </xf:model> </head> <body> <h3>Prosty przykad</h3> <xf:input ref="napis"><xf:label>Napis:</xf:label></xf:input> <xf:output bind="i_dl"><xf:label>dugo: </xf:label></xf:output> zn. <br/> <xf:input ref="liczba"><xf:label>Liczba:</xf:label></xf:input> <br/><hr/> <xf:submit submission="zapis"><xf:label>Submit</xf:label></xf:submit> </body> </html> <?xml version=1.0?> <dane> <napis>tekst</napis> <liczba>7</liczba> </dane> Wysyanie danych z formularza danych serw er WWW Zat w ierd zenie kodow anie <form enctype=... method=...>...</form> GET POST application/x-www-form-urlencoded multipart/form-data Kodowanie application/x-www-formurlencoded - przykad Kod HTML <form action=http://www.serwer.com/skrypt.cgi> Podaj swoje imi <input name=imie type=TEXT><br> Podaj swoje nazwisko <input name=nazwisko type=TEXT> </form> Podaj swoje imi Jan Strona WWW Podaj swoje nazwisko Kowalski (Nowak) imie=Jan&nazwisko=Kowalski+%28Nowak%29 Zakodowane dane Kodowanie application/x-www-formurlencoded - wysyanie danych action=http://www.server.com/skrypt.cgi GET /skrypt.cgi?imie=Jan&nazwisko=Kowalski+%28Nowak%29 HTTP/1.0 POST /skrypt.cgi HTTP/1.0 Content-Length: 38 Content-Type: application/x-www-form-urlencoded imie=Jan&nazwisko=Kowalski+%28Nowak%29 Kodowanie multipart/form-data POST /skrypt.cgi HTTP/1.0 Content-Length: 775 Content-Type: multipart/form-data; boundary=---------------------------8152765018186645991017906692 -----------------------------8152765018186645991017906692 Content-Disposition: form-data; name="imie" Jan -----------------------------8152765018186645991017906692 Content-Disposition: form-data; name="nazwisko" Kowalski (Nowak) -----------------------------8152765018186645991017906692 Content-Disposition: form-data; name="plik"; filename="obraz.jpg" Content-Type: image/jpeg Zawarto pliku obraz.jpg -----------------------------8152765018186645991017906692 <form action=... method=POST enctype=multipart/form-data> <input name=imie type=TEXT> <input name=nazwisko type=TEXT> <input name=plik type=FILE> </form> Jan Kowalski (Nowak) obraz.jpg Skrypt CGI - otrzymywane dane Inform acje (poprzez zm ienne rodow iskow e) O przegl darce O serwerze O program ie CGI Zak odow an e dane z form u larzy GET zm ienna rodowiskow a POST St din Przykadowe zmienne rodowiskowe REQUEST_METHOD QUERY_STRING CONTENT_LENGTH CONTENT_TYPE GET kontra POST Met oda GET QUERY_STRING Lim it Met oda POST St din CONTENT_LENGTH Brak lim it u Wysyka danych ze skryptu CGI Wypisanie nag ówk a Cont ent -t ype Locat ion Wypisanie dan ych na St dout Przykadowe typy danych (MIME) t ex t /plain t ex t /ht m l im age/g if video/m peg Przykadowy skrypt CGI w C main() { } Content-type: text/html printf (Content-type: text/html\n\n);<html> <head> printf (<html>\n<head>\n); <title>Witaj</title> printf (<title>Witaj</title>\n); </head> printf (</head>\n<body>\n); <body> printf (<h1>Witaj</h1>\n); <h1>Witaj</h1> printf (</body>\n</html>\n); </body> return 0; </html> ledzenie skryptu CGI dziennik b dów linii kom en d st derr Z export REQUEST_METHOD= GET export QUERY_STRING= pole1= wart o 1& pole2= wart o 2& ... /t m p/$USER/ht t pd/cgi-bin/skrypt .cgi Bezpieczne skrypty CGI Skryp t pow inien rob i t y lko, do czego zost a pr zeznaczony Przegl dar ka nie pow inna dost aw a wi cej inform acji ni pot rzebuje Nie w olno ufa u yt kow nikowi w kw est ii popraw no ci pod aw any ch inform acji Zalety i wady CGI Zalet y Wady Prost ot a Niezale no j zyk archit ekt ura Izolacja procesów Mo liwo przekazywania param et rów do program ów Nie t rzeba m odyfikowa przegl darek Ma a wy dajno Generowanie ca o ci dokum ent u WWW Bezst anowo Brak int egracji z serwerem FastCGI Serwer 1 FastCGI danie danie Serwer 2 Przegldarka WWW Przykad #include "fcgi_stdio.h" /* biblioteka fcgi ; powinna by doczona jako pierwsza*/ #include <stdlib.h> int count; void initialize(void) { count=0; } void main(void) { /* Inicjalizacja */ initialize(); /* Ptla odpowiedzi. */ while (FCGI_Accept() >= 0) { printf("Content-type: text/html\r\n" "\r\n" "<title>FastCGI Hello! (C, fcgi_stdio library)</title>" "<h1>FastCGI Hello! (C, fcgi_stdio library)</h1>" "Request number %d running on host <i>%s</i>\n", ++count, getenv("SERVER_HOSTNAME")); } } Zalety i wady FastCGI Zalet y Elast yczno CGI Wy dajno Trwa o procesów, obs uga wielu klient ów Kom pat ybilno z CGI Try b CGI Niezale no Izolacja procesów Mo liwo przet w arzania rozproszonego Proces Fast CGI pracuj cy na innym w le Prost a m igracja Wady Konieczno rekonfiguracji serw era Ustawianie ciasteczka Set -Cookie: NAME= VALUE; [ EXPIRES= d at a; PATH= cie ka; DOMAIN= dom ena;SECURE] Form at dat y: DD-MM-YY HH:MM:SS GMT DOMAIN oraz PATH - przykad DOMAIN=icsr.agh.edu.pl PATH=/publications/ ciasteczko bdzie wysane ciasteczko nie bdzie wysane http://www.icsr.agh.edu.pl/publications/index.html http://www.icsr.agh.edu.pl/ads/index.html http://www.agh.edu.pl/publications/pub2001.html Usuwanie/zmiana ciasteczka Usu wanie Odpowiednie param et ry Dat a z przesz o ci Zm iana Odpowiednie param et ry Inna w art o Wysyka/odbieranie ciasteczka Nag ów ek Cookie: NAME1= VALUE1;NAME2= VALUE2 ... HTTP_COOKIE Odczyt danych z formularza - ogólny algorytm GET REQUEST_METHOD POST Odczytaj dane zawarte w QUERY_STRING Odczytaj ze standardowego wejcia CONTENT_LENGTH bajtów danych Rozkoduj dane zakodowane metod ' application/x-wwwform-urlencoded' Rozkoduj dane zakodowane metod CONTENT_TYPE Biblioteka CGIC Darm owa bibliot eka do ANSI-C ród o ht t p://w ww .bout ell.com /cgic/ Przykad <form action="skrypt.cgi"> #include <cgic.h> int cgiMain() <input type="text" name="nazwa"> { <input type="submit"> char *bufor; </form> int rozmiar; cgiHeaderContentType("text/html"); if(cgiFormStringSpaceNeeded("nazwa",&rozmiar) == cgiFormSuccess){ bufor=(char *)calloc(rozmiar,sizeof(char)); if(bufor != NULL){ if(cgiFormString("nazwa",bufor,rozmiar) == cgiFormSuccess) fprintf(cgiOut,"Pole \"nazwa\" zawiera napis <b>%s</b>",bufor); free(bufor); } } else fprintf(cgiOut,"Formularz nie zawiera pola \"nazwa\"\n"); return 0; } Biblioteka CGICC Darm owa bibliot eka do C+ + ród o ht t p://w ww .gnu.org/soft w are/cgicc/ Przykad #include <iostream> #include <vector> #include <string> #include "cgicc/Cgicc.h" #include "cgicc/HTTPHTMLHeader.h" #include "cgicc/HTMLClasses.h" using namespace std; using namespace cgicc; int main(int argc, char **argv) { try { Cgicc cgi; cout << HTTPHTMLHeader() << endl; cout << html() << head(title("Cgicc - przykad")) << endl; cout << body() << endl; form_iterator name = cgi.getElement("nazwa"); if(name != cgi.getElements().end()) { cout << "Wartoci pola \"nazwa\" jest napis: " << **name << endl; } cout << body() << html(); }catch(exception& e) { // handle any errors - omitted for brevity } } róda T. Traczyk , Xform s D. Trajkow ska, Tworzenie form ularzy Xf orm s , CHIP 03/2006 C. Sobaniec, Com m on Gat eway Int erf ace ht t p://www.fast cgi.com /