A WEB programozása - CGI dr.Gál Tibor
CGI programozás
2010. őszi félév
CGI = Common Gateway Interface – általános átjáró felület Hosszú ideig egyetlen lehetőség a weboldalak dinamikus generálására Ma már sokkal hatékonyabb technológiák Röviden érdemes áttekinteni, mivel megkönnyíti a kiszolgáló oldali programozás megértését CGI nem egy programozási nyelv, hanem egy interfész specifikáció: hogyan kell kommunikálni a web kiszolgálóval, azaz hogy kell hivatkozni az elindítandó programra hogyan veheti át a program a böngészőből küldött adatokat milyen formában kell a programnak átadni a böngészőbe elküldendő új weboldalt
Bármilyen programnyelv felhasználható, hogy a CGI-n keresztül kommunikáljunk a kiszolgálóval A CGI-n keresztül kommunikáló programot CGI programnak nevezzük
A cgi-folyamat fázisai
A CGI specifikáció Környezeti változók: az ügyfél böngészőre, a webkiszolgálóra, a protokollra vonatkozó információt és az URL-hez fűzött adatokat (GET metódus) tartalmazzák Lekéréstől független változók SERVER_SOFTWARE, SERVER_NAME, GATEWAY_INTERFACE Lekéréstől függő változók SERVER_PROTOCOL, SERVER_PORT, REQUEST_METHOD, PATH_INFO, SCRIPT_NAME, QUERY_STRING, REMOTE_HOST, CONTENT_TYPE, CONTENT_LENGTH
Szabványos bemenet: a POST metódussal elküldött adatok a szabványos bemenetről (stdin) olvashatók. Pontosabban a kiszolgáló a CGI program által létrehozott gyermekprocessz felé annak szabványos bemenetére küldi el az adatokat. Szabványos kimenet: Az ügyfél felé letöltendő dokumentumot a CGI program a szabványos kimenetén adhatja át a kiszolgálónak. A legtöbb kiszolgáló esetén a kimenet generálását a következő tartalomtípus elküldésével kell kezdeni: Content-type: text/html \n\n Megjegyzés: az IIS és Tomcat esetén ezt nem kell elküldeni
1
A WEB programozása - CGI dr.Gál Tibor A CGI programok helye a WEB kiszolgálókon A böngsző és a kiszolgáló közötti kérelem/válasz menete Legyen a letöltendő URL http://www.aut.bme.hu/varga/intro.html Ekkor a böngésző által elküldött HTTP protokoll szerinti információ a végén egy üres sorral GET /varga/intro.html HTTP/1.0 Accept: text/html Accept: image/gif User-Agent: MSIE 5.0b1 Itt az első sor a legfontosabb: ez közli, hogy milyen fájlt kell elküldeni Ha a kért fájl rendelkezésre áll, akkor a válasz HTTP/1.0 200 OK Date: Tuesday, 12-February-2000 13:12:00 GMT Server: Apache 1.0 MIME-version: text/html Content-Length: 89
2010. őszi félév
A böngsző és a kiszolgáló közötti kérelem/válasz menete GET /varga/intro.html HTTP/1.0 Azaz a letöltendő fájl a varga könyvtárban az intro.html fájl. De ez nem a meghajtó gyökerétől értendő, hanem a kiszolgáló nyilvános dokumentumkönyvtárától kiindulva. Apache kiszolgálónál általában: .../httpd/htdocs/varga IIS kiszolgálóknál általában: ...Inetpub/wwwroot/varga .../webapps/varga Tomcat kiszolgálónál: Meghatározott könyvtárakban, meghatározott kiterjesztésű fájlokat nem letölt, hanem végrehajt a rendszer! Apache kiszolgálónál a default: .../httpd/cgi-bin IIS kiszolgálónál: az Internet Information Services utilitivel konfigurálható
<TITLE>Honlapom Üdvözlöm honlapomon
A Tomcat konfigurálása JavaScript nyelvű CGI programok végrehajtására Windows alatt A $TOMCAT_BASE/server/lib könyvtárban a servlets-cgi.renametojar átnevezése servlets-cgi.jar névbe. (A Tomcat 6.x változatánál már nincs ilyen fájl) A $TOMCAT_BASE/conf/web.xml fájlban a CGI servlet és servlet-mapping elemek körüli comment (piros betűs részek) eltávolítása, s a paraméterek beállítás az alábbiak szerint:
<servlet-name>cgi <servlet-class> org.apache.catalina.servlets.CGIServlet
<param-name>debug <param-value>0 <param-name>executable <param-value>cscript <param-name>cgiPathPrefix <param-value>WEB-INF/cgi 5 --> <servlet-name>cgi
/cgi/* -->
2
A WEB programozása - CGI dr.Gál Tibor
2010. őszi félév
A CGI programozáshoz használt nyelvek Elvileg bármilyen használható Fontos, hogy támogassa a
Ekkor a js kiterjesztésű CGI fájlokat a szerver $TOMCAT_BASE/webapps/ROOT/cgi/ könyvtárában kell elhelyezni, S egy ott elhelyezett valami.js állományra a következő url-lel kell a kliensek felöl hivatkozni: http://ServerCime/cgi/valami.js
Weboldalak generálása az ügyfelek felé Üdvözlet és aktuális idő elküldése http://localhost:8080/cgi/1.js // A szabványos kimenetet reprezentáló objektum létrehozása var stdout = WScript.StdOut; // A dokumentum tartalomtípusának elküldése. // A "Content-Type: text/html\n\n" // sztringet kell legelőször elküldeni a kiszolgáló felé. // A Tomcat esetén azonban ezt nem kell a CGI // programunknak elküldeni. Tehát a következo utasításra // nincs szükség // stdout.WriteLine("Content-Type: text/html\n\n"); // A jelölőelem nyitórészének kiírása a szabványos // kimenetre, azaz a kiszolgáló felé stdout.WriteLine(""); // A dátumobjektum létrehozása, s az üdvözlő szöveg és // a pontos idú elküldése a szabványos kimeneten keresztül // a kiszolgáló felé var d = new Date(); var s = "
Üdvözöllek!
A pontos idő: "+d.getHours()+ " óra "+d.getMinutes()+" perc "+d.getSeconds()+ " másodperc\n"; stdout.WriteLine(s); // A jelöloelem zárórészének kiírása a szabványos // kimenetre, azaz a kiszolgáló felé stdout.WriteLine("");
hatékony szövegfeldolgozást adatbázis kapcsolatot stb.
Mi a JavaScriptet használva mutatjuk be, hogy ne kelljen újabb nyelvet megtanulni.
A fájlt tárolása és az IIS konfigurálása és a hívás Tárolás c:\Inetpub\wwwroot\Mycgi\udvozlet.js IIS konfigurálás az Internet Information Services programmal .js kiterjesztésű programok végrehajtása a cscript.exe programmal Default Web Site Properties → Application Configuration → Mapping .js c:\Windows\system\cscript.exe /c %s %s Hívás
Kattintson ide az udvozlet.js CGI program meghívásához.
A fájlt tárolása és a hívás Tomcat esetén - lásd fentebb
3
A WEB programozása - CGI dr.Gál Tibor Hozzáférések számlálása http://localhost:8080/cgi/szamlalo.js var fso, fr; var ForReading = 1; fso = new ActiveXObject("Scripting.FileSystemObject"); fr = fso.OpenTextFile("counter.txt", ForReading); var cnt =fr.ReadAll(); fr.Close(); cnt = (cnt-0)+1; var fw; fw = fso.CreateTextFile("counter.txt", true); fw.WriteLine(cnt); fw.Close(); var stdout = WScript.StdOut; stdout.Write( "
Ön az oldal " + cnt + ". látogatója"); stdout.Write("");
2010. őszi félév
Hozzáférések számlálása képfájl megjelenítéssel http://localhost:8080/cgi/szamlalo1.js var fso, fr; var ForReading = 1; fso = new ActiveXObject("Scripting.FileSystemObject"); fr = fso.OpenTextFile("counter.txt", ForReading); var cnt =fr.ReadAll(); fr.Close(); cnt = (cnt-0)+1; var fw; fw = fso.CreateTextFile("counter.txt", true); fw.WriteLine(cnt); fw.Close(); var stdout = WScript.StdOut; stdout.Write( "
Ön az oldal "); cnt = "" + cnt; for(i=0; i");
cnt.charAt(i) +
stdout.Write(" . látogatója"); stdout.Write("");
Ügyfél felől érkező adatok olvasása Környezeti változók olvasása http://localhost:8080/cgi/envvar.js var stdout = WScript.StdOut; var WshShell = WScript.CreateObject("WScript.Shell"); var WshProcEnv = WshShell.Environment("PROCESS"); stdout.Write("
Környezeti változók
"); stdout.Write(""); stdout.Write("CONTENT_LENGTH | "); stdout.Write(WshProcEnv("CONTENT_LENGTH") + " |
"); stdout.Write("CONTENT_TYPE | "); stdout.Write(WshProcEnv("CONTENT_TYPE") + " |
"); stdout.Write("QUERY_STRING | "); stdout.Write(WshProcEnv("QUERY_STRING") + " |
"); stdout.Write("REQUEST_METHOD | "); stdout.Write(WshProcEnv("REQUEST_METHOD") + " |
"); stdout.Write("SERVER_PROTOCOL | "); stdout.Write(WshProcEnv("SERVER_PROTOCOL") + " |
"); stdout.Write("HTTP_USER_AGENT | "); stdout.write (WshProcEnv("HTTP_USER_AGENT") + " |
"); stdout.Write("
");
Környezeti változók olvasása, űrlapból hivatkozva http://localhost:8080/envGET.html http://localhost:8080/envPOST.html http://localhost:8080/envGET1.html
4
A WEB programozása - CGI dr.Gál Tibor
2010. őszi félév
Űrlap adatok olvasása a GET paranccsal: a HTML oldal
Űrlap adatok olvasása a GET paranccsal: a CGI program http://localhost:8080/formGET.html
<TITLE>Elso urlap
Űrlap adatok olvasása a GET paranccsal: a kódolt adatok dekódolása a CGI programban (space) + http://localhost:8080/formGET1.html \t %09 var var var var var
str = WshProcEnv("QUERY_STRING"); re = /\+/g; str1 = str.replace(re," "); re1 = /%([0-9a-fA-F][0-9a-fA-F])/g; str = str1.replace(re1, function ($0,$1) { return String.fromCharCode( parseInt($1.charAt(0),16)*16+ parseInt($1.charAt(1),16)); } ); /* Egyszerubben var re = /\+/g; var str1 = str.replace(re," "); var re1 = /(%[0-9a-fA-F][0-9a-fA-F])/g; var str = str1.replace(re1, function ($0,$1) { return unescape($1); } ); */
\n / ~ : ; @ & Á á ...
%0A %2F %7E %3A %3B %40 %26 %C1 %E1
var stdin = WScript.StdIn; var stdout = WScript.StdOut; stdout.Write(""); var WshShell = WScript.CreateObject("WScript.Shell"); var WshProcEnv = WshShell.Environment("PROCESS"); var str = WshProcEnv("QUERY_STRING"); var re = /\+/g; var str = str.replace(re," "); var sArray = str.split("&"); var vezeteknev = sArray[0].split("=")[1]; var keresztnev = sArray[1].split("=")[1]; stdout.Write("
Kedves " + vezeteknev + " " + keresztnev + "
Üdvözlöm WEB kiszolgálómon!"); stdout.Write("
");
Űrlap adatok olvasása POST (a GET esetén is használható)
var stdin = WScript.StdIn; var WshShell = WScript.CreateObject("WScript.Shell"); var WshProcEnv = WshShell.Environment("PROCESS"); var type = WshProcEnv("REQUEST_METHOD"); var str; if(type == "GET") str = WshProcEnv("QUERY_STRING"); else str =stdin.Read(WshProcEnv("CONTENT_LENGTH"));
5
A WEB programozása - CGI dr.Gál Tibor Értékelő rendszer – az űrlap http://localhost:8080/ertekeles.html
<script> function check_and_send() { c = check(document.f.t1.value); if(c==1) {alert('Az els mezo értéke nem 1-5 között van'); return;} c = check(document.f.t2.value); if(c==1) {alert('A második mezo értéke nem 1-5 között van'); return;} c = check(document.f.t3.value); if(c==1) { alert('A harmadik mezo értéke nem 1-5 között van'); return;} document.f.submit(); } function check(str) { if(!(str=='1' || str=='2' || str=='3' ||str=='4‘ || str=='5')) return 1; return 0; }
Értékelő rendszer – az adatokat fogadó CGI program var var var var var var
fso, fw; ForAppending = 8; WshShell = WScript.CreateObject("WScript.Shell"); WshSysEnv = WshShell.Environment("PROCESS"); stdin = WScript.StdIn; str =stdin.Read(WshSysEnv("CONTENT_LENGTH"));
var str1=str.charAt(3)+str.charAt(8)+str.charAt(13); fso = new ActiveXObject("Scripting.FileSystemObject"); fw = fso.OpenTextFile("ertekeles.txt", ForAppending); fw.WriteLine(str1); fw.Close(); fso = null; var stdout = WScript.StdOut; stdout.Write("
" + "Köszönjük, hogy résztvett az értékelésben.
" + "Az értékelések összegzését " + "ide kattintva láthatja. ");
2010. őszi félév
Értékelő rendszer – az űrlap (folytatás) Osztályozza az előadót!
Értékelő rendszer – az eredményt megjelenítő CGI program var fso, fr; var ForReading = 1; fso = WScript.CreateObject("Scripting.FileSystemObject"); fr = fso.OpenTextFile("ertekeles.txt", ForReading); var n = 0; var s1 = 0, s2 = 0, s3 = 0, s; while (!fr.AtEndOfStream){ n++; s = fr.ReadLine(); s1 += (s.charAt(0) - 0); s2 += (s.charAt(1) - 0); s3 += (s.charAt(2) - 0); } fr.Close(); fso = null; s1 /=n; s1 = (s1*100 - s1*100%1)/100; s2 /=n; s2 = (s2*100 - s2*100%1)/100; s3 /=n; s3 = (s3*100 - s3*100%1)/100;
6
A WEB programozása - CGI dr.Gál Tibor
2010. őszi félév
Értékelő rendszer – az eredményt megjelenítő CGI program (folytatás) var stdout = WScript.StdOut; s = "<style type=text/css>" + " td{font-size:18pt;color:white;font-weight:bold;}" + "" + "" + "Az eddigi eredmények értékelése |
" + "A beküldött értékelések száma: | " + "" + n + " |
" + "Az előadó felkészültsége: | " + s1 + " |
" + "Az előadó tárgyi tudása: | " + s2 + " |
" + "Az előadás érthetősége: | " + s3 + " |
" + "
"; stdout.Write(s);
7