Webes alkalmazások fejlesztése 6. előadás. Állapotfenntartás (ASP.NET Core) Cserép Máté

Hasonló dokumentumok
Webes alkalmazások fejlesztése 6. előadás. Állapotfenntartás (ASP.NET) Állapotfenntartás. Állapotfenntartás. Állapotfenntartás.

Webes alkalmazások fejlesztése 6. előadás. Állapotfenntartás (ASP.NET) Cserép Máté.

Webes alkalmazások fejlesztése 6. előadás. Állapotfenntartás (ASP.NET) 2015 Giachetta Roberto

Webes alkalmazások fejlesztése 6. előadás. Állapotfenntartás (ASP.NET) 2015 Giachetta Roberto

Webes alkalmazások fejlesztése 7. előadás. Autentikáció és autorizáció (ASP.NET Core) Cserép Máté

Webes alkalmazások fejlesztése 7. előadás. Autentikáció és autorizáció (ASP.NET)

Webes alkalmazások fejlesztése 10. előadás. Webszolgáltatások tesztelése (ASP.NET Core) Cserép Máté

Webes alkalmazások fejlesztése 10. előadás. Szolgáltatás alapú rendszerek megvalósítása (ASP.NET WebAPI) Cserép Máté

Webes alkalmazások fejlesztése 1. előadás. Webes alkalmazások és biztonságuk

Webes alkalmazások fejlesztése 1. előadás. Webes alkalmazások és biztonságuk. Cserép Máté

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET)

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET) Cserép Máté.

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET Core) Cserép Máté

Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

Bevezető. Servlet alapgondolatok

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 5.ELŐADÁS. Sütik és munkamenetek kezelése

Webapp (in)security. Gyakori hibákról és azok kivédéséről fejlesztőknek és üzemeltetőknek egyaránt. Veres-Szentkirályi András

Java és web programozás

Webes alkalmazások fejlesztése. Bevezetés az ASP.NET MVC 5 keretrendszerbe

JAVA webes alkalmazások

Webes alkalmazások fejlesztése 12. fejezet. Szolgáltatás alapú kommunikáció (WCF) Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Enterprise JavaBeans. Ficsor Lajos Általános Informatikai Tanszék Miskolci Egyetem. Az Enterprise JavaBeans

Felhasználói kézikönyv

és az instanceof operátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Enterprise JavaBeans 1.4 platform (EJB 2.0)

Weboldalak Biztonsági Kérdései

WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK

Webes alkalmazások fejlesztése 14. fejezet. Szolgáltatások adatkezelése (WCF) Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Symfony kurzus 2014/2015 I. félév. Security: authentication, authorization, user provider, role-ok, access control, FOS user bundle

1. beadandó feladat dokumentáció

S04-2 Elosztott alkalmazások készítése

Web-fejlesztés NGM_IN002_1

Java. Perzisztencia. ANTAL Margit. Java Persistence API. Object Relational Mapping. Perzisztencia. Entity components. ANTAL Margit.

DDNS szolgáltatás beállítása NVR P2P elérésének beállítása

Az Egységes Pályázati Keretrendszer használata (akadémiai könyv- és folyóiratkiadási támogatás elnyerésére a 2014.

Webes alkalmazások fejlesztése

Webes alkalmazások fejlesztése 2. előadás. Webfejlesztés MVC architektúrában (ASP.NET) Webfejlesztés MVC architektúrában Fejlesztés ASP.

Függőség injekció Konstantinusz Kft 2010

OOP #14 (referencia-elv)

Se S r e ial a iza z t a ion o n (in n Ja J v a a v ) a Szerializáció

Szoftvertechnolo gia gyakorlat

Model View Controller alapú alkalmazásfejlesztés

COMET webalkalmazás fejlesztés. Tóth Ádám Jasmin Media Group

API tervezése mobil környezetbe. gyakorlat

A JGrid rendszer biztonsági architektúrája. Magyaródi Márk Juhász Zoltán Veszprémi Egyetem

Programozás III KIINDULÁS. Különböző sportoló típusok vannak: futó, magasugró, focista, akik teljesítményét más-más módon határozzuk meg.

HÁLÓZATI HASZNÁLATI ÚTMUTATÓ

Grafikus keretrendszer komponensalapú webalkalmazások fejlesztéséhez

Java programozási nyelv 5. rész Osztályok III.

Felhasználói dokumentáció a teljesítményadó állományok letöltéséhez v1.0

A gyakorlat során az alábbi ábrán látható négy entitáshoz kapcsolódó adatbevitelt fogjuk megoldani.

Adatbázisok elleni fenyegetések rendszerezése. Fleiner Rita BMF/NIK Robothadviselés 2009

DDNS szolgáltatás beállítása NVR P2P elérésének beállítása

Ingyenes DDNS beállítása MAZi DVR/NVR/IP eszközökön

Java és web programozás

Segédanyag: Java alkalmazások gyakorlat

Titkosítás NetWare környezetben

Programozási nyelvek Java

DCOM Áttekintés. Miskolci Egyetem Általános Informatikai Tanszék. Ficsor Lajos DCOM /1

Java és web programozás

Szoftvertechnológia alapjai Java előadások

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

Java Servlet technológia

Eseménykezelés. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor.

Már megismert fogalmak áttekintése

WEBFEJLESZTÉS 2. MUNKAMENET-KEZELÉS, HITELESÍTÉS

Webes alkalmazások fejlesztése. 9. előadás Bevezetés az ASP.NET MVC keretrendszerbe

Java Server Pages - JSP. Web Technológiák. Java Server Pages - JSP. JSP lapok életciklusa

Az autorizáció részletes leírása

Osztályok. 4. gyakorlat

A Java EE 5 plattform

Programozási nyelvek Java

BEJELENTKEZÉS AZ EPK RENDSZERÉBE

Java programozási nyelv 4. rész Osztályok II.

Hiteles Elektronikus Postafiók

Java V. Osztályszint. lyszintű ű tagok. Példányváltozó. Osztályváltozó. Általános Informatikai Tanszék Utolsó módosítás:

C++ programozási nyelv

1/9. Sunell IP kamerák webes felületének használati útmutatója. Élő kép (Live Video)

JavaServer Pages (JSP) (folytatás)

Példa webáruház kialakítás rendszerdokumentáció

Abstract osztályok és interface-ek. 7-dik gyakorlat

Objektumorientált programozás C# nyelven

Interfészek. PPT 2007/2008 tavasz.

ENTERPRISE PORTAL. Egy modern portál esetén

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 2.ELŐADÁS. Objektumorientált programozás

Szerializáció. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Szerializáció / 22

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Testreszabott alkalmazások fejlesztése Notes és Quickr környezetben

1. ábra Fájl feltöltése 2. ábra Megtekintés

ASP.NET CORE MVC Model réteg bevezetése Model Binding Repository tervezési minta Dependency Injection Transient és Singleton Custom Binding AutoMapper

Albacomp RI Rendszerintegrációs Kft Székesfehérvár, Mártírok útja 9. E K O P - 1. A. 2 - A D A T Á L L O M Á N Y O K

A JavaServer Pages (JSP)

S, mint secure. Nagy Attila Gábor Wildom Kft.

Java VI. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. Java VI.: Öröklődés JAVA6 / 1

Elektronikus levelek. Az informatikai biztonság alapjai II.

Hálózati operációs rendszerek II.

Átírás:

Eötvös Loránd Tudományegyetem Informatikai Kar Webes alkalmazások fejlesztése 6. előadás Állapotfenntartás (ASP.NET Core) Cserép Máté mcserep@inf.elte.hu http://mcserep.web.elte.hu

A HTTP protokoll A HTTP protokoll a kérés/válasz paradigmára épül, vagyis a kliens elküld egy kérést, amelyre a szerver (alkalmazás) válaszol a kérések egymástól függetlenül kerülnek kiszolgálásra minden kiszolgáláshoz külön objektumok jönnek létre, amelyek előállítják a választ, majd megsemmisülnek kérés válasz kliens vezérlő példányosítása eredmény HTML összeállítása ELTE IK, Webes alkalmazások fejlesztése 6:2

Eszközök Két kérés között sokszor szeretnénk megőrizni az állapotot pl. a felhasználó bejelentkeztetése, az űrlap mezők kitöltései objektumokkal erre nincs lehetőség (a mezők megsemmisülnek), osztályszinten pedig nincs garancia a megőrzésre Az állapotot a szerver speciális eszközökkel tudja fenntartani kliens oldalon: elérési útvonal, weblap értékei (űrlapmezők, rejtett mezők), sütik szerver oldalon: egy kliensre: munkamenet minden kliensre: alkalmazás ELTE IK, Webes alkalmazások fejlesztése 6:3

Munkamenet állapotok A munkamenet (session) egy kliens weblapon történő tartózkodása, és közben végrehajtott tevékenységei minden kliens rendelkezik (pontosan) egy saját munkafolyamattal a szerveren automatikusan elindul, amikor a kliens először kérést küld a szerverre automatikusan végződik, amikor a kliens egy megadott ideig nem intéz kérést, ezt egy időzítő felügyeli, amely minden kéréssel újraindul (session timeout) a klienst a kérés paraméterei (IP cím, böngésző, süti, ) alapján azonosítja, ami meghamisítható (session hijacking) ELTE IK, Webes alkalmazások fejlesztése 6:4

Munkamenet állapotok kliens kérés munkamenet indul munkamenet folytatódik időzítő indul időzítő újraindul munkamenet vége munkamenet indul időzítő lejár időzítő indul ELTE IK, Webes alkalmazások fejlesztése 6:5

Munkamenet állapotok A munkamenetet a szerver oldalon a Startup osztályban kell konfigurálni és hozzáadni a webalkalmazáshoz: meg kell adnunk a munkamenetek tárolásához használt cache-t, használhatunk pl. memóriabeli tárolást: services.adddistributedmemorycache(); Támogatott a relációs adatbázis és a Redis cache is. adjuk hozzá a munkamenet kezelést a szolgáltatásokhoz: services.addsession(); Itt paraméterezhetjük is a munkamenet működését, pl. az IdleTimeout tulajdonsággal állítható a munkamenet lejárati ideje (alapértelmezetten 20 perc) az app.usesession(); utasítással használjuk a beállított munkamenet szolgáltatást. ELTE IK, Webes alkalmazások fejlesztése 6:6

Munkamenet állapotok A munkamenethez szerver oldalon bármikor hozzáférhetünk a vezérlő/nézet Session tulajdonságán keresztül, vagy máshol a HttpContext.Session tulajdonságon keresztül ebben kulcs/érték párokként elhelyeztünk az adott kliensre vonatkozó adatokat, amelyeket a szerver a memóriában tárol (a munkafolyamat megszűnéséig), pl.: Session.SetString("myKey", mystring); Session.SetInt32("myKey", myinteger) Session.Set("myKey", mybytearray); a munkamenet azonosítója a Session.Id tulajdonsággal kérhető le az adatokhoz a kliens nem férhet hozzá ELTE IK, Webes alkalmazások fejlesztése 6:7

Munkamenet állapotok Komplex típus munkamenetben történő tárolása is megvalósítható kiterjesztő metódusok (extension methods) által, például JSON szerializáció révén: public static class SessionExtensions { public static void Set<T>(this ISession session, string key, T value) { session.setstring(key, JsonConvert.SerializeObject(value)); } public static T Get<T>(this ISession session, string key) { var value = session.getstring(key); return value == null? default(t) : JsonConvert.DeserializeObject<T>(value); } }); ELTE IK, Webes alkalmazások fejlesztése 6:8

Adattitkosítás Az adatlopás elkerülése végett fontos, azonosításra szolgáló adatokat mindig kódoltan tároljuk az adatbázisban a kódoláshoz egyirányú kódoló algoritmusokat használunk (pl. MD5, SHA1, SHA512), amelyek nem fejthetőek vissza, viszont azonosítósára használhatóak a kódoló eljárások a System.Security.Cryptography névtérben helyezkednek el a kódolás előtt és/vagy után célszerű megsózni a jelszót (password salt), azaz tegyünk bele extra karaktereket és byte-okat, hogy megnehezítsük a jelszó visszakeresését a só lehet fix, véletlenszerű, vagy időfüggő, ilyenkor magát a sót is eltárolhatjuk az adatbázisban ELTE IK, Webes alkalmazások fejlesztése 6:9

Adattitkosítás Pl.: String pwdtext = // jelszó szöveges alakja SHA512CryptoServiceProvider coder = // SHA512 kódoló objektum Byte[] pwdbytes = coder.computehash( Encoding.UTF8.GetBytes(pwdText)); // kódolás végrehajtása a szövegből kiolvasott // UTF8 értékeken, az eredmény 160 bites lesz Byte[] storedbytes = // kinyerjük az eltárolt kódolt jelszót if (pwbytes.sequenceequals(storedbytes)) { } // ha a kettő megegyezik, jó a jelszó ELTE IK, Webes alkalmazások fejlesztése 6:10

Példa Feladat: Valósítsuk az utazási ügynökség weblapjának felhasználó kezelési funkcióját. a felhasználók regisztrálhatnak, és adataikat foglaláskor automatikusan kitölti a weblap a regisztráció nem kötelező, az újonnan megadott adatok a korábbiak szerint mentődnek (automatikusan generált felhasználónévvel) egy új vezérlőben (AccountController) kezeljük a regisztráció (Register), bejelentkezés (Login) és kijelentkezés (Logout) funkciókat a regisztráció és a bejelentkezés megfelelő nézeteket kapnak, űrlapokkal ELTE IK, Webes alkalmazások fejlesztése 6:11

Példa a funkciókat az AccountService osztály hajtja végre, amely megvalósítja az IAccountService interfészt a bejelentkezés, kijelentkezés és regisztráció mellett lekérhetjük egy adott vendég adatait (GetGuest), és létrehozhatunk vendéget regisztráció (felhasználói adatok) nélkül (Create) a nézetmodell bővül a bejelentkezés (LoginViewModel), illetve a regisztráció (RegistrationViewModel) adataival mivel több adat közös a foglalás és a regisztráció között, egy ősosztályba (GuestViewModel) általánosítunk ELTE IK, Webes alkalmazások fejlesztése 6:12

Függőség befecskendezés A végrehajtás során egy réteg (client) által használt szolgáltatás (service) egy, az adott körülmények függvényében alkalmazható megvalósítása kerül alkalmazásra A szolgáltatás konkrét példánya meghatározható függőség befecskendezés segítségével, amely során egy külső programkomponens (injector) állapítja meg a függőséget injector client «interface» service service ELTE IK, Webes alkalmazások fejlesztése 6:13

Függőség befecskendezés A szolgáltatások befecskendezése szükségessé teszi a megvalósítás statikus (fordítási időben) történő ismeretét, ez korlátozza a program hasznosítását nem változtatható a megvalósítás futás közben, noha a körülmények változhatnak nem bővíthető a program újabb megvalósítással Az IoC tároló (IoC container) egy olyan Inversion of Control paradigmájú komponens, amely lehetőséget ad szolgáltatások megvalósításának dinamikus (futási idejű) betöltésére egy központi regisztráció, amelyet minden programkomponens elérhet, és felhasználhat ELTE IK, Webes alkalmazások fejlesztése 6:14

IoC tároló a típusokat (elsősorban) interfész alapján azonosítja, és az interfészhez csatolja a megvalósító osztályt a tárolóba történő regisztrációkor megadjuk a szolgáltatás interfészét és megvalósításának típusát (vagy példányát) a szolgáltatást interfész alapján kérjük le, ekkor példányosul a szolgáltatás vagy kapunk egy már létező példányt amennyiben a szolgáltatásnak függősége van, a tároló azt is példányosítja Az ASP.NET Core keretrendszer egy általánosan használható IoC tárolót biztosít, lehetővé téve a szolgáltatások regisztrációját, lekérést és konstruktoron keresztüli befecskendezését (constructor injection) ELTE IK, Webes alkalmazások fejlesztése 6:15

Szolgáltatások regisztrációja az ASP.NET Core IoC tárolójába A szolgáltatásokat a Startup osztályban regisztráljuk, egyben megadjuk a szolgáltatás példányok élettartamát, amely lehet: transient: minden kérésre új példányosítás scoped: egy oldallekéréshez egy példányosítás singleton: alkalmazás szinten egyetlen példányosítás a Singleton (egyke) tervezési mintát követve Pl.: services.addtransient<imyservice, MyService>(); Az AddDbContext és a Configure eljárások a szolgáltatás regisztráció speciális esetei adatbázis kontextus és alkalmazás konfigurációs osztályok regisztrálására. ELTE IK, Webes alkalmazások fejlesztése 6:16

Szolgáltatások lekérése az ASP.NET Core IoC tárolójából A regisztrált szolgáltatások egy megfelelő példányát lekérhetjük manuálisan a service provider GetService vagy a GetRequiredService metódusával, utóbbi kivételt vált ki sikertelenség esetén. pl.: services.getservice<imyservice>(); Ezt alkalmaztuk a DbIntializer osztály esetében is. Kényelmesebb megoldást nyújt a szolgáltatások konstruktoron keresztüli befecskendezése, ilyenkor a szolgáltatások lekérése a keretrendszer által automatikus. Ezt alkalmaztuk többek között a vezérlőkbe a modell szolgáltatás osztályok befecskendezésekor is. ELTE IK, Webes alkalmazások fejlesztése 6:17

Alkalmazás állapotok Az egész web alkalmazásra vonatkozó, globális információkat egy tetszőleges osztályban tárolhatunk, amelyet egyszer, az alkalmazás teljes élettartamára, singleton módon példányosítunk. pl.: services.addsingleton<imyapplicationstate, MyApplicationState>(); Amennyiben csak egyetlen implementáció létezik, nem szükséges interfészt kiemelni az osztályból. pl.: services.addsingleton<myapplicationstate>(); ELTE IK, Webes alkalmazások fejlesztése 6:18

Alkalmazás állapotok Az alkalmazás állapotát reprezentáló osztályból lekérhetünk egy példányt konstruktoron keresztüli befecskendezéssel. public class HomeController { MyApplicationState _state; public HomeController(MyApplicationState state) { _state = state; } // akciók }; Mivel egy singleton objektumhoz párhuzamosan többen hozzáférhetnek, ezért kezelni kell az adatok esetleges konkurens módosítását. ELTE IK, Webes alkalmazások fejlesztése 6:19

Alkalmazás állapotok webalkalmazás alkalmazásállapot munkamenet 1 állapot munkamenet 2 állapot munkamenet n állapot vezérlő 1 vezérlő 2 vezérlő n kliens 1 kliens 2 kliens n ELTE IK, Webes alkalmazások fejlesztése 6:20

Sütik A HTTP süti olyan információgyűjtemény, amelyet a kliens eltárol egy fájlban, így az oldal későbbi látogatása során a felhasználóra vonatkozó adatok abból visszatölthetőek a sütik adott webcímre vonatkoznak, rendelkeznek névvel valamint egy tárolt szöveges értékkel, pl.: HttpContext.Response.Cookies.Append("MyCookie", value, options); megadhatunk lejáratot, amely elteltével a süti törlődik, pl.: var options = new CookieOptions { Expires = DateTime.Now.AddDays(10) }; az adott webcímhez tartozó sütiket a böngésző automatikusan továbbítja a kérésben ELTE IK, Webes alkalmazások fejlesztése 6:21

Sütik Sütiket a vezérlőben kezelhetjük a kéréssel küldött sütiket a Request.Cookies gyűjteményben találjuk, pl.: String value = Request.Cookies["MyCookie"]; a válaszhoz sütiket a Response.Cookies gyűjteménybe helyezhetjük, pl.: Response.Cookies.Append("MyCookie", value); sütit úgy törölhetünk, hogy az érvényességét lejárt időpontra állítjuk (és így a böngész kitörli), vagy: Response.Cookies.Delete("MyCookie"); A munkafolyamatok klienseinek beazonosításához is sütiket használunk, ez a munkafolyamat süti (neve alapértelmezetten.aspnetcore.session) ELTE IK, Webes alkalmazások fejlesztése 6:22

Sütik Pl.: [HttpPost] public IActionResult LoginUser(UserData user){ if (user.remberme) { // ha kérte az azonosító megjegyzését Response.Cookies.Append( "username", user.username, new CookieOptions { Expires = DateTime.Today.AddDays(365) }); // egyedi azonosítót elküldünk a kliensnek } return View( ); } ELTE IK, Webes alkalmazások fejlesztése 6:23

Sütik [HttpGet] public IActionResult LoginUser(){ UserData user = // amikor legközelebb betölti az oldalt if (Request.Cookies.ContainsKey("uid")) { // és megjegyeztette az azonosítót } user.username = Request.Cookies["userName"]; // beállítjuk előre az azonosítót } return View(user); ELTE IK, Webes alkalmazások fejlesztése 6:24

Sütik biztonságos kezelése Mivel a sütik szolgáltatják a kliens oldali információtárolás (és benne a munkamenet tárolás) alapját, különösen figyelni kell a biztonságukra felhasználói adatokat (különösen jelszavakat) direkt módon ne tároljuk sütiben a sütik tartalmát kódolhatjuk, vagy helyettesíthetjük speciális azonosítókkal szabályozható, hogy kliens oldali szkriptek ne férjenek hozzá a sütihez (HttpOnly) szabályozható, hogy csak biztonságos (TSL/SSL) kapcsolat esetén továbbítódjanak (Secure) ELTE IK, Webes alkalmazások fejlesztése 6:25

Sütik biztonságos kezelése Amennyiben sütiket használunk a felhasználó azonosítására, különös tekintettel kell lennünk a biztonságra az információt osszuk el több sütibe jelszavak helyett használjunk egyedi azonosítókat, tokeneket (Guid), amelyeket mindkét oldalon eltárolunk az azonosítót cserélhetjük minden bejelentkezéssel a felhasználói azonosítók mellett tárolhatunk felhasználóspecifikus információkat a HttpContext és a Request tulajdonság számos információt tartalmaz a kliensről (Connection.RemoteIpAddress, Request.Host, ), amik szintén elmenthetőek (kódolva) a sütibe ELTE IK, Webes alkalmazások fejlesztése 6:26

Állapotkezelés szolgáltatásokban A HttpContext tulajdonság a vezérlőkben (Controller osztály leszármazottai) érhető el. Egyéb osztályban, pl. egy modell szolgáltatásban egy IHttpContextAccessor objektum befecskendezésével férhetünk hozzá. Az alapértelmezett HttpContextAccessor típus általi implementáció regisztrációja automatikus. pl.: public class SomeService { private readonly HttpContext _httpcontext; public SomeService(IHttpContextAccessor accessor) { _httpcontext = accessor.httpcontext; } } ELTE IK, Webes alkalmazások fejlesztése 6:27

Példa Feladat: Valósítsuk az utazási ügynökség weblapjának felhasználó kezelési funkcióját. lehetőséget adunk a felhasználónak a bejelentkezés megjegyzésére az azonosító megjegyzéséhez sütit használunk, amelyet bejelentkezést követően továbbítunk a felhasználónak (a sütiben a felhasználónevet tároljuk) a felületen megjelenítjük az oldalt böngésző felhasználók számát, ezt alkalmazás állapotban tároljuk ELTE IK, Webes alkalmazások fejlesztése 6:28

Példa Feladat: Valósítsuk az utazási ügynökség weblapjának felhasználó kezelési funkcióját. a munkafolyamat és az alkalmazásállapot kezelését áthárítjuk az AccountService osztályra, így a vezérlő mentesül az állapotkezeléstől a konstruktor ellenőrzi a sütit, és tölti be a munkafolyamatba tulajdonságok segítségével kérdezzük le az aktuális felhasználót (CurrentUserName), illetve a felhasználók számát (UserCount) az alkalmazás szintű állapotot az ApplicationState osztály singleton példányában tároljuk ELTE IK, Webes alkalmazások fejlesztése 6:29