Vous êtes sur la page 1sur 26

Developer

ASP Suli
(I. rsz)
Kedves Olvasink! j sorozatot indtunk tjra: bemutatjuk, milyen lehetsgeket biztost a Windows NT / 2000 webkiszolglja, az IIS a dinamikus weboldalak, st, akr teljes webalkalmazsok ksztshez. A jelsz: ASP azaz: Active Server Pages. A cikkben tallhat pldaprogramok megtallhatk a [1] cmen. Egy kis alapozs Amikor annak idejn a HTML-t kitalltk, mg senki sem gondolt arra, mi lesz a dolog vge. A HTML hipertext-lernyelv eredetileg arra val, hogy segtsgvel egyszer dokumentumokat hozzunk ltre, amelyek egyes rszei esetleg hivatkoznak ms dokumentumok rszeire (ez a hiperhivatkozs, hiperlink). Az eredeti HTML nyelv a hivatkozsokon kvl alig nhny elemet tartalmazott, amelyek klnbz szint cmsorok, idzetek, esetleg listk ltrehozst segtettk. A sors fintora, hogy az Internet megjelensvel ppen a HTML lett az internetes kommunikci egyik alapja. (Nincs ezen mit csodlkozni: klnfle adatok s kzttk felptett kapcsolatok lersra volt szksg, s a HTML ppen kapra jtt.) A ma hasznlatos HTML persze mr jcskn tbb, mint egyszer dokumentumler nyelv pontosan annyi kze van az s HTML-hez, mint a mai dokumentumoknak az akkoriakhoz. Rgen az adatok struktrja kpezte az alapot, ma inkbb azok megjelentse. Ahogy telt az id, gy szivrogtak bele a nyelvbe a tartalmat nem, azok megjelentst annl inkbb rint elemek: kpek, tblzatok, keretek (framek), sznek, mretek, bettpusok, kls objektumok, scriptrszletek s ki tudja mg mi minden. A HTML 4-es vltozatt tbbek kztt pontosan azrt alkottk meg, hogy valamelyest (jra) sztvlaszthassuk a tartalmat a megjelentstl, ezzel is cskkentve a HTML oldalak kdjban tallhat nem kis koszt. A tartalom s megjelents sztvlasztsa azta szinte minden terleten hdt, fggetlenl attl, hogy a hlzaton tallhat HTML oldalak nagy rsze a mai napig nem hasznlja ki a HTML 4 lehetsgeit (ksznhet ez egybknt a szabvnyokkal tbb-kevsb hadilbon ll bngsz programoknak is). Mozgsba lendl a kd Az id mlsval egy msik terleten is sokat fejldtt a HTML, illetve annak felhasznlsa. Kezdetben elg volt, ha egy dokumentumot ltrehoztunk, annak tartalma nem, vagy csak ritkn vltozott. Ksbb felmerlt az igny arra, hogy a gyakran vltoz HTML oldalak tartalmt dinamikusan hozzk ltre. Kezdettl kt irnyvonal ltezett, attl fggen, hogy a kiszolglra, vagy pedig a dokumentumot felhasznl gyflprogramra bztk a feladatot. Ez utbbi megolds nem biztos, hogy mkdik (senki sem garantlja, hogy az gyflprogram kpes ezt a feladatot vgrehajtani), radsul tbb szempontbl elnytelen is: ha a cl az, hogy 100 dologbl csak egy valami jelenjen meg az gyfl kpernyjn, felesleges mind a szzat elkldeni neki, majd ott kivlasztani a szksges egyet egyszerbb, biztonsgosabb s olcsbb, ha mr eleve csak a szmra rdekes adatok kerlnek hozz. Ehhez viszont a kiszolglnak kell erfesztseket tennie. A kiszolgloldali megoldsok kzs tulajdonsga, hogy a kiszolgl mindig ksz, feldolgozhat HTML kdot kld az gyflnek a kd tartalma viszont dinamikus, idrl idre vltozik. Magyarn: a cl az, hogy HTML kdot generljunk. A legkzenfekvbb megolds az volt, ha ksz, teljes programokat rtak az egyes feladatok vgrehajtsra. A programok szabvnyos bemeneten (stdin) keresztl kaptk a bemen adatokat, majd a szabvnyos kimeneten (stdout) tovbbtottk az ltaluk ltrehozott kdot. A webkiszolgl s a programok kztti kapcsolatot az n. CGI (Common Gateway Interface) valstotta meg, gy a programok ltszlag a kiszolgl rszeknt mkdtek (s mkdnek ma is). Ezt a mdszert CGI programozsnak nevezzk, s br nhny terleten mg ma is hasznlatos, htrnyai miatt lassan kiszorul. Mert: mit tehetnk, ha azt szeretnnk, hogy a CGI program mostantl ms kdot generljon? Egy: jrarjuk, jrafordtjuk s kicserljk a programot. Brrrr. Kett: Eleve olyan CGI alkalmazst runk, ami a bemen adatok segtsgvel paramterezhet. St, mi lenne, ha a bemen paramter egy valamilyen formban meghatrozott parancssorozat, vagy akr egy valamilyen nyelven megrt script kd lenne? A CGI program azt rtelmezi, vgrehajtja, s visszaadja az eredmnyt ez a megolds a scriptnek ksznheten teljesen dinamikus s brmire hasznlhat lenne s az is. J plda erre a Perl nyelv, ahol a webprogramozs lelke a perl.exe. Bemenete egy Perl nyelven rt script, kimenete pedig a ksz HTML kd. ASP a lthatron A fenti megolds egy kicsit mgis knyelmetlen: milyen j lenne, ha a HTML oldalak ltalban statikus rszt hagyomnyos mdon, akr egy knyelmes WYSIWYG szerkesztvel kszthetnnk, s csak a dinamikus rszt kellene programozni! Az Active Server Pages (ASP) elve pontosan ez: amikor azt mondjuk, ASP, tulajdonkppen egy HTML kdba gyazott, specilis programozsi mdszerrl beszlnk. (Fontos, hogy az ASP nem egy programozsi nyelv, hanem csak egy keretrendszer). Az ASP oldal vgrehajtsakor a webkiszolgl vgigszalad az oldal tartalmn, s ha abban ASP scriptrszletet tall, vgrehajtja. A HTML oldal s a script ltal esetleg visszaadott kdrszletek egyttesen kpezik az eredmnyt, amit azutn az IIS elkld a bngsznek. Lssunk egy pldt:

A Microsoft Magyarorszg szakmai magazinja 2001. 01.

30

Developer

ASP Suli (I. rsz)


nyelvet hasznlja. Ezt kt helyen hatrozhatjuk meg: egyrszt, az adott .asp oldal tetejre rt, gynevezett ASP direktva segtsgvel :
<%@ Language=VBScript %>

<HTML><HEAD><TITLE></TITLE></HEAD> <BODY> <% Response.Write("<center>Hello World!</center>") %> </BODY> </HTML>

A HTML kd belsejben tallhat <% s %> jelzi az ASP kd kezdett s vgt. A kztk tallhat kdrszlet elvileg soha nem jut el az gyflhez, csakis a kd futtatsa sorn keletkez kimenet (ami esetnkben a Response.Write() metdusnak tadott szvegrsz). Az ASP scriptek begyazsnak mdjrl kicsit ksbb mg lesz sz, most lssuk, mi lesz az eredmny:
<HTML><HEAD><TITLE></TITLE></HEAD> <BODY> <center>Hello World!</center> </BODY> </HTML>

Ha pedig ez hinyzik, a kiszolgl a sajt belltsait hasznlja, amit az adott IIS web vagy virtulis knyvtr tulajdonsgai kztt, a Home Directory oldalon, az Application Settings rszben tallhat Configuration gombra kattintva megjelen Application Configuration dialgusablak App Options oldaln, a Default ASP language: mezben llthatunk be. Egyszer, ugye?

Az ASP kd ltal generlt kimenet teht sszemosdott a HTML kddal. Ez j, hiszen rrnk az oldalt teljes egszben elkszteni egy kls, knyelmes HTML szerkesztvel, majd utlag begyazhatjuk az ASP kdot. Egy gondolat az ASP hasznlatrl: mint lthat, az ASP az IIS webkiszolgl rsze. A Windows NT 4.0 Option Pack segtsgvel telepthet Internet Information Server 4.0 (Windows NT 4.0 Workstation-n Personal Web Server) mr tartalmazza az ASP kezelshez szksges komponenseket, amelyek a Windows 2000 IIS5 webkiszolgljban termszetesen alaprtelmezett tartozkok. Ha azt szeretnnk, hogy egy fjlt az IIS tnyleg ASP oldalknt kezeljen, adjunk a fjlnak .asp kiterjesztst (ha ezt nem tesszk, a kd vgrehajts nlkl eljut az gyflhez, mintha a HTML oldal tartalma lenne). Az ASP kdok begyazsa Az ASP scripte(ke)t az oldalba tbb mdon is begyazhatjuk. Lssuk mindenekeltt a HTML szabvnynak megfelel mdot:
<HTML><HEAD><TITLE></TITLE></HEAD> <BODY> <SCRIPT runat="server" language="vbscript"> Response.Write("<center>Hello World!</center>") </SCRIPT> </BODY> </HTML>

Az ASP alkalmazs belltsai az IIS-ben Ha sikerlt megtallnunk ezt a dialgusablakot, jegyezzk meg, hogy jutottunk ide, mert sok ms, fontos bellts is itt tallhat. Az alaprtelmezett kiszolgloldali scriptnyelv egybknt a VBScript. Ezt a nyelvet hasznlja a korbban mr bemutatott, rvidtett formtum is:
<% Response.Write("<center>Hello World!</center>") %>

A <% s %> hasznlata rvidebb s knyelmesebb is, ezrt cikknk tovbbi rszben hacsak kifejezetten nincs szksg msra ezt hasznljuk. Termszetesen egy oldalon bell tbb scriptblokk is szerepelhet. Az ASP oldal tartalmt az IIS ellrl htrafel haladva rtkeli ki, belertve magt a HTML kdot is. Az ASP kd ltal visszaadott kd az eredmnyben ott jelenik meg, ahol maga a script szerepel, pldul a
<p>1<p><% Response.Write("a") %><p>2 <% Response.Write("b") %><p>3

A SCRIPT HTML elem segtsgvel teht ugyangy gyazhatunk be kiszolgloldalon fut kdot, mintha gyfloldali scriptet rnnk csak adjuk meg a runat="server" attribtumot. Hasonlan az gyfloldali megoldshoz, termszetesen kiszolgloldalon sem muszly az oldalon bell megrni a scriptet, megadhatunk fjlnevet is (src attribtum):
<SCRIPT runat="server" src="scfile.vbs">

eredmnye 1a2b3" s nem ab123" vagy 123ab". A fenti pldban lthatjuk azt is, hogy akr soron bell is kszthetnk scriptblokkot (inline script), nem ritka az albbihoz hasonl megolds:
<INPUT type="textbox" value="<% =sTxt %>">

Lthat, hogy itt elhagytuk a scriptnyelv meghatrozst. Ebben az esetben a kiszolgl az alaprtelmezett script-

Ezutn a szvegmezben az sTxt vltoz tartalma jelenik meg. jabb jdonsggal tallkoztunk: a <% utn rt = a Response.Write rvidtse, teht a <%="Hello!"%> egyenrtk a <%Response.Write("Hello!")%> sorral.

31

A Microsoft Magyarorszg szakmai magazinja 2001. 01.

Developer
Mg egy fontos tudnival a tbb rszletben begyazott scriptekrl: nem tilos az sem, hogy a script kzepn egyszer csak tiszta HTML kd jelenjen meg. Ilyenkor az gy viselkedik, mintha a kd rsze lenne, azaz ha az adott szakaszra rkerl a vezrls, az is megjelenik, klnben rejtve marad.
<% For i=1 To 10 %> <center>Hello World!</center> <% Next %>

ASP Suli (I. rsz)

den bngsz gy prbl kapcsoldni a kiszolglhoz, azok pedig ltalban elfogadjk ezt a krst. Alaprtelmezsben gy tesz az IIS is, errl a HTTP Keep-Alives Enabled opci kikapcsolsval beszlhetjk le (ezt az adott IIS web tulajdonsglapjn, a Web Site oldalon talljuk).

A fentiek hatsra pldul a Hello World! felirat tzszer rdik ki, az albbi kdrszlet pedig a csillagok pillanatnyi llstl fggen hol ezt, hol azt mondja (de sosem egyszerre a kettt!):
<% Randomize ' <- Fontos, klnben nem lenne ' vletlen! %> <% If Int(Rnd()*10) > 5 Then %> <center>Kkjszi</center> <% Else %> <center>Bobojsza</center> <% End If %>

A HTTP Keep-Alive kapcsolja az bra aljn lthat A HTTP krs- s vlaszzenet egyarnt hrom f rszbl ll: Parancs, illetve sttuszinformci Fejlcek, metaadatok HTTP tartalom Az els rszben (ami mindig az els sor) krskor a krt parancs, illetve annak paramterei, valamint a verziszm utazik, vlasz esetn pedig a sttusz- vagy hibazenet kdja s lersa. Az ezutn kvetkez fejlcek a kapcsolat s a ksbb kvetkez HTTP tartalom jellemzt tartalmazzk, ezek vizsglatra ksbb rszletesebben kitrnk, hiszen ami gyfl-kiszolgl kommunikci s nem a HTML kd rsze, az valahol itt utazik. Vgl a HTTP tartalom, ami vlasz esetn maga a HTML oldal, vagy mondjuk egy kp tartalma, krs esetn pedig ha van a kiszolglnak sznt bemen adatok tmege. A fejlceket a HTTP tartalomtl egy res sor vlasztja el. Az ASP a HTML tartalom dinamikus ltrehozsa mellett termszetesen lehetv teszi a fejrszben kapott adatok feldolgozst s a vlasz fejrsznek manipullst is. Az ASP objektummodell Az .asp oldalak programozst, a HTTP kommunikci, a webkiszolgl egyes szolgltatsainak elrst kln objektummodell segti. Az ASP objektummodelljnek minden elemt elrhetjk az .asp oldalak kdjaibl. A ksbbiek sorn mindegyik ASP objektumot bemutatjuk rszletesen is, most vessnk egy rpke pillantst a teljes objektummodellre s annak elemeire.
Application objektum Session objektum Request objektum gyfl Response objektum Server objektum IIS Motor

gy nagyszeren szegmentlhatjuk az oldalt. Ha pldul egy ASP oldalon tbb minden jelenhet meg, de nem egyidben, akkor legjobb, ha HTML szerkesztvel ltrehozzuk az oldalt, benne az sszes opcionlis rsszel, majd ezeket a rszeket utlag krbeptjk scripttel, ami majd eldnti, hogy az adott szakasz ltsszon-e vagy sem. Br a <% s a %> nem szerepelnek a HTML szabvnyban, mi btran hasznljuk, hiszen ezek a jelek soha nem hagyjk el a kiszolglt. Ha az ASP script ltal generlt kimen kd HTML-kompatbilis, nyugodtak lehetnk abban, hogy mi minden tlnk telhett megtettnk a szabvnyos kommunikci rdekben. gyfl-kiszolgl kommunikci: a HTTP protokoll A HTML oldalak szmtgpek kztti tovbbtshoz ki kellett dolgozni egy adattviteli szabvnyt. Ez lett a HTTP, azaz Hypertext Transfer Protocol. A HTTP nem ms, mint egy jl definilt gyfl-kiszolgl kommunikci, amit most a jobb megrts kedvrt kicsit zekre szabdalunk. A HTTP kommunikcit az gyfl kezdemnyezi: hlzati kapcsolatot ltest a kiszolglval s kzli vele ignyeit: ez a HTTP krs (HTTP Request). A krsre a kiszolgl vlaszt kld (HTTP Response), majd az eredeti definci szerint megszaktja a kapcsolatot s szksg esetn minden kezddik ellrl. A kapcsolat megszaktsra eredetileg azrt volt szksg, hogy a fenntartott, hasznlaton kvli kapcsolatok ne terheljk feleslegesen a kiszolglt. Manapsg azonban ms a helyzet: egy HTML oldalon kpek, objektumok tmege lehet, gy elvileg kln kapcsolatot kell felpteni elszr a HTML kd, majd ksbb minden egyes begyazott kp s objektum letltshez, s ma bizony ppen az jabb hlzati kapcsolatok ltrehozsa az, ami tlterhelheti a kiszolglt (radsul ez nem is igazn hatkony). Ezrt a HTTP 1.1 verzijban bevezettk a Keep-Alive opcit, amiben ha az gyfl s a kiszolgl megegyezik, a kapcsolat nem bomlik le azonnal (magyarul egy kapcsolat sorn tbb krs s vlasz is elhangozhat). Ha brki hibt szlel, termszetesen azonnal bontjk a kapcsolatot. Ma mr szinte min-

Session objektum Request objektum Response objektum gyfl ASP Error objektum

Az ASP objektummodellje

A Microsoft Magyarorszg szakmai magazinja 2001. 01.

32

Developer

ASP Suli (I. rsz)


s boff.asp pldaprogramok segtsgvel mindenki kiprblhatja. A Clear() metdus kirti a puffert (Legynk vatosak! A kls HTML kd is a pufferbe kerl, trlskor az is elveszik!), a Flush() pedig elkldi azt, ami addig a pufferbe kerlt, majd csak azutn trli a tartalmt. E kt metdust a bflush.asp s bclear.asp pldaprogramokban mutatjuk be. Az oldal feldolgozst brmikor megszakthatjuk a Response.End() meghvsval. Ha az oldal vgrehajtsa befejezdik, termszetesen a puffer teljes tartalma az gyflhez kerl. Ha nyom nlkl szeretnnk befejezni a tnykedsnket, az End() meghvsa eltt hasznljuk a Response.Clear() metdust. HTTP fejlcek kldse A HTTP vlasz a tartalom mellett szmos HTTP fejlcet is tartalmaz. Mi magunk is kldhetnk ilyen fejlcet a Response.AddHeader() metdus segtsgvel:
<% Response.AddHeader("MyHeader", "MyData") %>

Ha a tranzakcis mveletekhez hasznlt ObjectContext objektumot nem szmtjuk, az objektummodell hat (Windows NT 4.0-n t) objektumbl ll. A Windows 2000-ben megjelent j objektum az ASPError, ami egy bekvetkezett hiba lerst tartalmazza, az .asp-be gyazott, sajt hibakezelst segti. A Server objektum magt az IIS-t kpviseli, nhny kiszolglszint belltssal s szolgltatssal. Az Application objektum egy webalkalmazst jelkpez. A webalkalmazs klnll egysg, ltalban egy knyvtrban s annak alknyvtraiban tallhat .asp kdok sszessge, kzs objektumokkal s belltsokkal. A Session objektum egy gyfl s a kiszolgl kztt fennll kapcsolatot, munkamenetet jelkpez. A fennll kapcsolatot azrt rtuk gy, mert valjban nem egy kapcsolatrl van sz. Az IIS (a httrben cookie-k segtsgvel) azonostja a felhasznlt s a bngszt, gy az a bngsz bezrsig sajt munkamenetbe trhet vissza. A Request objektum egy HTTP krst jelkpez, segtsgvel kdbl hozzfrhetnk a krs minden elemhez, legyen az HTTP fejlc rtke, a bngszben trolt cookie, vagy krdv tartama. A Response objektum pedig rtelemszeren a krdsre kldend vlaszt jelkpezi. Termszetesen a Response objektum segtsgvel sem csak a vlasz tartalmt, hanem a HTTP protokoll fejrszt is kezelhetjk. Egy IIS kiszolgln bell Server s ASPError objektumbl egy-egy ltezik (utbbi csak akkor rhet el, ha hiba trtnt). Application objektum minden webalkalmazs egyedi, globlis objektuma, Session objektum minden munkamenethez (gyflhez) egy jn ltre, egyidejleg teht tbb is ltezhet. Request s Response objektum pedig mindig az adott krsre s vlaszra vonatkozik, jabb krs esetn j pldny jn ltre bellk is. Egy HTTP vlasz a Response objektum Kezdjk a vgn: a Response objektummal, ami egy HTTP krsre adott vlaszt hivatott jelkpezni. A Response objektum legegyszerbb (s leggyakoribb) alkalmazst mr lthattuk korbban: a Response.Write() metdus segtsgvel lltottuk el az oldal tartalmt. A Write() hasznlata egyszer: minden, amit paramterknt tadunk neki, bekerl a vlaszknt visszakldtt adatcsomagba. A Write() metdusrl egyetlen dolgot kell tudni: a kirt szveg nem tartalmazhatja a %> jelsorozatot, helyette ezt kell rni: %\> Az ezt tartalmaz szveget IIS automatikusan visszaalaktja majd az eredeti formra. A vlaszpuffer Az .asp oldal ellltsa termszetesen tbb lpsben trtnik, az oldalban tallhat scripttl fggen elfordulhat az is, hogy az oldal tartalmnak egy rsze csak bizonyos vrakozsi id utn ll rendelkezsre. Ilyenkor dnthetnk, hogy a mr ksz tartalmat elkldjk-e az gyflnek, majd vrunk a folytatsra, vagy kivrjuk, amg a teljes oldal elkszl, s csak a munka legvgn kldjk a komplett vlaszt. Ez utbbi esetben a kimenet egy pufferbe kerl. A pufferels az IIS5-ben alaprtelmezsben mkdik, mg az IIS4-ben alaprtelmezsben ki van kapcsolva. A Response objektum segtsgvel mi magunk is kezelhetjk a puffert: mindenekeltt, a Response.Buffer property-nek False rtket adva letilthatjuk, True segtsgvel pedig engedlyezhetjk a puffer hasznlatt. A pufferels hatst a bon.asp

A metdus kt argumentuma a fejlc neve s rtke termszetesen a fentinl rtelmesebb clra is felhasznlhatjuk. Szmos dolog van, ami kzvetlenl programozhat a Response objektumon keresztl s vgs soron egy-egy HTTP fejlc elkldshez vezet (a Response.ContentType property belltsa pl. egy Content-Type HTTP fejlcet kld, stb.), de elfordulhat, hogy olyasmit kell hasznlnunk, ami nincs gy kivezetve. A pufferels befolysolja a HTTP fejlcek hasznlatt, kikapcsolt puffer esetn HTTP fejlcet termszetesen csak az oldal tartalma eltt kldhetnk, teht a Response.AddHeader() metdus ekkor csak az .asp oldal elejn (az ASP direktvk utn) llhat. Fontos tudni, hogy egy fejlc mr nem vonhat vissza: amit egyszer ltrehoztunk, az a vlaszban mr benne lesz, mg akkor is, ha trljk a vlaszpuffert. Tartalom s karakterkszlet A HTTP vlasz sokfle tartalmat hordozhat magban. Egyltaln nem egyrtelm pldul, hogy egy HTML dokumentum milyen karakterkszlettel rdott. St, mg az sem biztos, hogy a vlasz egy HTML oldal. Response.Charset = az oldalban hasznlt karakterkszlet, kdtbla. Ha normlis magyar betket is hasznlni szeretnnk, lltsuk ISO-8859-2"-re. Termszetesen ugyanezt HTML-bl, a <META> elem segtsgvel is megtehetjk, az albbi kt plda teht egyenrang (habr a fejlcben belltott karakterkszlet ltalban fellbrlja a HTML-ben meghatrozottat ez a bngszn mlik):
<% Response.Charset = "ISO-8859-2" %>

<HTML><HEAD> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-2"> </HEAD> ...

Response.ContentType = a vlasz MIME tpusa (a tartalom

33

A Microsoft Magyarorszg szakmai magazinja 2001. 01.

Developer
tpusa). HTML (s .asp) oldal esetn az rtke text/html", ha nem lltjuk be, ez az alaprtelmezs is. Ennek a jellemznek az rtkt akkor rdemes mdostani, ha a visszakldtt tartalom nem HTML, hanem mondjuk egy kpfjl, mint albb (sendpic.asp):
<% Set oStream = Server.CreateObject("ADODB.Stream") oStream.Type = 1 ' adTypeBinary oStream.Open oStream.LoadFromFile(Server.MapPath("ms.jpg")) %>

ASP Suli (I. rsz)

Visszatrve az ASP-hez, a fenti belltst kdbl a kvetkez mdon rhetjk el:


<% Response.Pics( "PICS-1.0 ""http://www.rsac.org/ ratingsv01.html"" l by ""[mICK]"" on ""2001. 01.08T21:26+0100"" exp ""2002.01.08T12:00 +0100"" r (v 3 s 0 n 0 l 0))" )

gy belegondolva, taln mgis egyszerbb, ha a grafikus felleten belltjuk :-) HTTP sttusz s tirnyts Response.Status = A HTTP vlasz sttuszzenett (ami, ha minden rendben ment, 200 OK) mdosthatjuk itt. A sttuszzeneteket a HTTP szabvny definilja, s mivel a legtbb funkci ms mdon is elrhet a Response objektumon keresztl, ezt a megoldst viszonylag ritkn hasznljuk. Hogy mgse maradjunk plda nlkl, lssunk egy tirnytst (red0.asp):
<% Response.Status = "302 Object Moved"

Response.ContentType = "image/jpeg" Response.BinaryWrite( oStream.Read ) %>

A fent hasznlt Response.BinaryWrite() metdus hasonl a .Write()-hoz, a klnbsg csak annyi, hogy ez binrisan, minden megkts s konverzi nlkl rja a kimenetre az adatokat. A Server objektum MapPath() metdusrl ksbb lesz sz, a lnyege az, hogy egy relatv fjlnvbl ellltja a fjl fizikai elrsi tjt a webkiszolgln. rdemes megfigyelni az elz pldaprogramot. Az ott hasznlt ADODB.Stream objektum segtsgvel binrisan is rhatjuk/olvashatjuk a fjlokat, vagy ms adatokat (termszetesen adatbzis-mezket is), mg a FileSystemObject objektum egyelre csak szvegfjlok kezelsre kpes. A Stream objektum az ADO 2.5-s vltozattl ltezik, ezrt elfordulhat, hogy hasznlata eltt teleptennk kell a Microsoft Data Access Components (MDAC) legjabb verzijt, ami letlthet a [2] cmrl. Egy nlunk mg sajnos elhanyagolt jellemz maradt utoljra: a Response.Pics jellemz rtke jelezheti, hogy egy adott oldal milyen mrtkben s mennyisgben tartalmaz erszakra, szexre, meztelensgre s csnya nyelvre utal jeleket. Ha ez az gynevezett PICS-Label (ami egybknt nem ms, mint egy specilis HTTP fejlc) utazik az oldallal, a szrk kpesek lennnek kivlogatni a gyerekszobba nem val tartalmat ismtlem, ehhez az kellene, hogy minden webkiszolgl sszes tartalmt minstse valaki. Ez az IIS belltsoknl egybknt webhelyenknt, knyvtranknt, vagy akr fjlonknt is bellthat:

Response.AddHeader "Location", "http://www.microsoft.com" %>

A fenti kdrszlet egyenrang az albbival (red1.asp):


<% Response.Redirect("http://www.microsoft.com") %>

A Response.Redirect() metdus teht az gyfl krsnek azonnali tirnytsra val. A 302-es kd HTTP zenetnek (teht az tirnytsnak) egyetlen htrnya van: nhny proxy bizonyos krlmnyek kztt nem hajtja vgre az automatikus tirnytst, hanem ronda Object moved hibazenetet kld vissza a bngszbe. Ez akkor kvetkezhet be, ha az tirnyts mellett az adott oldal HTML tartalommal is br (magyarul, ha a vlaszban nem csak az tirnyt fejlcek szerepelnek, hanem ms is). Hrom megolds knlkozik: Redirect() eltt rtsk ki a puffert (Clear() metdus), vagy eleve ne rjunk bele semmit (a Redirect() az oldal elejn szerepeljen) Ha kiszolgln bell kell tirnytani, akkor hasznljuk inkbb a Server objektum Transfer metdust (IIS5-tl), ami kiszolgln belli tirnytst vgez anlkl, hogy az gyfl errl tudomst szerezne Hasznljuk a HTML-ben gyakori tirnytsi mdszert, ilyenkor maga a bngsz kezd automatikus letltsbe, ami radsul idzthet:
<META http-equiv="refresh" content="0;URL=http://www.microsoft.com/">

Egy weboldal PICS-minstse

A fenti pldban az idzts 0, azaz a bngsz azonnal belekezd az j cm letltsbe. A <META> elemet a HTML oldal fejrszbe helyezzk el (ld. red2.asp).

A Microsoft Magyarorszg szakmai magazinja 2001. 01.

34

Developer

ASP Suli (I. rsz)


mtott lejrati idt jelenti (percben), mg az utbbinak konkrt idpontot adhatunk meg, pl.:
<% Response.ExpiresAbsolute= #May 31,2001 13:30:15# %>

Van itt valaki? Ha egy oldal ellltsa sokig tart, vagy a webkiszolgl tlterhelt, elfordulhat, hogy a krs kiszolglsa kzben (vagy eltt) az gyfl megunja a vrakozst s tovbbll. Az ilyenkor elvgzett munka krba vsz mg szerencse, hogy szksg esetn ellenrizhetjk, nem hiba dolgozunke. Ha a Response.IsClientConnected property rtke hamis, nyugodtan befejezhetjk a feldolgozst, ha viszont igaz, rdemes mg dolgozni. Termszetesen felesleges minden sor eltt ellenrizni, ltalban csak hossz vgrehajtsi idej oldalaknl van erre szksg, akkor is csak idkznknt nehogy tbbe kerljn a leves, mint a hs. Az IIS5 olyan komolyan veszi ezt, hogy minden krs feldolgozsa esetn ellenrzi, hogy a krs mennyi ideje rkezett. Ha a kiszolgl tlterhelt, s a krs tbb mint hrom msodperce vrakozik, ellenrzi, hogy megvan-e mg az gyfl, s csak akkor kezd bele a vgrehajtsba, ha van kinek elkldeni a vlaszt. Az IIS4 kicsit felems mdon viselkedik az .IsClientConnected jellemz kirtkelsekor. Ha az oldalunk ilyen kiszolgln fut, tudnunk kell, hogy az .IsClientConnected csak akkor hasznlhat biztonsgosan, ha az oldalbl valamit mr elkldtnk az gyflnek (ha pldul a pufferelst bekapcsoltuk, csak a Flush() meghvsa utn szmthatunk helyes eredmnyre). Gyorsttrak minden szinten a cache Mi lenne velnk, ha nem lennnek gyorsttrak? A hlzati kapcsolatok lelassulnnak, ruk az egekbe szkne (igen, lenne mg hova :-) ), az Internet-szolgltatk bedugulnnak. (Felszabadulna nhny szz megabjt a merevlemeznkn :-) ). Ez senkinek sem lenne j. Mg szerencse, hogy ugyanarra a tartalomra sokan, sokszor kvncsiak, s nem szksges a dolgokat jra s jra ltrehozni s letlteni az eredeti szrmazsi helykrl. Gyorsttrat alkalmaz a bngsznk, sajt gyorsttrbl dolgozik az Internet-szolgltat, gynevezett reverse-cache segti a webkiszolglkat a krsek gyors kiszolglsban. ltalnossgban elmondhatjuk, hogy szerencsre aki tud, tartalkolja a dolgokat, htha ksbb mg szksg lehet r. Ezzel ltalban nincs is baj, de lehetnek dolgok, amelyeket felesleges elmenteni, mert a nevk, esetleg mretk hiba vltozatlan, tartalmuk gyakran eltr. Kell-e jobb plda erre, mint a dinamikusan ltrehozott weboldalak? Ugye, nem? Szerencsre a gyorsttrak tbbsge tvirnythat a tartalom nmaga hordozhat olyan jeleket, amiket felismerve a gyorsttr nem prblkozik a trolsval. Ilyen jelek (termszetesen HTTP fejlcek) ltrehozsban segt neknk a Response objektum albbi nhny szolgltatsa: Response.CacheControl = Az oldal trolsnak szablyai. Ha rtke private, akkor proxy kiszolglk nem, csak s kizrlag privt, bngszbeli gyorsttrak trolhatjk az adatokat. Ez az alaprtelmezs is. Ha a jellemz rtke public, akkor az oldalt brmelyik proxy kiszolgl trolhatja. Ha azt szeretnnk, hogy egyltaln senki ne trolja az oldalunkat, a property-nek adjuk ezt az rtket: no-cache. Termszetesen semmi sem tart rkk: mg ha trolunk is valamit, idnknt rdemes frissteni. Minden trolt tartalomnak van egy lejrati ideje, amit mi magunk llthatunk be a Response.Expires s Response.ExpiresAbsolute jellemzk segtsgvel. Az elbbi az adott pillanattl sz-

Az oldal trolst elkerlhetjk gy is, ha a lejrati idt -1-re lltjuk:


<% Response.Expires = -1 %>

Rgebbi, a HTTP 1.1 szabvnnyal nem kompatbilis kiszolglk nem rtelmezik a CacheControl rtkt, ezrt nha specilis HTTP fejlcre van szksg:
<% Response.AddHeader "Pragma", "no-cache" %>

A legbiztonsgosabb termszetesen az, ha mindhrom mdszert (CacheControl, Expires, Pragma) kombinljuk. Ha nem akarunk ASP-t hasznlni, ezt a szoksos mdon, <META> elemek segtsgvel tisztn HTML-bl is megtehetjk:
<META HTTP-EQUIV="CacheControl" CONTENT="no-cache"> <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> <META HTTP-EQUIV="Expires" CONTENT="-1">

HTTP krs a Request objektum Adatklds a HTTP protokoll segtsgvel A dinamizmus, az interaktivits egyik mozgatrugja termszetesen az, ha menet kzben adatokat kapunk az gyfl oldalrl. Ezeket az adatokat a Request objektum segtsgvel rhetjk el. Adatok tadsa az URL-ben (QueryString) A klasszikus adatbeviteli mdszer, amikor az adatokat a krs URL-jhez csatoljuk, ilymdon:
http://localhost/qs.asp?input1=val1&input2=val2

Ekkor ilyen HTTP krs indul a kiszolgl fel:


GET /request.asp?input1=value1&input2=value2& submit=Submit HTTP/1.1

Ennek a mdszernek tbb htrnya is van: egyrszt, a bemen adatok nvelik az URL hosszt, a kiszolglnak elkldhet URL-ek mrete pedig biztonsgi okokbl ltalban korltozva van. (Prbljunk meg az IIS-nek elkldeni egy tbbszz bjt hossz cmet! A vlasz szabvnyos HTTP hibazenet: 404 Request URI too long"). Msrszt nemcsak knyelmetlen, de nem is igazn biztonsgos, hogy az tadott adatok (amelyeket esetleg nem is mi rtunk be, hanem mondjuk egy krdv rejtett rszei voltak) megjelennek a bngsz cmsorban. Az tadott adatmezk nv=adat formjak (ld. fent: input1=val1), az egyes adatmezket & jel vlasztja el egymstl, az egszet pedig krdjel a fjlnvtl. Egy adott mez rtkt a Request.QueryString(meznv) fggvny adja vissza. Ha az adatok kztt ilyen mez nem szerepel, a visszaadott rtk (). A qs.asp fjl az albbi kdrszletet tartalmazza:

35

A Microsoft Magyarorszg szakmai magazinja 2001. 01.

Developer
<% If Len( Request.QueryString("nev") ) Then Response.Write( "Szia " & Request.QueryString("nev") & "!" ) End If %>

ASP Suli (I. rsz)

POST /request.asp HTTP/1.1 Content-Type: application/x-www-form-urlencoded Content-Length: 41 Connection: Keep-Alive input1=value1&input2=value2&submit=Submit

Ha nevnket megadjuk az URL-ben (pl. qs.asp?nev=mick), akkor az oldal illenden ksznt minket. Egy mez megltt a legegyszerbben gy ellenrizhetjk, ha lekrdezzk a hosszt (ezt teszi a Len() fggvny a pldban). Ha ez nem 0, lehet dolgozni. Egy meznek azonban nem csak egy rtke lehet, a HTTP krsben egy meznv egynl tbbszr is szerepelhet:
http://localhost/qs2.asp?nev=Piroska&nev=Farkas

Lthatjuk, hogy a kiszolglnak sznt adatok nem a POST parancs paramterben, hanem a HTTP zenet trzsrszben utaznak. rdemes megfigyelni a trzs kdolsra vonatkoz Content-Type HTTP fejlc rtkt is. s itt lljunk meg egy szra! Aki ismeri a HTML nyelvet, az tudhatja, hogy a HTML krdv elemnek (FORM) method attribtuma hatrozza meg az adatok kldsnek mdjt. Ha a method attribtum rtke get, a krdv tartalmt az URLbe gyazva, ha viszont az attribtum rtke post, akkor a HTTP krs trzsben kldi el a bngsz a kiszolglnak. A form.asp pldaprogrammal brki kiprblhatja a klnbsget. Lehetsg szerint hasznljuk teht a post mdot! A krdv egyes mezinek rtkt a Request.Form kollekci tartalmazza. Az elz pldhoz hasonlan minden mez rtkt lekrdezhetjk, ha a meznek tbb rtke van, akkor itt is hasznlhatjuk a .Count jellemzt s az indexeket is, pl.:
Request.Form("nev") Request.Form("nev").Count Request.Form("nev")(5)

A qs2.asp fjlban lthat, hogyan lehet ezt feldolgozni:


<% Response.Write("Nevek szma: " & Request.QueryString("nev").Count & "<br>") For i=1 To Request.QueryString("nev").Count Response.Write( i & ": " & Request.QueryString("nev")(i) & "<br>") Next %>

A Request.QueryString(meznv).Count rtk visszaadja az adott nev mezk szmt. Ha a sok kzl egy konkrt rtkre vagyunk kvncsiak, akkor tadhatjuk az indexet is (a szmozs 1-tl kezddik). Maradjunk a fenti pldnl, a Farkas-ra gy hivatkozhatunk:
Request.QueryString("nev")(2)

rdekessg: Krdv feldolgozsa esetn a Submit nyomgomb rtke (felirata) is eljut a kiszolglhoz, de ha tbb ilyen van, akkor csak annak az egynek, amelyikre kattintottunk. gy megtehetjk azt, hogy ha egy krdvbe kt Submit nyomgombot tesznk:
<INPUT type="submit" name="submit" value="Egyl">

Ha egy meznek tbb rtke van, s mi mgis kzvetlenl krdezzk le (pl. Request.QueryString(nev")), akkor az rtkek vesszvel elvlasztott listjt kapjuk vlaszknt: Piroska, Farkas. Ha pedig egyszeren csak Request.QueryStringre hivatkozunk, akkor visszakapjuk a teljes krdst: nev=Piroska&nev=Farkas. Ez volt teht az URL-be gyazott lekrdezs feldolgozsa. Egy fontos s sokszor zavar tnyezre mg szeretnm felhvni a figyelmet: az URL-ek formtuma kttt, s mivel a lekrdezs (s fleg az tadott adatok) ilyenkor az URL rszt kpezik, ezeknek az adatoknak is meg kell felelnik bizonyos szablyoknak: pldul, minden rsjel, neadj Isten kezetes karakter csakis kdolt formban (pl. egyenlsgjel: %3D) szerepelhet az URL-ben. Ez a kdols pedig sokszor krlmnyes s knyelmetlen. Adatfeltlts a POST HTTP paranccsal Szerencsre a HTTP protokoll tartalmaz egy, a fentinl fejlettebb megoldst is. A POST parancs hasznlata esetn a feltltend adatok a HTTP zenet trzsrszbe kerlnek. Az adatok kdolst persze gy sem sszuk meg, de az esetek tbbsgben ezt a munkt nem mi, hanem a bngsz vgzi. Krdv (Form) kitltse esetn pldul, ha a FORM elem method attribtumt postra lltottuk, a kvetkez krs indul a kiszolgl fel:

<INPUT type="submit" name="submit" value="Igyl">

a feldolgozskor knnyen kitallhatjuk, mit szeretne a kedves gyfl:


<% If Request.Form("submit") = "Egyl" Then Eszem Else Iszom End If %>

A For Each utasts segtsgvel (a tbbi kollekcihoz hasonlan) a .Form kollekci elemeit is kilistzhatjuk (ld. request.asp):
<% For Each mezo In Request.Form a mezo-be a mezonev kerul Response.Write( "<b>" & mezo & " = </b>" & Request.Form(mezo) & "<br>" ) Next %>

A Microsoft Magyarorszg szakmai magazinja 2001. 01.

36

Developer

ASP Suli (I. rsz)


cookie egyszer szveg, vagy almezk gyjtemnye, s ettl fggen kezelhetjk is:
<% If Request.Cookies("nev").HasKeys Then

A HTTP tartalom kiolvassa Nem ktelez a Request objektum kollekciira tmaszkodnunk, ha ki szeretnnk olvasni a HTTP krs trzsben elkldtt adatokat:
<% bytes = Request.TotalBytes data = Request.BinaryRead(bytes) %>

For Each mezo In Request.Cookies("nev") Response.Write( Request.Cookies("nev")(mezo)) Next Else Response.Write( Request.Cookies("nev") )

A Request.TotalBytes jellemz visszaadja a trzsben tallhat adatok mrett, a Request.BinaryRead() metdus pedig adott mennyisg adatot olvas be, termszetesen minden talakts s konverzi nlkl. Fontos! A Request.BinaryRead() metdus hasznlata utn mr nem hasznlhatjuk a Request.Form kollekcit, s fordtva: ha a Request.Form-hoz mr hozznyltunk, a Request.BinaryRead() mr hibt okoz. Cookie Szleink azt tantottk, hogy idegenektl ne fogadjunk el dessget. n most mgis azt mondom, ebben az egy esetben kivtelt tehetnk. A cookie kis adatcsomag, amit a kiszolgl krsre a bngsz az gyfl szmtgpn trol, s szksg esetn visszakldi azt. Alapjban vve kt klnbz tpus cookie ltezik: az els tpus csak addig l, amg a bngszvel egy kiszolglnl tartzkodunk. A bngsz bezrsval az ilyen cookie tartalma elveszik. Ezeket a cookie-kat elssorban tmeneti clra hasznljuk (pldul az ASP Session fenntartsra). A msik fajta, felhasznli szemmel gyakrabban megfigyelt cookie annyiban klnbzik az elztl, hogy a bngsz bezrsakor nem veszik el, hanem a szmtgp lemezre kerl. Az ilyen cookie-knak rvnyessgi idejk van. Amg ez az rvnyessgi id le nem jr, addig a bngsz megrzi az rtkket, s tartalmukat minden egyes ltogatskor visszakldi a kiszolglnak. A kt cookie-fajtt csak a lejrati id klnbzteti meg egymstl. Lssuk teht, hogyan kldhetnk egyszer, tmeneti clra hasznlhat cookie-t a bngsznek:
<% Response.Cookies("nev") = "ertek" %>

End If %>

A .HasKeys elrhet a Response objektumon keresztl is. Erre azrt van szksg, mert ha egy szveges tpus cookieban almezket hozunk ltre, elveszik a szveges rtk s fordtva, ha almezkkel rendelkez cookie-nak szveges rtket adnnk, elvesznnek az almezk s azok rtkei. A cookie rvnyessgt a Response objektum segtsgvel korltozhatjuk idben s trben:
<% Response.Cookies("nev").Expires = "01-Jan-2003" Response.Cookies("nev").Domain = ".netacademia.net" Response.Cookies("nev").Path = "/dir1/dir2" %>

Az .Expires jellemz rtke hatrozza meg, hogy az cookie meddig marad letben. Ha nem adjuk meg, a bngsz lezrsakor elveszik. A .Domain jellemz segtsgvel bellthatjuk, hogy a bngsz milyen domainek elrse esetn kldje vissza a cookie-t. A .Path pedig kiszolgln belli rszletezst jelent: ha kt azonos nev cookie ltezik, ugyanarra a domain-re, akkor annak az rtkt fogjuk visszakapni, ahol a .Path rtke kzelebb van a valsghoz. Ha teht az oldal a /dir1/dir2 knyvtrak mlyn tallhat, a kt cookie .Path rtke pedig a /dir1 s a /dir1/dir2, akkor az utbbit fogjuk viszontltni. Ha azt szeretnnk, hogy egy cookie az adott pillanattl szmtott egy vig legyen rvnyes, hasznljuk a DateAdd() s a Now fggvnyt:
<%

Ha a felhasznl legkzelebb felnk jr, ezt az adatot gy olvashatjuk ki:


%> <% s = Request.Cookies("nev") %>

Response.Cookies("egyevigjo").Expires = DateAdd( "yyyy", 1, Now)

Flp Mikls mick@netacademia.net

Egy cookie nem csak egy szveget tartalmazhat, hanem tbbet is, egyfajta tblzatot, almezket:
<% Response.Cookies("nev")("mezo1") = "ertek1" Response.Cookies("nev")("mezo2") = "ertek2" %>

A cikkben tallhat URL-ek: [1] http://technet.netacademia.net/feladatok/asp/1 [2] http://www.microsoft.com/data ASP objektummodell-referencia a weben: http://msdn.microsoft.com/library/psdk/iisref/vbob74bw.htm

A .HasKeys metdus segtsgvel eldnthetjk, hogy egy

37

A Microsoft Magyarorszg szakmai magazinja 2001. 01.

Developer

ASP suli 2.
Elz szmunkban bekacsintottunk az ASP alapjaiba, szemgyre vettk a kt taln legfontosabb objektumot, a HTTP krst s vlaszt jelkpez Request-et s Response-ot. Akkor kimaradt nhny dolog, ezrt most folytassuk ott, ahol egy hnappal ezeltt abbahagytuk, azutn pedig rvid mese kvetkezik az ASP Session mibenltrl. E szmunk pldaprogramjai termszetesen megtallhatk a [1] cmen. rjunk az IIS napljba! gy van, rhatunk, ha nagyon akarunk, de krltekintnek kell lennnk. A Response.AppendToLog() metdusnak tadott szvegrsz bekerl az IIS naplfjljba (teht nem az Esemnynaplba!). A szveg nem tartalmazhat vesszt, mert a naplfjl egyes mezit vesszk vlasztjk el, s ez megzavarhatn a naplk ksbbi feldolgozst. A bejegyzs csak akkor kerl be a naplba, ha az IIS naplzs belltsai kztt bekattintottuk az URI Query mezt. za ennek lehetsgt is, s az sem ktsges, hogy a felhasznlnevet s jelszt kr kis ablakkal mr mindannyian tallkoztunk. De vajon tudjuk-e, mi zajlik ilyenkor a httrben? Elszr is, a bngsz egy hagyomnyos krst kld a kiszolglnak. Amikor az alaprtelmezett anonymous felhasznl (aki az IIS esetn egybknt megfelel az IUSR_szmtgpnv felhasznlnak) nem jogosult egy krt erforrs elrsre, a kiszolgl egy 401 Unauthorized zenettel vlaszol:
HTTP/1.1 401 Unauthorized Server: Microsoft-IIS/5.0 Date: Mon, 05 Feb 2001 21:05:25 GMT WWW-Authenticate: Negotiate WWW-Authenticate: NTLM WWW-Authenticate: Basic realm="localhost" Content-Length: 0 Content-Type: text/html Cache-control: private

A sikeres egyedi naplbejegyzs kulcsa az URI Query mez engedlyezse Bnjunk vatosan ezzel a lehetsggel. Ha az IIS naplja W3C vagy NCSA formtumban kszl, az ltalunk tadott szveg a naplban a krt URL helyn (W3C formtum esetn), vagy ahhoz hozzfzve (NCSA) jelenik meg. Ennek nyilvnvalan sok rtelme nincsen, ezrt n azt javaslom, hogy az ilyen bejegyzseket rjuk inkbb szvegfjlba, vagy ha mindenkppen ennl a megoldsnl akarunk maradni hasznljuk a Microsoft IIS naplformtumot. Felhasznlazonosts nvvel s jelszval A webkiszolgl tartalmnak elrst sokszor korltozni szeretnnk. Szp dolog a szabadsg, de elfordulhat, hogy bizonyos adatokhoz val hozzfrs eltt szksg van a felhasznlk azonostsra. A HTTP termszetesen magban hordoz-

A lnyeg az alhzott sorokban van: mindenekeltt, termszetesen a legfontosabb a 401-es kd HTTP vlaszzenet, ami azt jelzi az gyflnek, hogy a hozzfrst megtagadtuk. A WWW-Authenticate HTTP fejlcek a lehetsges felhasznlazonostsi mdszereket jelzik. Ezekbl termszetesen tbb is van, br az Internet Explorer kivtelvel szinte mindegyik bngsz csak a Basic azonostst ismeri. A Basic azonostssal viszont kt nagy baj van: 1. A Basic felhasznlazonosts sorn a jelsz kdolatlanul utazik a hlzaton mindaddig, amig valamilyen kiegszt megoldssal (pl. https://) ezt t nem hidaljuk 2. Az IIS5 alaprtelmezsben nem engedlyezi a Basic tpus azonostst; ez termszetesen azt jelenti, hogy az Internet Explorer-en kvl ms bngszvel csak az anonymous ltal egybknt is elrhet oldalakhoz frhetnk hozz. A hasznlhat felhasznlazonostsi mdszerek listjt s belltsait az adott webhely tulajdonsglapjn, a Directory Security fln, az Anonymous access and authentication control mezben tallhat Edit gombra kattintva megjelen dialgusablakban talljuk:

33

A Microsoft Magyarorszg szakmai magazinja 2001. 02.

Developer
<%

ASP suli 2.

If Request.ServerVariables("AUTH_USER")="" Then Response.Status = "401 Unauthorized" Response.End End If %> <HTML> <HEAD><TITLE>User LogOn Page</TITLE></HEAD> <BODY> AuthType: <% = Request.ServerVariables("AUTH_TYPE") %><BR> Username: <% = Request.ServerVariables("AUTH_USER") %><BR> Password: <% = Request.ServerVariables("AUTH_PASSWORD")%> <BR>

A Basic (nylt jelszavas) felhasznlazonosts nem alaprtelmezs, itt kapcsolhatjuk be Alaprtelmezs, hogy felhasznlazonostsra akkor van szksg, ha az anonymous felhasznl hozzfrsi jogai egy adott feladathoz mr nem elegendk. Felhasznlazonostst teht legegyszerbben gy knyszerthetnk ki, ha az NTFS fjlrendszerre teleptett IIS knyvtra alatt (ez az \inetpub\wwwroot) a kvnt fjlo(ko)n vagy knyvtr(ak)on korltozzuk az IUSR_szmtgpnv felhasznl hozzfrsi jogait. Az IIS ilyenkor automatikus felhasznlazonostsba kezd, s csak akkor engedi be a felhasznlt, ha t a megadott jelsz segtsgvel a felhasznli adatbzisban sikeresen azonostotta. Ha ezt nem akarjuk, az azonostst krhetjk kdbl is: mint mr tudjuk, a felhasznlazonostst tulajdonkppen egy 401-es kd HTTP vlaszzenet vltja ki. Vajon mi trtnik, ha a Response.Status segtsgvel mi magunk kldjk vissza ezt az zenetet, valahogy gy:
<% Response.Status = "401 Unauthorized" %>

</BODY> </HTML>

A fenti kd els rsze ellenrzi, hogy a felhasznl azonostotta-e mr magt. Ha nem (a felhasznlnv res), visszakldi a sttuszzenetet, majd befejezi az oldal vgrehajtst. Miutn a felhasznl bejelentkezett, a vezrls mr eljut a valdi tartalomhoz: kirjuk a felhasznlazonosts tpust, a nevt s jelszavt. rdemes megfigyelni, hogy a klnfle bngszk s azonostsi mdszerek hogyan befolysoljk az adatokat: Basic azonosts esetn pldul lthat a jelsz, mg a Negotiate mdon azonostott felhasznl nevben benne van a tartomny neve is (a \ jel eltti rsz).

Nos, elrulhatom, hogy a legjobbak trtnnek. A sttuszzenet mell az IIS automatikusan mellkeli a megfelel WWW-Authenticate mezket s elvgzi helyettnk a felhasznlazonostst. A felhasznl neve, jelszava (ha elrhet) s a felhasznlazonosts tpusa brmikor megtallhat a ServerVariables kollekciban:
Request.ServerVariables("AUTH_TYPE") Request.ServerVariables("AUTH_USER") Request.ServerVariables("AUTH_PASSWORD")

A jelsz csak akkor lthat, ha a tpus basic; ms esetekben az AUTH_PASSWORD mez rtke res. Ha nem volt felhasznlazonosts (pl. mert anonymous mdon rtk el az adott scriptet), az AUTH_USER rtke is res lesz. Lssunk ezutn egy pldt, ami felhasznlazonostst kr, majd ha az sikeres volt (azaz ha az IIS a Windows 2000/NT felhasznli adatbzisban a felhasznlt megtallta), kirja a fenti adatokat (logon.asp):

Ugyanaz az oldal, bejelentkezs utn az Internet Explorer s a Netscape esetben. Jl lthat a tartomny neve, illetve a Netscape oldaln a nylt jelsz A felhasznlazonosts egy msik, j, IIS5-ben bemutatott mdja a tanstvnyokkal, felhasznlnv s jelsz nlkl trtn, automatikus azonosts; errl egy ksbbi alkalommal beszlnk majd.

A Microsoft Magyarorszg szakmai magazinja 2001. 02.

34

Developer

ASP suli 2.
szksg van r, csak fel kell nylnunk rte, s hopp, mris a rendelkezsnkre ll! Nos, pontosan erre val az Application objektum. Segtsgvel a felhasznlk, krsek kztt adatokat oszthatunk meg egyszeren, anlkl, hogy pldul lemezre kellene rnunk azokat. Az Application objektumba rt informci mindaddig megmarad, amg az adott alkalmazst (gyakorlatilag az IIS-t) jra nem indtjuk. Amint az brn is lthat, az ASP alkalmazs egy nagyszer globlis felh a felhasznlk krsei s az azokra adott vlaszok fltt. Fontos, hogy Application objektum minden ASP alkalmazsban csak egy van. Az ASP munkamenet Ha mr gy belemelegedtnk a felhkbe: az ASP munkamenet (Session) clja teljesen hasonl, csakhogy ez az Application-nel ellenttben nem felhasznlk kztti, hanem egy adott felhasznl mveletei fltti globlis objektum. Ha gy tetszik, szmos Request s Response fltt uralkod valami, ami megmarad egszen addig, amig a felhasznl el nem hagyja a webhelyet, vagy be nem csukja a bngszjt. Termszetesen Session objektumbl mr nem csak egy van: ahny felhasznl, annyi Session. Hopp! Nem tnik fel valami? Az elbb ppen azt mondtam, hogy a HTTP llapotmentes protokoll. Akkor hogyan tudjuk megklnbztetni Jen s Ben klnbz krseit Ben kt, egyms utn kldtt krstl? (Csak semmi trkk az IP cmekkel: termszetesen Jen s Ben ugyanazt az IP cmet hasznljk, de akr az is elfordulhat, hogy menet kzben Ben IP cme megvltozik). Nos, a vlasz egyszer: cookie. Az IIS trkks kis stit kld minden felhasznlnak, akit azutn felismer mindaddig, amig a cookie megmarad (mrpedig az csak addig marad meg, amig a bngszt be nem zrjuk). Nzzk csak meg, mit mond az IIS egy teljesen tlagos krsre:
GET /default.asp HTTP/1.1

Egy megjegyzs a Request kollekcikrl A Request objektum lehetv teszi, hogy a klnbz kollekcikban tallhat adatokat a forrs megadsa (pl. Request.Form(nev)) nlkl, kzvetlenl a Request(nev) hvssal rjk el. Ilyenkor az IIS az sszes kollekcin vgigfut, s visszaadja az adott nev elem els elfordulst. A sorrend a kvetkez: QueryString Form Cookies ClientCertificate ServerVariables Nha hasznos lehet, de ltalban nem j, ha ezt a kzvetlen hivatkozst hasznljuk: egyrszt, feleslegesen terheljk vele a kiszolglt, msrszt pedig, nem lehetnk biztosak abban, hogy az adat onnan jtt, ahonnan mi vrtuk. Kpzeljk el, hogy egy krdv nv mezjt szeretnnk beolvasni, ehelyett azt kapjuk, amit a felhasznl kzzel begpelt az URL vgre! Az ASP alkalmazs s munkamenet Lssuk csak jra az elz szmban bemutatott brt az IIS objektumhierarchijrl:

Application objektum Session objektum Request objektum gyfl Response objektum Server objektum IIS Motor

Session objektum Request objektum Response objektum gyfl ASP Error objektum

Jl lthat s remlem, mostanra nyilvnval is , hogy az eddig trgyalt objektumok, a Request s a Response mindig egy aktulis HTTP krst s az arra adott vlaszt jelkpezik. A kvetkez krs esetn mindkt objektumbl j keletkezik. A kvetkezkben az alkalmazs (Application) s a munkamenet (Session) objektumokrl lesz sz. Ezek az objektumok mr nem tnnek el ilyen egyknnyen az IIS memrijbl, hiszen feladatuk pontosan az, hogy tbb krst is tfog mveleteket, kzponti adattrolst tegyenek lehetv. Az ASP alkalmazs Mit neveznk ASP alkalmazsnak? Egy ASP alkalmazs tulajdonkppen nem ms, mint egy adott knyvtrban s az sszes alknyvtrban tallhat .asp kdok halmaza. Csakhogy a valsgban ennl kicsit bonyolultabb a helyzet, hiszen ha csak errl lenne sz, nem lett volna szksg az alkalmazsok ltrehozsra. Mint tudjuk, a HTTP eredetileg llapotmentes vilg: jn egy krs, mi kiszolgljuk, azutn jn a kvetkez, s a kiszolglnak vglis fogalma sincs arrl, hogy melyik krst ppen ki kldte. Lehet, hogy ugyanaz a felhasznl, lehet, hogy a vilg kt vgrl kt olvas jelentkezett. Mgis, milyen j lenne, ha lenne egy globlis valami, amiben adatokat, st, akr ksz objektumokat trolhatunk, s brmikor

HTTP/1.1 200 OK Server: Microsoft-IIS/5.0 Date: Mon, 12 Feb 2001 22:21:53 GMT Content-Length: 2354 Content-Type: text/html Set-Cookie: ASPSESSIONIDGQGQGVDQ=IBGLAICAJDOELPGDLNDPODPM; path=/ Cache-control: private

Kapunk egy rdekes nev cookie-t: az (egybknt vltoz) ASPSESSIONIDxxxxxxxx nev cookie tartalmnak segtsgvel az IIS egyrtelmen azonostja a visszatr bngszt, s ugyanabba a krnyezetbe helyezi (azaz, mindenki az els ltogatskor rszre ltrehozott, klnbejrat Session objektumba pottyan). Elbcszhatunk a munkamenetektl, ha a felhasznl bngszje visszautastja a cookie-kat. Ha ilyenkor mgis valami hasonl funkcionalitst szeretnnk elrni, kls gyrt termkeit kell hasznlnunk, amelyek az URL-be gyazva valstjk meg a munkamenetek kezelst (az IIS-ben szr-

35

A Microsoft Magyarorszg szakmai magazinja 2001. 02.

Developer
knt mkdve minden, az oldalakban tallhat URL hivatkozshoz hozzfzik az azonostt, mg a bngszktl rkez krsekbl kiszrik azokat). Ez a megolds teljesen cookie-mentes, s elvileg minden bngsz boldogul vele (csak kicsit rondk lesznek az URL-ek). Termszetesen kell, hogy legyen egy bizonyos idkorlt is: ha valaki 20 percen bell nem jelentkezik, a rszre ltrehozott Session objektum elveszik, s legkzelebb jra tiszta lappal indul. Ez az idkorlt is bellthat, mgpedig ugyanott, ahol az elz szmban alaprtelmezett scriptnyelv belltsait megtalltuk: azutn ksbb felhasznlhassuk:
Session("counter") = 1

ASP suli 2.

Session("counter") = Session("counter") + 1 x = Session("counter")

A session.asp els rszben a Session(counter) rtknek megfelelen kszntjk a ltogatt. rdekes mg az oldal aljn tallhat adat is: a Session.Contents ugyanis egy kollekci, aminek segtsgvel visszanyerhetjk mindazt, amit sikerlt az objektumba belaptolnunk (anlkl, hogy tudnnk a nevt), valahogy gy:
For Each oItem In Session.Contents Response.Write(Session(" & oItem & ") = " & Session(oItem) & "<br>" ) Next

Ebbl a kollekcibl persze trlni is lehet. Az albbi plda els kt sora egy-egy elemet (pl. a counter nevt, vagy ppen a msodikat), mg a harmadik a teljes tartalmat trli:
Session.Contents.Remove("counter") Session.Contents.Remove(2)

A Session idtllpse alaprtelmezsben 20 perc Ha nincs r szksgnk, a munkamenetek kezelst itt egy kattintssal letilthatjuk (hiszen semmi sincs ingyen). Ha globlisan ezt nem akarjuk megtenni, akr oldalanknt is kikapcsolhatjuk, az oldal tetejre rt ASP direktva segtsgvel:
<%@ENABLESESSIONSTATE="False"%>

Session.Contents.RemoveAll()

A tartalom teht ilyenkor elveszik, de az objektum megmarad. Azrt fontos ezt megemlteni, mert a Session objektumot nmagt is lehet trlni:
Session.Abandon()

A Session objektum J szoksunkhoz hven, haladjunk ismt htulrl elre: ismerjk meg a Session objektum rejtelmeit. Mindenekeltt, prblgassuk a sessionid.asp oldalt! Nyissunk meg egy bngszt, nyissuk meg az oldalt, vndoroljunk tovbb, trjnk vissza, s figyeljk meg, vltozik-e a Session azonostja! Nyissunk meg egy msik bngszt, s lthatjuk: ahny bngsz, annyi Session. Az oldal egyetlen emltsremlt sort tartalmaz:
Session ID: <% = Session.SessionID %>

A Session.Abandon() hvs utn (termszetesen miutn az adott oldalt mr vgleg kikldtk) a Session objektum trldik a memribl. A felhasznl legkzelebbi jelentkezsekor j, res objektum jn majd ltre. rdemes megfigyelni a session.asp s az abandon.asp kdok viselkedst. Termszetesen nem csak szmot s szveget trolhatunk a Session-ben, hanem akr komplett objektumokat is. Emlksznk mg az elz szmban hasznlt ADODB.Stream objektumra, amivel binrisan tudtunk olvasni a lemezrl s adatot kldeni a bngsz fel? Valahogy gy:
Set oStream = Server.CreateObject("ADODB.Stream") oStream.Type = 1 ' adTypeBinary oStream.Open oStream.LoadFromFile( Server.MapPath("ms.jpg") )

A Session.SessionID jellemz visszaadja a Session azonostjt. Ez az azonost sokszor j szolglatot tehet, hiszen segtsgvel azonostani lehet a visszatr felhasznlt. (Mieltt valaki flrerten: visszatr alatt most azt rtjk, aki a Session idkorlt lejrta eltt visszatr, vagy azalatt barangol oldalainkon). A Session.LCID s a Session.CodePage jellemzk a szoksos locale s karaktertbla-azonostk; az objektum negyedik, s egyben utols jellemzje pedig a Session.TimeOut, amit tlltva egy adott munkamenet erejig fellbrlhatjuk az alaprtelmezett 20 perces idkorltot. Sokkal rdekesebb ennl az, amire a Session objektumot eredetileg kitalltk: rhatunk bele s olvashatunk belle, gyakorlatilag brmit; a belert rtk pedig termszetesen megmarad mindaddig, amg az objektum letben van. A session.asp bemutatja mindazt, amit a Session objektumrl tudni kell. Lssuk, hogyan trolhatunk el egy rtket, hogy

Response.ContentType = "image/jpeg" Response.BinaryWrite( oStream.Read )

Vgjuk kett ezt a kdot, s az oStream objektumot hasznljuk tmeneti trolhelynek! A loadpic.asp betlti az objektumot a Session-be:
<% Set oStream = Server.CreateObject("ADODB.Stream") oStream.Type = 1 ' adTypeBinary oStream.Open

A Microsoft Magyarorszg szakmai magazinja 2001. 02.

36

Developer

ASP suli 2.
<SCRIPT LANGUAGE=VBScript RUNAT=Server> Sub Session_OnStart

oStream.LoadFromFile( Server.MapPath("ms.jpg") )

Set Session("mypic") = oStream %>

Session("starttime") = Now Set Session("oFSO") = Server.CreateObject ("Scripting.FileSystemObject")

A showpic.asp pedig kiolvassa s elkldi a bngsznek:


<% If IsObject( Session("mypic") ) Then Set oStream = Session("mypic")

End Sub

Sub Session_OnEnd Set Session("oFSO") = Nothing End Sub </SCRIPT> Response.ContentType = "image/jpeg" Response.BinaryWrite( oStream.Read ) Else

%> <HTML><HEAD></HEAD> <BODY>A kp nem tallhat.</BODY> </HTML> <% End If %>

A fenti pldban a Session ltrejttekor belerjuk a pontos idt, s ltrehozunk egy FileSystemObject objektumot, amit a tovbbiak sorn majd knyelmesen hasznlhatunk, a Session_OnEnd szubrutinban pedig felszabadtjuk az FileSystemObject objektum ltal lefoglalt memriaterletet. Objektumokat globlisan is ltrehozhatunk, az <OBJECT> elem segtsgvel, pldul:
<OBJECT RUNAT=Server SCOPE=Session ID="oGlobFSO" PROGID="Scripting.FileSystemObject">

A kd elejn tallhat ellenrzs azrt kell, mert ha a Session(mypic) nem tartalmazza mg az objektumot (pldul mert a loadpic.asp-t mg nem futtattuk, vagy Abandon() hvsra kerlt sor), akkor az rtkads azonnal hibt jelezne. Az IsObject() fggvny rtke akkor igaz, ha a neki paramterknt tadott vltoz tnyleg egy objektum ha nem az, a kp helyett egy egyszer HTML hibazenetet kldnk vissza. Figyeljk meg, hogy az objektumok kezelsnl a ms tpus vltozkkal ellenttben hasznlnunk kell a Set utastst:
Set oStream = Server.CreateObject("ADODB.Stream") Set Session("mypic") = oStream Set oMyObj = Session("mypic")

<SCRIPT LANGUAGE=VBScript RUNAT=Server> ... </SCRIPT>

Az gy ltrehozott objektumokra azutn alkalmazsszerte az .asp oldalakban kzvetlen nevkkel hivatkozhatunk:


<% If oGlobFSO.FileExists(strFileName) Then ... End If %>

A global.asa fjl Most egy kicsit elreugrunk az idben: a global.asa fjl tulajdonkppen az Application objektum lersnl kellene, hogy elkerljn, azonban az a kvetkez hnapra csszik. A fjl azonban tartalmazhat a Session objektumra vonatkoz rszeket is, ezrt a trgyalstl nem tekinthetnk el. A global.asa fjl egy specilis llomny, amit az ASP alkalmazs gykrknyvtrban lehet elhelyezni (az alaprtelmezett ASP alkalmazs gykrknyvtra pldul termszetesen az \inetpub\wwwroot). A fjl arra val, hogy ebben helyezhessk el a globlis objektumokat ltrehoz s -esemnyeket kezel kdrszleteket, gyismint: Az Application objektum esemnyeit (ltrehozst, megsemmistst) kezel rutinok (Application_OnStart s Application_OnEnd) A Session objektumok ltrehozst s megsemmistst kezel eljrsok (Session_OnStart s Session_OnEnd) Globlis objektumok ltrehozsa az <OBJECT> elem segtsgvel Tpusknyvtrak (type libraries) betltse A Session_OnStart szubrutin rtelemszeren az adott Session ltrejttekor, a Session_OnEnd pedig az objektum megsemmislse eltt fut le. Ezeket a rutinokat a global.asa fjlba <SCRIPT></SCRIPT> elemek kz kell megrnunk, pldul:

Az <OBJECT> elem SCOPE paramtere hatrozza meg, hogy az objektum hny pldnyban jjjn ltre. A paramter rtke esetnkben termszetesen session, ami azt jelenti, hogy minden egyes Session ltrejttekor jabb FileSystemObject keletkezik. A StaticObjects kollekci Egyetlen kollekci maradt a vgre: a Session.StaticObjects kollekci a global.asa-ban session scope-pal ltrehozott objektumokat tartalmazza. A kollekci tartalmt a szoksos mdon rhetjk el (ld. session.asp):
For Each oItem In Session.StaticObjects Response.Write( "Session(" & oItem & ") = " & Session(oItem) & "<br>" ) Next

Flp Mikls mick@netacademia.net A cikkben szerepl URL-ek: [1] http://technet.netacademia.net/feladatok/asp/2 ASP objektummodell-referencia a weben: http://msdn.microsoft.com/library/psdk/iisref/vbob74bw.htm

37

A Microsoft Magyarorszg szakmai magazinja 2001. 02.

Developer

ASP suli 3. Bbeli zrzavar


ges. A bngszk mr rgta kpesek feldolgozni a klnfle kdtblkban rt HTML dokumentumokat azokba pedig egyszeren csak bele kell rni a betket. Itt jegyeznm meg, hogy bizonyos jeleket mg mindig rdemes entity-k segtsgvel lerni. Ilyen pldul a (&trade;), a (&copy;),az (&reg;), illetve a matematikai jelek, s ms specilis karakterek (&euro; &yen; &frac12; &sect;). A [2] cmen, a HTML 4 szabvny lersn bell megtallhat a szabvnyos entity-k teljes listja, de ezzel mr bnjunk nagyon vatosan, mert a bngszk elgg hadilbon llnak az igazn specilis karakterekkel. Ha egy bngszben megkeressk az Encoding vagy Character Set menpontot, lthatjuk, hogy mely kdtblkat kpes felismerni s hasznlni. A HTML oldal kdjban pedig a kszt megadhatja a hasznlt kdtbla azonostjt, az oldal nyelvt, de ha ez elmarad, akkor is van r esly, hogy a bngsz helyesen ismeri fel azt. rvztr tkrfrgp Tegynk ht egy prbt! A fenti mondat tartalmazza az sszes specilis magyar bett, (zetlen trfa kvetkezik, de nem tudom kihagyni: szegny tisza-menti vegeseknek mr biztosan van ilyen), amit az arviz1.htm oldal kdjba nemes egyszersggel, kdolatlanul belertunk:
<html> <head></head> <body> rvztr tkrfrgp - RVZTR TKRFRGP </body> </html>

Rengeteg levelet kaptunk, hogy az elz szmban, a Session objektum ismertetse sorn mltatlanul kevs helyet szenteltnk a CodePage s LCID jellemzknek. A meglts jogos, ezrt most igyekszem beptolni a kdtblkkal, lokalizlssal kapcsolatos informcikat. Mint mindig, az aktulis pldaprogramok termszetesen letlthetk a [1] cmrl. Volt egyszer egy ASCII Az Internet hasznlatnak els veiben, az aktulis feladatok megoldsra a 7 bites ASCII kdols tkletesen elegend volt. A 7 bitbe (127 karakter) belefrt a teljes angol ABC, a szmok s mg nhny jel is. Azutn a hlzat kezdte tlpni a hatrokat, s egyre inkbb szksg volt az angoltl klnbz nyelvek betinek megjelentsre is. Ekzben a htbites rendszerekrl lassan megkezddtt az ttrs a nyolc bitre (gy lett az ASCII-bl ANSI), ezutn kzenfekv volt, hogy a specilis karaktereket a megjelen 128 res helyre lehet bekdolni. Ahny hz, annyi szoks: ki gy, ki gy tlttte ki ezt a fels tartomnyt. A klnbz megoldsoknak ksznheten megszlettek a kdtblk (codepage), s elkezddtt a kosz. Mg messze a DOS-os idkben jrunk, amikor a tblzatrajzol karakterek helyett nha kezetes karakterek jelennek meg a rossz belltsoknak ksznheten. A nyugat-eurpai (western) kdtblk tartalmaznak ugyan kezetes betket, de a magyar hossz s mr nem frt bele. Sebaj, van hasonl: (sajnos) valsznleg mindannyian tallkoztunk mr a kalapos u s hullmos o betkkel. Akkoriban ez a kis cssztats mg elviselhetnek tnt, manapsg viszont mr inkbb knos hibnak tnik a megjelensk teszem hozz, jogosan. A vilg ugyanis azta sokat fejldtt. A szertegaz kdtblkat szabvnyokk fogtk ssze, a dokumentumokba beptettk a karaktertblkat azonost adatokat, gy egy HTML oldal forrsbl, vagy egy e-mailbl azonnal kiderl, hogy azt a kldje milyen karaktertblval rta. Bizony, gy van ez akkor is, ha a (fleg nem Windows platformon fut) levelezprogramok zme errl nem hajland tudomst venni. Mindenekeltt kt fontos kdtblra hvnm fel a figyelmet: az iso-8859-1, ms nven Western kdtbla a nyugat-eurpai karaktereket (s a hullmos/kalapos o s u tartalmazza, mg az iso-8859-2 alias -t -t) Central European nevhez mltn a szmunkra oly kedves magyar vltozatot. Hasonl hatst lehet elrni a Windows-1250 nev kdlappal, ez azonban, mint az a nevbl is kitallhat, nem kifejezetten elterjedt Un*x s Macintosh krkben :-). Magyar szvegben, amikor csak tehetjk, hasznljuk az iso-8859-2-t! Specilis karakterek a HTML kdban Trjnk vissza kicsit a HTML s ASP mezsgyjhez. A HTML dokumentumokban a klnleges karaktereket specilis mdon, gynevezett entity-k segtsgvel rtk le. A (kalapos) hossz kdja pldul &ucirc; a (hullmos) hossz pedig &otilde;. Sokan a mai napig hasznljk ezt a kdolst, pedig egyrszt hossz, knyelmetlen, msrszt pedig felesle-

Ha ezt az oldalt megjelentjk, a bngsz a kdtbla megadsa hjn megprblja felismerni a hasznlt vltozatot. Ha gy dnt, hogy nyugat-eurpai kdolst vlaszt, jnnek a kalapos kezetek. (Az ppen hasznlt kdtblt az Encoding menben lthatjuk kivlasztva. Ha ezt kzzel mdostjuk, a kdols helyrell.) A tallgatsok elkerlse rdekben a bngszt kifejezetten utasthatjuk egy adott kdtbla hasznlatra, emgyen (arviz2.htm):
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2"> </head> <body> rvztr tkrfrgp - RVZTR TKRFRGP </body> </html>

35

A Microsoft Magyarorszg szakmai magazinja 2001. 03.

Developer
A lnyeg az alhzott sorban, az gynevezett Content-Type fejlcben van, ahol nemcsak az oldal HTML mibenltt hatrozzuk meg, hanem a hasznlt kdtblt is. Akinek ismers ez a sor, jl tved: nhny hnappal ezeltt, a Response.Charset jellemz lersnl mr megemltettk. Ha azt hasznljuk, ugyanezt a hatst rjk el, mikzben az ASP oldalon bell elkerlhetjk a META elem hasznlatt (arviz3.asp):
<% Response.Charset = "iso-8859-2" %> <html> <head></head> <body> rvztr tkrfrgp - RVZTR TKRFRGP </body> </html>

ASP suli 3.

Tovbbi META elemek Ha mr itt tartunk, felsorolnk nhny, eddig mg nem emltett hasznos metainformcit, amit a weboldalakba gyazva klnfle hatst rhetnk el.
<META name="author" content="Flp Mikls"> <META name="date" content="03/07/01"> <META name="description" content="ASP Suli 3"> <META name="keywords" content="ASP, learning"> <META name="robots" content="noindex, nofollow"> <META http-equiv="Content-Language" content="hu">

ptottk a Unicode Consortiumot. A szervezet clja az volt, hogy olyan szablyrendszert dolgozzanak ki, amivel vgre egysgesen le lehet rni a vilgon beszlt (s mr vagy mg nem hasznlt) sszes nyelv minden karaktert, grafikai szimblumokat, nyelvi elemeket. A Unicode szerint is minden karaktert kt bjt azonost, gy 65535 klnbz jel lersra van lehetsg. A tblzat mg napjainkban is frissl, st, van olyan terlete is, ahova mi magunk definilhatunk karaktereket (a 0xE000-tl 0xF8FF-ig). Ha van kznl egy Windows 2000, tessk csak beptygni a Run ablakba: eudcedit.exe! A Unicode azonban nem kdolsi szabvny. A karakterek ktbjtos rtkt tbbflekppen is felhasznlhatjuk a dokumentumokban. Tbbfle kdolsi md terjedt el, termszetesen mindegyik alapja maga a Unicode tblzat. Az egyik mdszer szerint a dokumentum minden egyes karaktert kt bjton brzoljk, ezzel termszetesen megduplzva a mrett. Az alternatv kdolsi mdok kzl az UTF-7 s az UTF-8 terjedt el, ezek kzl az UTF-8 lett a gyakoribb. Az UTF-8 kdols Kdols, s nem kdtbla, hiszen itt mr sz sincs tblrl. Kdtblaknt maga a Unicode funkcionl. Lssuk, mit tud az UTF-8. Ebben a kdban egy karakter kdjnak hossza 1 s 3 bjt kztt mozog. Az ASCII karaktereket, teht az els 127 jelet hagyomnyosan, egy bjton kezeljk. Ennek ksznhet, hogy az UTF-8 dokumentumok, ha nem tartalmaznak tl sok extra karaktert, emberi szemmel mg jl olvashatk. A 128 feletti rtkek mr nem frnek el egy bjton, ezrt azok esetn mr hosszabb lerra van szksg. De lljunk meg egy pillanatra! Mirt nem fr bele az els bjtba 255 karakter? Ht azrt, mert akkor nem tudnnk megklnbztetni a 0x6161-es kdot a 0x61 0x61-tl. Ezrt aztn, ha egy UTF-8 bjt rtke: 0x00-0x7F: az egybjtos ASCII karakter kdja 0x80-0xBF: tbb-bjtos rtk tovbbi bjtjai 0xC2-0xDF: ktbjtos rtk els bjtja 0xE0-0xEF: hrombjtos rtk els bjtja Teht minl messzebb van a Unicode tblban egy karakter, annl hosszabban kell lerni (de legfeljebb hrom bjton). Ha egy karakter kdja 0x0001-0x007F, akkor 1 bjt (0x01-0x7F) 0x0080-0x07FF, akkor 2 bjt (0xC280-0xDFBF) 0x0800 felett, akkor 3 bjt (0xE0A080-0xEFBFBF) A tvol-keleten teht az UTF-8 kdols kicsit pocskol, hiszen ott a legtbb hasznlt karakter az utols tartomnyba esik. A vilg nagy rszn viszont, ahol az rs alapjt valahol mgiscsak a latin betk kpezik, az UTF-8 sok helyet megsprol. Mutatok egy pldt, kp formjban, mert ez mr nem biztos, hogy tlln az amgy is rapszodikus nyomdai konverzikat :-). me:

A fenti informcik nagy rsze egyelre igazn csak a webes keresk szmra rdekes. Az author (szerz), date, keywords, description mezk tartalmt a jobb keresk feldolgozzk, keress sorn a keywords mezben megjelen kulcsszavak pldul nagyobb sllyal brnak, mint a dokumentum szvegbl kivonatolt minta. A description mez rtkt a keressre adott vlaszban szoks megjelenteni. Ha oldalunk tartalmaz ilyen mezt, akkor a rvid lers nem a dokumentum els nhny sora lesz, hanem a description-knt megadott szveg. A robots metaelem a keresk feldert-egysgeinek (ezek a robotok) mkdst szablyozza, a noindex rtk arra utastja a robotot, hogy az oldalt ne indexelje, ne trolja az adatbzisba, a nofollow pedig azt jelenti, hogy az oldalon tallhat hivatkozsokat nem kell kvetni. A legfontosabb mgis a Content-Language, ami nem is metainformci, hanem HTTP fejlc. rtke a dokumentum nyelvre utal rvidts, magyar esetn termszetesen a hu (a tovbbi kdok megtallhatk pldul itt: [4]) Vissza a kdtblkhoz A klnfle kdtblk hasznlata azonban nem oldott meg minden gondot. Nem nagyon hasznlhatunk egy dokumentumon bell tbb kdtblt (a HTML codepage fejlc az egsz dokumentumra vonatkozik). Ennl is nagyobb gond az, hogy a legtbb tvol-keleti nyelv tbbezer klnbz karaktert tartalmaz, ezt pedig nehezen lehet lerni egy 8 bites azonostval. Ezeken a terleteken termszetesen 16 bites kdtblk alakultak ki, ahol egy jelet kt bjt hatroz meg. Persze ilyen kdtblbl is tbb fajta ltezik, ezrt kzenfekv volt, hogy a kdtblk kztti koszt szablyozni kell. Tbb vezet szmtstechnikai, informatikai cg, nyelvszek, knyvtrosok szervezetei, s mg sokan msok ezrt megala-

Nhny karakter s UTF-8 kdja

A Microsoft Magyarorszg szakmai magazinja 2001. 03.

36

Developer

ASP suli 3.
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

Taln feltnt, hogy milyen specilis alkalmazssal hoztam ltre ezt a dokumentumot. Nem csals, nem mts, a Windows 2000 Notepad nev csodaalkalmazsa gy nyeli a Unicode karaktereket, mint kacsa a nokedlit. Knaiul akarunk rni? Tessk! UTF-8 formtumban szeretnnk menteni? Tessk! (Vessnk egy pillantst a ments menre, ott van az Encoding mez!). Teheti mindezt azrt, mert a Windows 2000 bell Unicode. (Itt krnk elnzst, ha az utols kt sor valamelyikben vletlenl egy japn vagy arab kromkodst idztem volna, eskszm, nem volt tudatos :-) ) A kdtbla-hegyek hasznlathoz mindssze egy dolgunk van: a Control Panel / Regional Settings dialgus General ablaknak aljn piplgassuk be a megclzott terleteket, s nmi teleptgets utn birtokunkba vehetjk a teljes Unicode univerzumot. (Ha szeretnnk kiprblni a tbbnyelv ASP pldkat, akkor most tegyk is meg!). Lokalizls Lokalizls alatt nem csak az adott orszg vagy nyelv betkszletnek hasznlatt rtjk, hanem sok minden mst is. Nhny plda, a teljessg ignye nlkl: dtumformtum, hnapok, napok nevei, 12/24 rs idszmts, AM/PM helyi elnevezse, a dtum s id elemeit elvlaszt karakterek, az elemek sorrendje, a fizeteszkz jele s rsnak mdja, a szmok rsnak mdja, a szmjegyek csoportostsa, a csoportostsra szolgl jel, a tizedesjel, a ht els napja, a hasznlt naptr, a sorbarendezs alapja, satbbi. Minderre fel kell kszlnnk, amikor lokalizlt alkalmazst ksztnk, s nincs ez mskpp az ASP alkalmazsok esetn sem. A Windows teljes mrtkben tmogatja ezeket a lokalizcis megoldsokat, ezrt tulajdonkppen nincsen nehz dolgunk. Maga a Windows is a Regional Settings lokalizcis belltsai alapjn mkdik, gy jelennek meg a dtumok, idpontok, szmok, de mg a numerikus billentyzet . gombjnak jelentse is (magyar bellts esetn ugyanis helyesen nem tizedespontot, hanem tizedesvesszt r). A VBScript is szmos hasznos funkcit tartalmaz [3]. A GetLocale() fggvny pldul meghvsa utn visszaadja a szmtgpen hasznlt alaprtelmezett bellts kdjt (a kd rtelmezst lsd itt: [4]), a SetLocale() segtsgvel pedig bellthatunk egy ms rtket. Ha az adott nyelv tmogatsa nincs teleptve, a SetLocale() meghvsa hibt okoz. A FormatCurrency(), FormatDateTime(), FormatNumber(), FormatPercent() fggvnyek pedig az ppen rvnyes belltsnak megfelelen ksztik el a fizeteszkz, dtum s id, szm s szzalkrtkeket (szveges formban, persze). A locale.asp pldaprogram segtsgvel kicsit jtszadozhatunk a belltsokkal. Weblapok UTF-8-ban Miutn kigynyrkdtk magunkat a lokalizlt adatok nzegetse sorn, vegyk sorra, mi kell ahhoz, hogy valdi nemzetkzi oldalakat hozhassunk ltre. Mindenekeltt, a bngszt utastani kellene, hogy hasznljon valami rtelmes kdtblt. Termszetesen minden nyelvhez megvan a sajt kdtbla, de most univerzlis megoldst keresnk, st, a vgn egy oldalon bell tbb nyelv is megjelenik majd, ezrt a vlasztsunk termszetesen az UTF-8-ra esik. Helyezzk el a megfelel META elemet az oldal fejlcben:

Ezutn mr csak arra kell gyelnnk, hogy az oldal forrskdjt is UTF-8, ban mentsk el, klnben a bngsz el fogja nyelni az kezetes karakterek utn kvetkez betket (hiszen kt- vagy hrombjtos rtket vr), valahogy gy:

Ez trtnik, amikor a belltott kd ugyan UTF-8, de az oldal tartalma nem UTF-8-ban kszlt. Ha a fenti plda megtekintse esetn a bngszben kivlasztjuk a Central European dekdolst, megltjuk, hogy a dokumentum valjban nem UTF-8-ban kszlt, de a bngsz engedelmeskedik a benne tallhat META parancsnak. UTF-8 kdols oldalt tbbflekppen is elllthatunk: mindenekeltt, ha a webszerkesztben a HTML Encoding rtkt Multilingual (UTF-8)-ra lltjuk. Egy alternatv lehetsg, hogy elksztjk a komplett oldalt, ahogy neknk jl esik, majd a Windows 2000 Notepad-jval megnyitjuk, s visszamentjk UTF-8 formtumban. Az ASP ltal hasznlt kdtbla belltsa Az rendben van, hogy mi mr tudunk UTF-8-ban rni, de az ASPnek is meg kellene valahogy magyarzni, hogy mit szeretnnk, klnben a rendszer alaprtelmezett kdtbljt hasznlja. Erre rgtn kt lehetsgnk is addik, egyrszt, hasznlhatjuk a Session.CodePage jellemzt, msrszt pedig a @CODEPAGE ASP direktvt. Az UTF-8 kdols kdtbljnak azonostja 65001. Az albbi kt plda egyenrang, de a Session.CodePage hasznlata fellbrlja a direktvban meghatrozott rtket:
<%@ CODEPAGE=65001 %> <% Session.CodePage = 65001 %>

A kdtblhoz hasonlan termszetesen a lokalizcis belltsokat is tudjuk mdostani. Mint a kdtblnl, az ASP a szmtgp alaprtelmezse szerint lokalizl, de ez is megvltoztathat. Itt is kt lehetsgnk addik, a direktva s a jellemz belltsa:
<%@ LCID=1038 %> <% Session.LCID = 1038 Hungary %>

Ne feledjk, az ASP direktvknak az ASP oldal tetejn kell elhelyezkednik, egynl tbb direktva esetn egy sorban, egyms utn, gy:

37

A Microsoft Magyarorszg szakmai magazinja 2001. 03.

Developer

ASP suli 3.

<%@ CODEPAGE=65001 LCID=1038 %>

Mint azt mr emltettem, nemltez, vagy nem tmogatott kdtbla s lokalizcis belltsok hasznlata hibt okoz. A hiba akkor lp fel, amikor a Session.CodePage illetve Session.LCID rossz rtket kap. Mi azonban nem szeretnnk, hogy az oldal vgrehajtsa hibval befejezdjn, sokkal jobb lenne valami intelligens hibakezelsi megolds. Hibakezels az ASP oldalban A hibakezels mr nem az ASP krnyezet, hanem a scriptmotor feladata, ezrt ahny scriptkrnyezet, annyi megolds ltezik. Mg a Jscriptben a C programozknak ismers try/catch prost hasznlhatjuk a hibk elfogsra s kezelsre, addig VBScriptben a Visual Basic hibakezelsi megoldsa kpezi az alapokat. A VBScript annyiban klnbzik a VB-tl, hogy itt nem definilhatunk hibakezel szubrutint. Az egyetlen, amit megtehetnk, az, hogy utastjuk a scriptmotort, hogy hiba esetn ne lljon meg, hanem ugorjon a kvetkez sorra, s majd mi kezeljk a hibt ha akarjuk. Ezt a parancsot a kvetkezkppen adhatjuk ki:
<% On Error Resume Next ... csinljunk valamit, ami hibt okozhat If Err.Number <> 0 Then hiba trtnt Response.Write("HIBA! Kd:" & Err.Number) Response.Write("Lers:" & Err.Description) Err.Clear End If %>

Bbeli zrzavar, de oly kedves a szvemnek. Hol van mr az ASCII karakterkszlet? rdemes megfigyelni, hogy az arab nyelveknl mg az rs irnya is megvltozott! Valami elkezddtt Most mondhatn azt az olvas, hogy knny a Microsoftnak. Knny a sajt webkiszolglt s bngszt sszehangolni. De nem errl van sz: az ellltott oldal igenis szabvnyos, csak a szabvnyok megvalstsra kellene egy kicsit odafigyelni. Prbakppen rnztem a fenti oldalra alternatv bngszkkel is (A kpernykpek letlthetk a [5] cmrl.) Az UTF-8 kdolst mindegyik bngsz felismerte, ahol tudta, megjelentette az kezetes karaktereket, s nem okozott gondot, hogy nhny karaktert tbb bjton brzoltunk. A versenyt az Opera 5.01 vesztette el, a megjelentett oldal tele van krdjelekkel az arab, a cirill, a grg s a tvol-keleti karakterek egyike sem ltszik. A Netscape 4.61 mr jobb eredmnyt produklt: csak nhny tvol-keleti karakter helyett lthatunk csinos kis ngyszgeket. Kellemes meglepets, hogy az j Netscape 6.01 Gecko motorja ts alt kapott: csak azrt nem kitnt, mert nem vett tudomst az arab szveg rsirnynak megvltozsrl (a specilis vezrlkarakterek pedig ott voltak a szvegben). Fontos! A helyes mkds rdekben az IIS kiszolglra s az gyfelek szmtgpre is telepteni kell a megfelel nyelvi tmogatst! sszefoglalva azt mondhatjuk teht: itt az ideje, hogy elbcszzunk a hullmos s kalapos s betktl. A modern bngszk segtsgvel gyakorolhatjuk, hogy rjk a kuszkuszt eredetileg, sajt nyelvn kvnhatunk boldog szletsnapot thai bartnnknek, Pandacski Boborjn pedig immron ttrhet az urdu nyelv rsos vetletre. :-) Flp Mikls mick@netacademia.net

A program futsa sorn brmikor ellenrizhetjk az gynevezett Err objektumot. Ha az Err.Number rtke 0, nem trtnt hiba, ha attl klnbz, akkor a hibakdot tartalmazza. Ilyenkor az Err.Description a hiba lerst adja vissza. Miutn lekezeltk a hibt, trljk azt az Err.Clear() metdus segtsgvel, klnben a kvetkez ellenrzskor is elkapjuk majd. Az IIS5 ennl fejlettebb hibakezelsi eszkzket is tartalmaz (ott van pldul az ASPError objektum), de errl majd csak a kvetkez szmunkban ejtnk szt. Bbel tornya Fogjuk teht az sszes elrhet lokalizcis varicit, s rjuk ki egy oldalra az aktulis dtumot, idpontot s pnznemet! Az lcid.asp kdja a lertak alapjn teljesen rthet kell, hogy legyen. Az lcdemo.asp funkcionalitsban megegyezik az lcid.asp-vel, csak kevesebb pldt hoz.

A cikkben szerepl URL-ek: [1] http://technet.netacademia.net/feladatok/asp/3 [2] http://www.w3.org/TR/html40/sgml/entities.html [3] http://msdn.microsoft.com/scripting/vbscript/doc/vbstoc.htm [4] http://msdn.microsoft.com/scripting/vbscript/doc/vsmsclcid.htm [5] http://technet.netacademia.net/feladatok/asp/3/pic ASP objektummodell-referencia a weben: http://msdn.microsoft.com/library/psdk/iisref/vbob74bw.htm

A Microsoft Magyarorszg szakmai magazinja 2001. 03.

38

Developer

ASP suli (IV. rsz)


A kis nyelvszkedsi kirnduls utn hamarosan visszatrnk az ASP programozshoz. E szmunkban bemutatjuk az Application s Server objektumokat, ennek kapcsn kitrnk az ASP alkalmazsok mibenltre is, vgl egy jabb naplzsi trkk kvetkezik majd. Mint mindig, a pldaprogramok megtallhatk az [1] cmen. Az ASP alkalmazs Mint arra mr nhny httel ezeltt kitrtnk, az ASP alkalmazs egy adott virtulis knyvtrban (s annak gyermekknyvtraiban) elhelyezett ASP fjlok gyjtemnye, valamint termszetesen az azokat krlvev keretrendszer. Az IIS mr teleptsekor ltrehozza a teljes webet magba foglal alaprtelmezett ASP alkalmazst, a Default Application-t. Nyissuk meg a Default Web Site tulajdonsglapjt, s kattintsunk a Home Directory (alsbb knyvtrszinteken csak Directory) oldalra: lommal ismt lefutnak a definilt inicializl rutinok. A Configuration gomb megnyomsra megjelen prbeszdablak mr ismers lehet, s mg lesz is sz rla: ebben lehet meghatrozni az egyes kiterjeszts fjlokat kezel rendszerkomponenseket, a hibakeress (ASP debugging) belltsait, valamint az alkalmazs globlis paramtereit (alaprtelmezett scriptnyelv, idtllps, stb.)

A vlaszthat futtatsi jogosultsgok A futtatsi jogosultsgok Az Execute Permissions mezben hrom lehetsg kzl vlaszthatunk: None: Csak statikus mkds engedlyezett. Scriptek s programok nem futtathatk. Ezt hasznljuk akkor, ha nem hasznlunk aktv komponenseket Scripts only: Scriptfjlok vgrehajtsa engedlyezett, de klnll programok tovbbra sem futtathatk. Ez az alaprtelmezett s ajnlott bellts Scripts and Executables: A legveszlyesebb, CGI-kompatibilits miatt megtartott opci. Ilyenkor a scriptek mellett a knyvtrakban tallhat programok is lefuthatnak. Az alkalmazs vdelme A meghatrozs tulajdonkppen hibs, ugyanis nem a webalkalmazsunkat, hanem magt az IIS-t vdjk a sajt csnytevseinktl (na j, esetleg magunkat a tbbi webalkalmazstl). Hogy mirt kell ez a vdekezs? A webalkalmazsok sajt tjaikat jrjk. Az esetek tbbsgben (pldul .dll fjlokban megrt) kls komponenseket hasznlnak, hibtlan program pedig, mint tudjuk, nincsen. A .dll-ek kzismert tulajdonsga, hogy a szlprocessz cmtartomnyba tltdnek be, s ha a .dll kszl elhallozni, a szlprocesszt is magval rntja. gy lehet egyetlen .dll segtsgvel a nullval egyenlv tenni a webkiszolglt. Pontosan az ilyen esetek elkerlsre talltk ki az alkalmazsok vdelme (Application Protection) opcit. Egy (.dll-eket tltget) webalkalmazs (kvzi maga a .dll) hrom mdon tltdhet be:

Az alaprtelmezett webalkalmazs belltsai (az ablak als felben lthatk) Az Application Settings vlasztvonal alatt tallhat elemek mind-mind az ASP alkalmazs kezelsre szolglnak. Mindenekeltt lthatjuk az alkalmazs nevt, a kezdpontjt (gykrknyvtrt, esetnkben ez maga a virtulis web), valamint a scriptek futtatsra s az alkalmazs vdelmre vonatkoz ablakokat. Mieltt ezek rtelmezsbe belemennnk, lssuk a gombokat: a Remove eltvoltja, megsznteti a webalkalmazst (a lemezen tallhat fjlok ettl nem srlnek meg). Br a gykralkalmazs is megszntethet, ennek vghezvitele csinos kis hibazenetekhez vezet mind a bngszben, mind a kiszolgl esemnynapljban. A hierarchia alsbb szintjein tallhat alkalmazsokat viszont klnsebb problma nlkl megszntethetjk. Az Unload gomb megnyomsra a webalkalmazs kitltdik, tvozik a memribl. Trldnek az ASP objektumok adatai, felszabadulnak az IIS ltal fogott DLL-ek, s a legkzelebbi alka-

A webalkalmazs hrom vdelmi szintje

A Microsoft Magyarorszg szakmai magazinja 2001. 04.

38

Developer

ASP Suli (IV. rsz)


Az Application objektum teht nem ms, mint egy kzs trolhely, amit az adott webalkalmazs minden scriptje elr. Az Application objektumban adatokat, objektumokat trolhatunk el, hogy majd ksbb kiolvassuk onnan (csakgy, mint a Session objektumnl):
Application("counter") = 12 Set Application("myObject") = oMyObject Set oMyObject2 = Application("myObject")

(Low): az IIS processzbe. Ez gyors, de veszlyes mkdst eredmnyez, hiszen ha a .dll kipukkan, megy vele az IIS is. (Medium Pooled): egy, az IIS processztl elvlasztva fut processzbe. A processz neve dllhost.exe, megleshetjk a Task Managerben. Minden Medium szint webalkalmazst ugyanaz a dllhost.exe futtat, teht ha a tbb Medium szint alkalmazsbl egy elhasal, magval rntja a tbbit is az IIS viszont talpon marad. Ez az alaprtelmezs, mert viszonylag biztonsgos, s nem ignyel sok erforrst. (High Isolated) A High szintre helyezett webalkalmazsok mindegyike sajt dllhost.exe-t kap, amibe annyira s annyiszor rghat bele, ahnyszor csak akar, nmagn kvl senkinek sem rthat vele. Akit rdekel, kiprblhatja: nyisson meg egy Task Manager-t, lltsa a fut processzeket nv szerint sorba, s megltja, hogy n darab dllhost.exe fut. Majd lltson egy webalkalmazst High szintre, s nyisson meg egy oldalt belle: a fut dllhost.exe-k szma n+1re n (az Unload hatsra pedig rtelemszeren eggyel cskken). Ez a legbiztonsgosabb megolds, de a gyakori kontextusvlts miatt sok erforrst ignyel, ezrt a Microsoft nem ajnlja, hogy egy kiszolglra 2-3-nl tbb ilyen szint alkalmazs kerljn. Sajt webalkalmazs ltrehozsa Sajt webalkalmazst gy hozhatunk ltre, hogy egy szimpatikus knyvtr tulajdonsglapjn megnyomjuk a Create gombot. Ekkor ez a knyvtr lesz az jonnan ltrehozott webalkalmazsunk gykrknyvtra, aminek klnleges jelentsge van: azok az ASP fjlok osztanak meg ugyanis kzs ASP objektumokat (pldul az Application objektumot), amelyek ugyanabban a webalkalmazsban tallhatk.

Amint az a fenti pldban is lthat, az Application objektumban is trolhatunk ms objektumokat. Nem szabad elfelejtkezni azonban kt nagyon fontos dologrl: Az objektumokat Set rtkads segtsgvel kell az Application objektumba betlteni, s a kiolvassuk is a Set parancs segtsgvel trtnik. Nem minden objektum alkalmas arra, hogy az Application objektumba tltsk! Az IIS ugyanis tbbszl alkalmazs, egyidben tbb felhasznlt szolgl ki. Az Application objektumba csak olyan objektumokat tlthetnk be, amelyek tbbszl (FreeThreaded) vgrehajtsi mdban kpesek mkdni s gynevezett Both threading-modellt alkalmaznak. Lsd mg: [2] Az albbi plda az Application objektumot hasznlja egy primitv szmll ltrehozshoz
<% Application.Lock Application("count") = Application("count") + 1 Application.Unlock

Response.Write("dv! Te vagy az IIS jraindtsa ta a(z) " & Application("counter") & ltogat.") %>

A plda a valsgban azrt hasznlhatatlan, mert a webalkalmazs jraindulsnak pillanatban reboot vagy unload esetn az Application objektum tartalma, ezzel pedig a szmll rtke is elveszik. De nem is ez a clunk vele, hanem a demonstrci. Az els s a harmadik sorban lthat Application.Lock() s Application.Unlock() metdus hasznlatra azrt van szksg, mert az Application globlis objektum, s elfordulhat, hogy egyszerre tbb felhasznl szeretn rni ugyanazokat az adatokat. Az tkzsek elkerlse vgett minden rsmvelet eltt az objektumot zrolni kell, majd a lehet legrvidebb idn bell az Unlock() metdus segtsgvel fel kell oldani, ugyanis mg az Application objektum zrolva van, senki ms nem frhet hozz, mint az, aki eredetileg zrolta azt. Webalkalmazsok hierarchija A fenti brn lthat hierarchiban most figyeljk az app s a 2 knyvtrakat (ezek webalkalmazsok). Ha megnyitjuk a hierarchiban alattuk tallhat knyvtrak tulajdonsglapjait, lthatjuk, hogy melyik webalkalmazshoz tartoznak: 22 nev alknyvtr pldul a 2-hz, mg a 112 az app-hoz, azaz mindegyik ahhoz legkzelebbi shez, ami webalkalmazs gykereknt funkcionl. Az Application objektum Prbljuk ki! A lock1.asp zrolja s nhny msodpercig zrolva tartja az Application objektumot. Ha a lock1.asp futsnak ideje alatt megnyitjuk a lock2.asp oldalt, az csak a lock1.asp futsnak befejezse utn lesz kpes hozzfrni az Application objektumhoz. Ha mi nem oldannk fel a zrolst, az IIS az oldal vgrehajtsa utn, de legksbb a scriptfuttats idtllpsekor felszabadtja azt. Termszetesen az Application objektum tartalmt is elrhetjk

39

A Microsoft Magyarorszg szakmai magazinja 2001. 04.

Developer
kollekcikon keresztl, erre szolgl az Application.Contents kollekci (contents.asp):
For Each oItem In Application.Contents Response.Write(Application(" & oItem & ") = " & Application(oItem) & "<br>" ) Next

ASP Suli (IV. rsz)

(a krs nem szolglhat ki, az alkalmazs jraindul). Esemnyek a global.asa-ban A global.asa-ban ngy klnfle esemnyt kezel rutint definilhatunk, ezek az Application_OnStart, Application_OnEnd, Session_OnStart, s a Session_OnEnd. Lssunk egy mintt:
<SCRIPT LANGUAGE='VBScript' RUNAT='Server'>

Ebbl a kollekcibl is pontosan ugyangy lehet trlni elemeket, mint a Session-nl is lttuk:
Application.Contents.Remove("counter") Application.Contents.Remove(2) Application.Contents.RemoveAll()

Sub Application_OnStart Application("appstarttime") = Now End Sub

Sub Application_OnEnd ' ...

Az els sor a "counter" rtkt, a msodik sor az Application objektumon belli msodik vltozt, mg a legutols sor az Application objektum teljes tartalmt trlte. Az Application.StaticObjects kollekci a global.asa fjlban az <OBJECT> elem segtsgvel, Application scope-ban ltrehozott vltozkat tartalmazza. A kollekci pontosan gy hasznlhat, mint az Application.Contents:
For Each oItem In Application.StaticObjects Response.Write(Application(" & oItem & ") = " & Application(oItem) & "<br>" ) Next

End Sub

Sub Session_OnStart Session("starttime") = Now Set Session("oFS") = Server.CreateObject("Scripting. FileSystemObject") End Sub

Sub Session_OnEnd Set Session("oFS") = Nothing End Sub

Az egyetlen klnbsg az, hogy ebbl a kollekcibl nem trlhetnk elemeket (azok elvesznek maguktl a webalkalmazs jraindtsakor). A global.asa fjl Mint azt mr a Session objektum ismertetsekor rviden lertam, a global.asa fjl egy specilis llomny, amit az ASP alkalmazs gykrknyvtrban kell elhelyezni (de a hasznlata nem ktelez). A fjl arra val, hogy ebben helyezzk el a globlis objektumokat ltrehoz s esemnyeket kezel kdrszleteket, gyis mint: az Application objektum esemnyeit (ltrehozst, megsemmistst) kezel rutinok (Application_OnStart s Application_OnEnd) a Session objektumok ltrehozst s megsemmistst kezel eljrsok (Session_OnStart s Session_OnEnd) globlis objektumok ltrehozsa az <OBJECT> elem segtsgvel tpusknyvtrak (type libraries) betltse A global.asa fjlban tallhat rutinokat <SCRIPT></SCRIPT> elemek kz kell elhelyezni. A statikus objektumok ltrehozsra szolgl <OBJECT> elemet a <SCRIPT> blokkon kvlre kell elhelyezni, mg a tpusknyvtr-defincik a blokkon kvlre s bellre egyarnt kerlhetnek, de rdemes azt is mr a fjl elejn, a <SCRIPT> blokkon kvl letudni. Ha a global.asa fjl tartalma megvltozik, az IIS minden mr megkezdett kapcsolatot kiszolgl, s csak azok lezrsa utn tlti be az j vltozatot. Ez termszetesen az sszes Session s az Application objektum lezrst s jbli megnyitst is jelenti. A global.asa betltse s feldolgozsa sorn az IIS nem fogad j kapcsolatokat, a felhasznlk ezid alatt csinos kis hibazenettel tallkoznak

</SCRIPT>

Application_OnStart: a webalkalmazs indulsakor, egyszeri alkalommal fut le. Application_OnEnd: az alkalmazs lelltsakor fut le, az alkalmazs letben ugyancsak egyszer Session_OnStart: Session objektum ltrehozsakor, gyakorlatilag minden j felhasznl belpsekor hajtdik vgre Session_OnEnd: ez pedig a Session lezrsakor lp mkdsbe. (pldul ha idtllps vagy Session.Abandon() hvsa miatt az IIS megsznteti a session-t) Nzznk r egy pillanat erejig az Application_OnStart rutinra: runk az Application objektumba, s mgsem zroljuk eltte? Nem lesz ebbl baj? Nem, ugyanis ez az esemny egyszer s csakis egyszer kvetkezik be, mgpedig az alkalmazs lettartama legelejn, amikor msnak mg eslye sincs az Application objektumhoz hozzfrni. Ez az egyetlen hely, ahol nem ktelez hasznlni a Lock/Unlock metdust. Objektumok s tpusknyvtrak Az objektumok ltrehozsnak mdjt a Session lersnl mr megismertk:
<OBJECT RUNAT=Server SCOPE=Application ID="oGFSO" PROGID="Scripting.FileSystemObject">

A klnbsg csak annyi, hogy a scope (futsi, ltrehozsi krnyezet) most nem Session, hanem Application lesz. Ezutn az oGFSO objektumot a webalkalmazs minden scriptjben kzvetlen hivatkozssal elrhetjk, s az megjelenik az Application.StaticObjects kollekciban is. Ismt elmondom, hogy nagyon kell gyelni arra, hogy az Application objektum-

A Microsoft Magyarorszg szakmai magazinja 2001. 04.

40

Developer

ASP Suli (IV. rsz)


Mi trtnik? A buta kd simn visszakldi, amit kapott, bele a HTML kdba. A baj azrt nagy, mert a gyantlan felhasznlt brki egy megfelelen elksztett URL segtsgvel egy ugyancsak gyantlan webkiszolglra irnythatja, s mr fut is a nem vrt script. A msik hasznos kdol metdus a Server.URLEncode(). Mint azt taln mindenki tudja, az URL-ekben nem szerepelhet akrmilyen karakter. Ami nem megszokott, azt kdolni kell, ltalban %xx formban, ahol xx a karakter hexadecimlis kdja. (Mg a szkzt is helyettestik, + jellel). Ha URL-eket ptnk fel az ASP oldalainkban, mindig hasznljuk ezt a metdust is. Az urlenc.asp oldalon kiprblhat a kdolsi mvelet. A Server.MapPath() nagyon gyakran hasznlt metdus. Arra val, hogy a virtulis knyvtr- s fjlneveket (pl. http://localhost/asp4/default.asp) vals fjlnevekk alaktsa (pl. C:\inetpub\wwwroot\asp4\default.asp). A mappath.asp segtsgvel ezt is ki lehet prblni. Ha a MapPath()-nek tadott virtulis nv / vagy \ karakterrel kezddik, akkor a virtulis gykrknyvtrtl, ellenkez esetben pedig a hvs helytl relatv fjlnevekkel dolgozik (nem lesz ugyanaz az eredmnye teht a default.asp s a /default.asp kdolsnak kivve ha ppen a gykrknyvtrban llunk). Termszetesen hasznlhatk a . s .. karakterek, azaz mozoghatunk a virtulis knyvtrak ltal alkotott trben (a . az aktulis, a .. pedig a virtulis szlknyvtrra mutat). A Server.MapPath() metdust nem hasznlhatjuk a global.asa Application_OnEnd esemnynek kezelse kzben, egybknt pedig legynk vatosak, mert a global.asa-ban meghvott MapPath() nem a global.asa, hanem a felhasznl ltal megnyitni kvnt fjl alapjn dolgozik. A Server.ScriptTimeOut belltsval a scriptek idtllpsnek hatrt nvelhetjk meg (ez az rtk nem lehet alacsonyabb, mint a tulajdonsglapokon belltott alaprtelmezs), illetve krdezhetjk le. A Server.Transfer() s a Server.Execute() kt, az IIS5-ben j szolgltats. A Server.Transfer() metdus egyszeren tadja a vezrlst az alkalmazsban tallhat msik .asp kdnak. Minden tvett adat megmarad, tbbek kztt a Request objektum teljes tartalma is. A Server.Transfer() kivlthatja a Response Redirect() hasznlatt, mert ehhez nincs szksg a bngsz kzremkdsre (s gy felesleges hlzati forgalomra). Termszetesen ez a megolds csak akkor mkdik, ha webkiszolgln bell szeretnnk tirnytani a felhasznlt. A Server.Execute() szubrutinszeren vgrehajtja az adott oldalt, majd a vgrehajts befejezsre utn visszatr az eredetihez (mintha csak beszrtuk volna a kdot). Ennek elnye az <!-- include --> kittellel szemben az, hogy itt akr dinamikusan is generlhatjuk a futtatand oldal nevt. A Server.GetLastError() visszaadja az utols ASP hibnak adatait tartalmaz ASPError objektumot. Errl, s az ASP oldalak hibakezelsrl a kvetkez szmunkban lesz sz. Vgl, de egyltaln nem utolssorban: a Server.CreateObject() metdus ltrehoz egy adott objektumot. Ezt mr nagyon sokat hasznltuk, anlkl, hogy tudtuk volna, pontosan mit jelent. Ha a ltrehozott objektum tartalmaz OnStartPage metdust, azt is meghvja.

ban csak Both, free threaded objektumokat troljunk (ha <OBJECT> segtsgvel szeretnnk rossz objektumot ltrehozni, az IIS hibt jelez, a dinamikus ltrehozsnl viszont nem, ott csak ksbb, a fura mkds sorn derlhet fny a problmra). A COM objektumok ltalban tpusknyvtrakat is tartalmaznak. Ezekbl a tpusknyvtrakbl lehet kiolvasni az objektum metdusainak, jellemzinek a listjt, de sokszor mindenfle konstansokat is. Ha pldul egy fjlt meg szeretnnk nyitni olvassra a FileSystemObject segtsgvel, a kvetkezt kell rnunk:
Set oFSO = Server.CreateObject( "Scripting.FileSystemObject") Set oFile = oFSO.OpenTextFile(file.txt", 1)

Ehhez tudnunk kell, hogy az OpenTextFile metdus msodik paramternek 1 rtke az olvasst jelenti (ForReading). Ha azonban a global.asa tetejn megadjuk a kvetkez defincit:
<!--METADATA TYPE="TypeLib" FILE="scrrun.dll"-->

(az scrrun.dll tartalmazza tbbek kztt a FileSystemObject objektumot), akkor gy is rhatjuk::


Set oFSO = Server.CreateObject( "Scripting.FileSystemObject") Set oFile = oFSO.OpenTextFile("file.txt", ForReading)

A szmrtk helyett teht hasznlhatk a tpusknyvtrban definilt konstansok, amelyek sokszor (nagyon sokszor) megknnytik az ember munkjt. A Server objektum A Server objektum is egy s oszthatatlan, s fleg knyelmi szolgltatsai miatt hasznos. Gondoltunk-e mr pldul arra, hogy ezt rjuk ki a felhasznl bngszjbe: Vzszintes vonal: <HR>. Ha ezt elkldjk a bngszbe, megjelenik a felirat, majd maga a vzszintes vonal, hiszen a bngsz rtelmezi a kdban tallhat HTML tagot. Ha a HTML elemet magt szeretnnk megjelenteni, a < jelet &lt; a >-t pedig &gt; entity-vel kell helyettestennk, teht valahogy gy: Vzszintes vonal: &lt;HR&gt;. Ezen kvl mg sok ms elemet is kdolni kell, nem beszlve a specilis karakterekrl. Szerencsre itt van a Server.HTMLEncode() metdus, ami elvgzi ezt a kdolst (htmlenc.asp):
Response.Write( Server.HTMLEncode("Nesze <HR>") )

Hzi feladat: Mirt kellett a htmlenc.asp kdjban a Server.HTMLEncode() metdust dupln hasznlni? A HTMLEncode() azrt is nagyon fontos, mert okos hasznlatval elkerlhetjk az gynevezett Cross Site Scripting [3] hibt. Ezt a fontos biztonsgi hibt az okozza, hogy egyes weboldalak (akr hibazenet formjban is) vlogats nlkl, s kdolatlanul visszakldenek bizonyos, rszkre elzleg tadott szvegrszeket. A crosssite.asp pldul bekri a felhasznl nevt, majd kirja a vonal al. rjuk be nvnek az, hogy: <script> alert('Most formzom a winchesteredet!'); </script>

41

A Microsoft Magyarorszg szakmai magazinja 2001. 04.

Developer
A Server.CreateObject() mellett objektumok ltrehozsra hasznlhatnnk egyszeren a CreateObject() hvst is. Ez utbbi nem az IIS, hanem a scriptmotor szolgltatsa, ezrt hasznlata az ASP oldalakban nhny kivteltl eltekintve nem ajnlott. Az objektum addig marad letben, amg azt nem trljk, illetve az ASP oldal vgrehajtsa vget nem r. Ha az objektumot a Session vagy Application objektumba tltttk, akkor az objektum lete csak az adott Session vagy Application objektum megsznsekor r vget. Egy ltrehozott objektumot gy trlhetnk, ha a vltoznak ms rtket adunk (akr szveget is, de elterjedt s szp megolds a Nothing):
Ltrehozzuk: Set oFSO = Server.CreateObject( "Scripting.FileSystemObject") Megszntetjk: Set oFSO = Nothing

ASP Suli (IV. rsz)

Set oShell = Nothing %>

A fenti pldban (logevent.asp) a Server.CreateObject() metdus segtsgvel ltrehoztunk egy Shell objektumot, elksztettnk nhny bejegyzst, majd j kiscserksz mdjra kitakartottunk magunk utn (az objektumvltoz rtkt Nothing-ra lltva felszabadtjuk az objektum ltal lefoglalt erforrsokat). Az eredmny az brn lthat:

Naplzs az esemnynaplba Nhny rsszel ezeltt bemutattuk a Response.AppendToLog() metdust, amelynek segtsgvel rni lehet az IIS szveges napljba. Az ilyen bejegyzsek feldolgozsa viszonylag nehzkes, radsul ha mg emlksznk vannak olyan naplformtumok is, amikor ez a mdszer nem vezet eredmnyre. Szerencsre a Windows Scripting Host-nak ksznheten a feladatot sokkal elegnsabban is megoldhatjuk. A Windows Scripting Host (s vele egytt termszetesen a teljes WSH objektummodell) mr az Option Pack 4-gyel bekerl(hetet)t a Windows NT 4.0-ba, s azta termszetesen a Windows 2000 scriptprogramozsnak lelkt kpezi. A WSH objektummodelljt szerencsre ASP oldalakbl is elrhetjk (egy ksbbi alkalommal majd sszefoglaljuk a lehetsgek teljes palettjt, aki addig is kvncsi lenne, a WSH objektummodell lerst itt tallja: [4]). Visszatrve a tmhoz, a WScript.Shell objektum LogEvent() metdusa lehetv teszi, hogy belekontrkodjunk a Windows NT/2000 esemnynapljba. (Windows 9x esetn a bejegyzsek a Windows knyvtrban, a wsh.log fjlban jnnek ltre). A LogEvent() metdus hrom paramtert vr, amibl az els kettt ktelez megadni, a harmadiknak pedig csak Windows NT/2000-n van rtelme: A bejegyzs tpusa (0: Success, 1: Error, 2: Warning, 4: Information, 8: Audit Success, 16: Audit Error) A bejegyzs szvege Opcionlisan a Windows NT/2000 szmtgp neve, ahol a bejegyzst ltre kell hozni (termszetesen csak a megfelel jogosultsgok meglte esetn)
<% Set oShell = Server.CreateObject("WScript.Shell")

A WScript.Shell objektum segtsgvel ksztett bejegyzsek az Application Log naplban lthatk A generlt naplbejegyzsek (az audit log is) az esemnynapl Application Log-jba kerlnek, a Source mezben a WSH felirat szerepel. Ha a bejegyzst megnyitjuk, a lers mezben lthatjuk az ltalunk megadott szveget. Flp Mikls mick@netacademia.net

A cikkben tallhat URL-ek: [1] http://technet.netacademia.net/feladatok/asp/4 [2] http://msdn.microsoft.com/library/psdk/iisref/crtc796b.htm [3] http://www.microsoft.com/technet/security/crssite.asp [4] http://msdn.microsoft.com/scripting/windowshost/doc/wshtoc.htm ASP objektummodell-referencia a weben: http://msdn.microsoft.com/library/psdk/iisref/vbob74bw.htm

oShell.LogEvent 0, "Hello from ASP!" oShell.LogEvent 1, "ERROR from ASP!" oShell.LogEvent 2, "Warning from ASP!" oShell.LogEvent 4, "Info from ASP!" oShell.LogEvent 8, "Audit Success from ASP!" oShell.LogEvent 16, "Audit Error from ASP!"

A Microsoft Magyarorszg szakmai magazinja 2001. 04.

42

ASP suli Hibakezels (V. rsz)


Hibtlan szoftver mint tudjuk nem ltezik. Ez a ttel igaz az ASP alkalmazsokra is. Ma az ASP programozs sorn fellp hibk hatkony kezelsrl s elkerlsrl lesz sz. Rendezzk a felsznt Az ASP alkalmazsokban fellp hibk rendszerint kellemes hibazenet formjban jelennek meg a felhasznlnl. Termszetesen nem felttlenl egszsges, ha egy-egy ilyen hibazenet, esetleg kdrszlet nyilvnossgra kerl, ezrt megvan a mdja annak, hogy mikzben mi a hiba kezelst vgezzk a felhasznlt megkmljk a knos rszletektl. Az IIS alaprtelmezse szerint az albbi brn 1 jellel jellt hibazenet-oldal jelentkezik a felhasznlnl, ami egyrszt praktikus, mert szp s sznes, msrszt kellemetlen lehet, hiszen tartalmazza a hiba komplett lerst. Ezt az oldalt egybknt a \winnt\help\iisHelp\common\500-100.asp lltja el.

Business Internet

laszthatjuk az alaprtelmezst is (a Default bellts, illetve Set to Default gomb segtsgvel). Amikor az 500;100 hibhoz nincs belltva kln hibakezel fjl, a webalkalmazs belltsai kztt, az App Debugging oldalon tallhat bellts 5 az irnyad. Ha ezt a belltst az els lehetsgen hagyjuk (Send detailed error messages to client), akkor a 2 pldhoz hasonl hibazenetek jelennek meg a bngszkben. Ezek nem kevsb bbeszdek, mint az alaprtelmezett hibakezel oldal, viszont jval rondbbak: egyszeren a kliens arcba vgjk a hibt. Ha viszont a msik opcit vlasztjuk, megadhatunk egy sajt hibazenetet (ami tartalmazhat HTML elemeket is, ld. az brn). Vgfelhasznli krnyezetben ez az egyik legegyszerbb s legjobb megolds, hacsak nem akarunk sajt hibakezel oldalt rni. rjunk sajt hibakezel oldalt! Ehhez minden tmogatst megkapunk az Internet Information Server-tl: egyrszt a hiba esetn trtn tirnyts lehetsgt (ezt az elbb mr lthattuk), msrszt pedig a hiba felismershez, feldolgozshoz szksges informcikat, az ASPError objektum formjban. Miutn a megfelel knyvtrban belltottuk a hibakezel oldalt a sajtunkra, kezdjnk neki a munknak. Mindenekeltt, ha a pufferba mr rtak, amikor a hiba bekvetkezett, itt az ideje, hogy kirtsk, s a hibakezel oldal tiszta lappal indulhasson:
<%

2 1 3
A Egy hiba hrom arca. Az 1 jel az alaprtelmezs, a 2 egy kztes llapot, a 3 vgfelhasznlknak sznt vltozat Mikzben nyilvn nagyon hasznos a rszletes hibazenet, les krnyezetben ez nem felttlenl igny. Az ASP scriptek vgrehajtsa sorn fellp hibk esetn a teendt a virtulis knyvtr tulajdonsglapjnak Custom Errors oldaln az 500;100 sorhoz tartoz belltsa hatrozza meg. Amint az az albbi brn is lthat 4, alaprtelmezsben a fentebb emltett hibakezel oldalra addik a vezrls.

If Response.Buffer Then Response.Clear

Azutn: a vlasz sttuszt lltsuk be hibazenetre, nehogy valaki azt higgye, hogy ez a valdi oldal:
Response.Status = "500 Internal Server Error"

Majd lltsuk be az oldal tartalmt HTML-re, a lejrati idt 0-ra (gy a gyorsttrak nem fogjk az oldalt letrolni):
Response.ContentType = "text/html" Response.Expires = 0 End If

A kvetkez lps a hibt ler ASPError objektum elcsalogatsa, amit a kvetkezkppen tehetnk meg: A Hibakezelsi belltsok a webalkalmazsban. Az 5 bellts csak akkor rvnyesl, ha a 4-et alaprtelmezsre (Default) lltjuk Ezt a belltst tirnythatjuk valami sajt magunk ltal ksztett hibakezel oldalra (ami mondjuk naplzza is a felmerlt hibkat, ilyet fogunk ltrehozni ksbb), vagy vSet objASPError = Server.GetLastError

Miutn az objektum megvan, belekezdhetnk a jellemzk lekrdezsbe. Az egyes jellemzk jelentse a kvetkez:

A Microsoft Magyarorszg szakmai magazinja 2001. 06.

28

Business internet

ASP suli Hibakezels (V.rsz)


Set oFile = oFSO.OpenTextFile A ("C:\asperror.txt", 8, True) oFile.Write sErrorText & vbCRLF & vbCRLF oFile.Close Set oFSO = Nothing

.Category: a hiba kategrija, szveges jellemz, pl. Microsoft VBScript compilation .Number: a hiba kdja, hexadecimlisan megjelentve sokatmond lehet (r lehet keresni a tudsbzisban) .Description: a hiba lersa, maga a hibazenet .File: a fjl neve, ahol a hiba keletkezett .Line, .Column: a hiba felismersnek sora s oszlopa (ez az adat nem mindig ll rendelkezsre, ilyenkor az egyes jellemzk rtke 1). Vigyzzunk, a hiba felismersnek helye nem felttlenl egyezik meg a hiba helyvel! .Source: a hibt okoz sor kdja. Nem mindig ll rendelkezsre .ASPCode, .ASPDescription: a hiba ASP hibakdja s lersa viszonylag ritkn kapnak rtket lltsunk ssze ezekbl az adatokbl egy hibazenetet, egyenlre egy szveges vltozban, mint ahogy az az errhandler.asp pldafjlban is lthat [1]. Azrt ne rjuk ki a kpernyre, mert egyltaln nem biztos, hogy a felhasznlra tartozik a hiba lersa, jellege s fleg a helye. Miutn a hibazenetet sszelltottuk, eldnthetjk, hogy kirjuk-e a bngszbe, vagy egy illend bocsnatkr szveg keretben elintzzk a dolgot a sznfalak mgtt. n azt a megoldst vlasztottam, hogy a felhasznl lthatja a hibazenetet, de csak akkor, ha a bngsz a kiszolgln fut, azaz a kliens s a szerver IP cme megegyezik. Az ellenrzs pillanatban a hibazenet szvegt mr az sErrorText vltoz tartalmazza:
<% If Request.ServerVariables("LOCAL_ADDR") = _ Request.ServerVariables("REMOTE_ADDR") Or _ Request.ServerVariables("REMOTE_ADDR") = _ "127.0.0.1" Then %> <HR> <PRE> <% Response.Write Server.HTMLEncode(sErrorText) %> </PRE> <% Else %> <P>A hibt naplztuk. Krjk, prblkozzon jra nhny perc mlva.</P> <% End If %>

Ezzel kszen is vagyunk. Felmerlhet (s remlem, van mr, akiben a kd olvassa sorn fel is merlt), hogy a kd gy nem teljes: mi trtnik pldul akkor, ha a naplfjlt valamilyen okbl nem lehet megnyitni (pldul mert ppen ms valaki r bele)? Ilyenkor termszetesen hiba keletkezik. Amikor a hhrt akasztjk A hibakezel rutinban keletkez hiba megoldsa klasszikus feladat. Ilyenkor a hibakezel oldal mr nyilvn nem kpes a szlakat tovbb a kezben tartani, szksg van egy felsbb hatalom beavatkozsra. Esetnkben ez a felsbb hatalom maga az IIS, aki ilyenkor legjobb tudsa szerint a felhasznl el hinti a hibt, valahogy gy:

A Hiba a hibakezelben (a kpek aljn): ilyenkor az IIS hibakezelsi belltsa rvnyes (ld. az elz oldalon: 5) Hibakezels futs kzben A hiba nem mindig vgzetes: az esetek tbbsgben fel tudunk kszlni arra az esetre, ha valami baj trtnne a lnyeg csak a hiba biztonsgos felismerse. A scriptnyelvek ppen ezrt ltalban beptett hibakezelsi elemeket tartalmaznak, amelyeket hasznlva a kisebb hibkat mg a nagyobb problmk bekvetkezte eltt kivdhetjk. A futs kzbeni hibakezel eszkzk kzs tulajdonsga, hogy a hiba kezelse utn a program futtatsa folytatdik. A futs kzbeni hibakezels mr elgg scriptnyelv-specifikus, cikknk keretben a kt beptett nyelv, a VBScript s a JScript elemeivel ismerkedhetnk meg. Kezdjk a VBScript-tel: itt a futs kzbeni hibakezelst mindenekeltt be kell kapcsolni, ha ezt nem tesszk meg, mindenkppen hiba keletkezik. A hibakezels bekapcsolsra a kvetkez parancs hasznlhat:
On Error Resume Next

Vegyk szre a hibazenet kirsnl hasznlt Server.HTMLEncode() fggvnyt. Mint mindig, ismeretlen szveg kirsnl hasznlnunk kell, klnben az esetleg (scriptkdban nagy esllyel) elfordul specilis karakterek megzavarhatjk a HTML kdot gondoljunk csak nhny rtalmatlan kacsacsrre, ami scriptkorban mg matematikai mveletet jelkpezett, most pedig flksz HTML elemeknek rtelmeznnk ket. Kvetkez lpsknt a korbban bemutatott mdszerrel a hibt eltroljuk az Esemnynaplba:
Set oShell = Server.CreateObject("WScript.Shell") oShell.LogEvent 1, "ASP HIBA!" & vbCRLF & sErrorText Set oShell = Nothing

Vgl, biztos, ami biztos, a hibt naplzzuk le egy kznsges szvegfjlba is:
Set oFSO = Server.Createobject A ("Scripting.FileSystemObject")

Azaz kb. Hiba esetn folytasd a vgrehajtst. Ezutn rajtunk ll, hogy kijavtjuk-e a hibt, vagy egyltaln foglalkozunk vele. Mindaddig amg ez a parancs rvnyes (mrpedig abban a procedrban ahol kiadtuk, valamint az abbl hvott procedrkban, rvnyes), a hiba miatt a VBScript nem fog lellni. ppen ezrt a fenti parancsot globlisan kiadni nem tl sszer, a hibakezels bekapcsolst korltozzuk knyes helyekre

29

A Microsoft Magyarorszg szakmai magazinja 2001. 06.

Business internet
oda, ahol fel tudunk kszlni a hibk javtsra. A hiba kezelsre (s felismersre) az Err objektum hasznlhat, amelynek fontosabb jellemzi a kvetkezk: .Number a hiba kdja, az Err objektum taln legfontosabb jellemzje. rtke 0, ha minden rendben van, ettl eltr, ha hiba trtnt. .Description a hiba szveges lersa .Source a hibt okoz objektum azonostja Az elz pldt teht ki kell bvteni:
On Error Resume Next hibt okoz rsz If Err.Number <> 0 Then Hiba a hibakezelben Err.Clear() End If A } A

ASP suli Hibakezels (V.rsz)


keletkezne, a vgrehajts a catch{} blokkban folytatdik. A catch paramtereknt megadott vltoz tartalmazza a hiba lerst, egy Error objektumot. Pldakppen lssuk, hogyan kaphatjuk el a FileSystemObject ltal visszaadott hibt (jserror1.asp):
var oFSO = new ActiveXObject A ("Scripting.FileSystemObject"); try { oFSO.CopyFile("qweqweq.txt", "eqwewqe.txt"); } catch(e) { Response.Write("Error: " + e); Response.Write("<br>Error Number: " + (e.number & 0xFFFF) ); Response.Write("<br>Description: " + e.description);

Miutn egy hibt kezeltnk, az Err objektumot vissza kell lltani a kezdrtkekre, klnben a hibt a kvetkez ellenrz rutin is elkapn. Az Err.Clear() metdust pontosan erre talltk ki. Mi is meghvhatjuk (clszeren a hibakezel rutin vgn), de a VBScript automatikusan meghvja a kvetkez utastsok vgrehajtsa sorn: On Error Resume Next Exit Sub Exit Function azaz, a procedrkbl, fggvnybl trtn visszatrskor, valamint a hibakezels bekapcsolsakor. Ha elegnk volt a knanbl, a futs kzbeni hibk kezelst visszakapcsolhatjuk az
On Error Goto 0

paranccsal. Ilyenkor hiba esetn ismt a jl ismert hibakezelsi megoldsok veszik t az irnytst. Az objektumnak van mg egy rdekes metdusa, ez pedig az Err.Raise(). Ez a fggvny arra val, hogy hibt vltsunk ki a rendszerben. Az Err.Raise() ltal generlt hibk teljes rtkek: prbljuk ki a raise.asp pldaprogram segtsgvel! trycatchfinally A JScript hibakezelse mskpp mkdik, inkbb hasonlt a C nyelvben tallhat trycatch utastsprra. A szintaxis a kvetkez:
try { // hibt okoz mvelet } catch(hibaobjektum) { // hibakezels } finally { // mindenkpp lefut utastsok }

A hiba oka nyilvnval: az aktulis knyvtrban valsznleg nincsen qweqweq.txt nev fjl, amit msolhatnnk, ezrt hiba trtnik. A catch-ben megkapott vltoz egy Error objektumot tartalmaz, errl mr az els sorban kirt [object Error] is tjkoztat minket. A JScript Error objektumnak kt jellemzje van: az Error.number a hiba kdjt, az Error.description a hiba lerst tartalmazza. A hibakd elcsalogatshoz az Error.number ltal visszaadott szmot dekdolnunk kell, erre val a pldban ltott (Error.number & 0xFFFF) kifejezs. A trycatchfinally hrmas utols tagjnak az az rtelme, hogy olyan utastsokat is megadhassunk, amelyek lefutnak fggetlenl attl, hogy a try blokkban trtnt-e hiba, vagy sem. Hiszen gondoljunk bele: hiba esetn a try blokkbl azonnal kiugrunk, az esetleg htralv utastsok mennek a sllyesztbe. Ez a helye az erforrsok, pldul adatbziskapcsolatok felszabadtsnak, lezrsnak. JScriptben is idzhetnk el hibt: a throw() fggvny hvsval hasonl eredmnyt rnk el, mint a VBScript-beli .Raise metdussal. A throw() paramtere a hiba maga, ami lehet egy hibakd, egy szveg, vagy egy elzleg ellltott, s megfelelen kitlttt Error objektum is (jserror2.asp):
var oErr = new Error(); oErr.number = 1234; oErr.description = "User Error"; try { throw(oErr); } catch(e) {

Ha a catch blokkban, a hiba kezelse sorn zskutcba jutunk, s feladjuk a harcot, a munkt tovbb passzolhatjuk az eggyel magasabb szinten tallhat hibakezelnek a throw() fggvnnyel. Paramterknt adjuk neki a catch()-ben tvett vltozt, valahogy gy (jserror3.asp):
catch(e) { Response.Write("Error: " + e); Response.Write("<br>Error Number: " + A (e.number & 0xFFFF) );

JScriptben teht minden hibt okoz mvelet(-csoport) esetn kln fel kell kszlnnk az esetleg elfordul hibk kezelsre, ami azt is jelenti, hogy minden egyes esetben kln meg kell rnunk a hibakezel rutint is. A gyans sorokat a try{} blokkba kell rni. Ha az utastsok vgrehajtsa sorn brmilyen hiba

Response.Write("<br>Description: " +

A Microsoft Magyarorszg szakmai magazinja 2001. 06.

30

Business internet
A } e.description); throw(e);

ASP suli Hibakezels (V.rsz)


A Script Debugger a hiba feldertsre, s nem a script szerkesztsre val, ezrt senkit se lepjen meg a fejlcben olvashat Read only felirat. A debugger a script kdjt tartalmaz mellett hrom klnbz ablakot tartalmaz mg. Az egyik a Call Stack ami a hvsverem aktulis tartalmt jelzi (gyakorlatilag azt, hogy hogyan kerltnk a hibhoz). A msodik, taln kicsit hasznosabb ablak a Command Window, amibe futs kzben parancsokat gpelhetnk (pldul j rtket adhatunk a vltozknak, meghvhatunk fggvnyeket, stb.). Ha egy vltoz vagy fggvny rtkre vagyunk kvncsiak, a kifejezs el rjunk egy ?-et (ami a klasszikus BASIC-ben egybknt a Print parancs rvidtse volt). Ha a hibt JScript-ben keressk, a ? hasznlatra nincs szksg. Ha nemcsak hiba esetn, hanem ltalban is szeretnnk a debuggert hasznlni, kt lehetsgnk van: az els, hogy a debugger indtsra szolgl utastst helyeznk el a kd belsejben. Ez a parancs VBScript esetn a Stop, JScript kdban pedig a debugger; (ld. debug1.asp, debug2.asp). A parancs hatsra a script vgrehajtsa felfggesztdik, elindul a debugger, s a kurzor a parancs sorra ll. A msik lehetsg az, hogy a Script Debugger elindtsa utn a Running Documents ablakban kijelljk a kvnt scriptet, majd rusztjuk a Break at Next Statement parancsot. Amikor legkzelebb a vgrehajts az adott scriptre kerl, elindul a debugger s kezdhetjk a munkt.

A msodik throw() hvs segtsgvel a hibt tovbb passzoltuk az IIS-nek, kzdjn vele . A kzdelem eredmnye a belltsoknak megfelel IIS hibazenet lesz, mintha csak nem is lett volna a trycatch blokk. Hibakeress debugols A futs kzbeni hibk nha vratlanul jnnek, nem kerlnek el egyszeren, de az is elfordulhat, hogy a fejleszts sorn szeretnnk akr soronknt szemmel ksrni a kd futst, a vltozk rtkt. Rgebben ezt legfeljebb gy tehettk meg, ha teleaggattuk a kdot debug zenetekkel, a program kpte a funkcitl fggetlen informcikat, csak gyztk kivlogatni, mi a valsg s mi a debug ltal megjelentett adat. Fejlettebb programozsi krnyezetben szinte mindenhol megtallhat a debugger, mellyel vgrehajts kzben ellenrizhetjk a futsi paramtereket, kvethetjk a program menett, st, mg bele is avatkozhatunk a trtnsekbe. A Microsoft Script Debugger minden j Windows rsze, segtsgvel lehetsgnk van kiszolgloldali .asp, bngszoldali .html, valamint parancssorbl futtatott scriptek debugolsra is, fggetlenl a hasznlt scriptnyelvtl. Vannak persze sokkal fejlettebb eszkzk (gondoljunk csak a Visual Studio kifejezetten erre a clra fejlesztett komponensre, a Visual InterDev-re), de ez mindig rendelkezsre ll, radsul nem kerl kln pnzbe. Fontos, hogy a Script Debugger teleptse utn az adott webalkalmazs belltsai kztt engedlyezzk a kiszolgloldali hibakeresst.

A rgus szemekkel vrunk a scriptre A Running Documents ablakba azok a scriptek kerlnek be, amelyek a bngsz (kliensoldali) illetve az IIS (szerveroldali) motorjba mr betltdtek. Az ASP hibakeresst rtelemszeren a Microsoft Active Server Pages csompont alatt keressk. Ahhoz, hogy egy script itt megjelenjen, be kell tlteni, a hibakeress mdja teht a kvetkez: Internet Explorer-be tltsk be a kvnt oldalt indtsuk el a Script Debugger-t, keressk meg a scriptet s adjuk ki a Break parancsot a bngszben hvjuk le jra az oldalt (Refresh) A Refresh hatsra jra betltd .asp scriptet pedig mr kpes elkapni a debugger s mint az az brn is ltszik a vgrehajts rgtn a script elejn a debugger kezbe kerl. Flp Mikls mick@netacademia.net

A A hibakeress engedlyezse a webalkalmazsok belltsai kztt A Script Debuggert hromflekppen llthatjuk munkba. Mindenekeltt, a hibakeress engedlyezse utn az oldalban trtnt hiba esetn nem a megszokott hibakezel oldalak futnak le, hanem a kiszolgln elindul a Script Debugger, s a vgrehajts mindaddig nem folytatdik, amg valaki a dologra ldst nem adja ezrt fontos, hogy les krnyezetben a hibakeresst mindig tartsuk kikapcsolva.

A cikkben tallhat URL-ek: [1] http://technet.netacademia.net/feladatok/asp/5

A Hiba esetn mr indul is a Script Debugger

31

A Microsoft Magyarorszg szakmai magazinja 2001. 06.

Vous aimerez peut-être aussi