Пайдаланушы сеансында күйін сақтайтын веб-қосымшалар үшін бұл дұрыс па?

Java әлемінде көптеген веб фреймворктар бар болса да, олардың барлығы тікелей немесе жанама түрде Java Servlets негізіне негізделген. Java Servlets API бағдарламасы пайдаланушының бірнеше сұраулары бойынша деректерді сақтау мүмкіндігін беретін HttpSession және ServletContext нысандары арқылы күйді басқаруды қоса, пайдалы мүмкіндіктер жинағын қамтамасыз етеді. Дегенмен, веб-қосымшалар үшін көптеген қолданбаларда жасырын қателерді тудыратын ортақ нысандарды өңдеуді реттейтін бірнеше нәзік (және негізінен құжатталмаған) ережелер бар. Нәтижесінде, пайдаланушы сеансында күйін сақтайтын көптеген веб-қосымшаларда шатастыратын жағдайлар мен мәселелер бар.

Пайдалану мерзімі шектеулі контейнерлер

ServletContext, HttpSession және HttpRequest сыныптарының даналары Java Servlets спецификациясында ауқымды контейнерлер деп аталады. Олардың әрқайсысында қолданбаға қолданатын деректерді жазуға және оқуға мүмкіндік беретін getAttribute() және setAttribute() әдістері бар. Бұл контейнерлердің айырмашылығы олардың өмірлік циклінің ұзақтығында. Мысалы, HttpRequest жағдайында деректер сұрау өңделіп жатқанда ғана сақталады; HttpSession ішінде деректер пайдаланушы мен қолданба арасында сеанс болған кезде ғана сақталады; ServletContext жағдайында деректер қолданбаның бүкіл қызмет ету мерзімінде болады.

HTTP протоколы пайдаланушы сұраулары арасында азаматтығы жоқ тұрақтылықты қамтамасыз етпейтіндіктен (тұрғылықты жері жоқ), қызмет ету мерзімі шектеулі контейнерлер күйі бар веб-қосымшаларды жасау үшін өте қажет; ал сервлет контейнері қолданбаның күйін және онда пайдаланылатын деректердің өмірлік циклін басқаруға жауапты. Техникалық сипаттамада нақты көрсетілмегенімен, пайдаланушы сеансының ұзақтығымен немесе бүкіл қолданбаның қызмет ету мерзімімен шектелген контейнерлер ағынмен қауіпсіз болуы керек, өйткені getAttribute() және setAttribute() әдістерін кез келген уақытта әртүрлі ағындардан шақыруға болады. (Спецификация бұл контейнерлерді іске асырудың жіпке қауіпсіз болуын нақты талап етпейді, бірақ бұл нысандар ұсынатын қызметтердің табиғаты талап етеді.)

Шектеулі қызмет мерзімі бар контейнерлер веб-қосымшаларды басқа әлеуетті артықшылықпен қамтамасыз етеді: контейнер қолданбаның репликациясын және ауыстырылуын қолданбаға ашық түрде басқара алады.

Сеанс

Сеанс – бұл белгілі бір клиенттің серверге жіберген сұрауларының және веб-серверден алынған жауаптардың тізбегі. Пайдаланушылар веб-сайттардан өздерінің аутентификация мәліметтерін, қоржынының мазмұнын және өткен сұраулар кезінде әртүрлі пішіндерге енгізілген ақпаратты есте сақтауын күтеді, бірақ HTTP протоколының өзі күйді қолдамайды, сондықтан сұрау туралы барлық ақпарат онда болуы керек. . Сондықтан, бір реттік сұраудың қызмет ету мерзімінен ұзағырақ болатын өнімді пайдаланушы әрекеттесуін ұйымдастыру үшін сеанс күйі басқа жерде сақталуы керек. Java Servlets жүйесі әрбір сұрауды сеанспен байланыстыруға мүмкіндік береді және сол сеансқа қатысты деректерді сақтау үшін HttpSession интерфейсін қамтамасыз етеді (деректер кілт/мән жұптары ретінде сақталады). Листинг 1 тұтынушының сатып алу себетін HttpSession нысанына сақтайтын стандартты код үзіндісін көрсетеді: