{"id":43,"date":"2013-03-11T20:01:46","date_gmt":"2013-03-11T19:01:46","guid":{"rendered":""},"modified":"2018-09-17T21:55:59","modified_gmt":"2018-09-17T19:55:59","slug":"servlety-filtre-a-java","status":"publish","type":"post","link":"https:\/\/spireng.sk\/en\/servlety-filtre-a-java\/","title":{"rendered":"Servlety, filtre a Java"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"imgp_img\" style=\"float: left; margin: 2px 5px;\" src=\"\/sites\/default\/files\/imagepicker\/1\/asd54s.png\" alt=\"Obr\u00e1zok\" width=\"200\" height=\"134\" \/>Ak za\u010dnete pracova\u0165 s aplika\u010dn\u00fdmi servermi postaven\u00fdmi na Jave, sk\u00f4r alebo nesk\u00f4r sa stretnete s technol\u00f3giou servletov. Servlet je v podstate Java trieda, ktor\u00e1 nejako roz\u0161iruje mo\u017enosti servera alebo v \u0148om vytv\u00e1ra nov\u00fa slu\u017ebu. Servlety m\u00f4\u017eu fungova\u0165 pre r\u00f4zne protokoly, ale pomerne \u010dasto sa vyu\u017e\u00edvaj\u00fa spolu s protokolom HTTP. Tak ako pr\u00eddu Servlety, m\u00f4\u017ee pr\u00eds\u0165 \u010dasom aj probl\u00e9m, \u017ee chcete zmeni\u0165 spracovanie po\u017eiadavky alebo v\u00fdsledku pr\u00e1ce servletu bez toho, aby ste zasiahli do neho samotn\u00e9ho (lebo nechcete alebo nem\u00f4\u017eete). Na\u0161\u0165astie aj na to sa myslelo, a preto si teraz nie\u010do povieme o servlet filtroch.<!--more--><\/p>\n<p><!--break-->V z\u00e1sade servlet predstavuje slu\u017ebu, ktor\u00e1 pr\u00edjme nejak\u00fd vstup a m\u00f4\u017ee vygenerova\u0165 nejak\u00fd v\u00fdstup. Pre jednoduchos\u0165 budeme uva\u017eova\u0165 v \u010fal\u0161\u00edch odsekoch, \u017ee ide o HTTP po\u017eiadavku. Tak\u00fato po\u017eiadavku si viete predstavi\u0165 ako mno\u017einu inform\u00e1ci\u00ed, ktor\u00e1 pr\u00edde na server, tam sa tieto inform\u00e1cie vyhodnotia, vygeneruje sa odpove\u010f a t\u00e1 sa po\u0161le sp\u00e4\u0165. Filtre, o ktor\u00fdch tu budem teraz hovori\u0165, je mo\u017en\u00e9 nasadi\u0165 na aplika\u010dn\u00fd server, a tak odchyti\u0165 tieto mno\u017einy inform\u00e1ci\u00ed a nejako ich pozmeni\u0165 predt\u00fdm alebo potom, ne\u017e ich spracuje server.<\/p>\n<p>Rozhranie <em>javax.servlet.Filter<\/em> je s\u00fa\u010das\u0165ou Java EE API, a teda by ho mal pozna\u0165 ka\u017ed\u00fd spr\u00e1vny javovsk\u00fd server. Obsahuje tri met\u00f3dy, z ktor\u00fdch je najpodstatnej\u0161ia <em>doFilter<\/em><span style=\"font-style: normal;\">, ktor\u00e1 z\u00edska v parametroch objekt reprezentuj\u00faci po\u017eiadavku, objekt pre odpove\u010f a tie\u017e objekt typu <\/span><em>FilterChain<\/em><span style=\"font-style: normal;\">, \u010do je re\u0165az objektov, ktor\u00e9 bud\u00fa \u010falej spracov\u00e1va\u0165 po\u017eiadavku. <\/span><em>doFilter<\/em><span style=\"font-style: normal;\"> je presne t\u00e1 met\u00f3da, v ktorej viete overi\u0165, \u010di m\u00e1 po\u017eiadavka spr\u00e1vne bezpe\u010dnostn\u00e9 inform\u00e1cie (a zak\u00e1za\u0165 \u010fal\u0161ie spracovanie, ak nie), alebo ju presmerova\u0165 na in\u00fa adresu, pr\u00edpadne \u010doko\u013evek, \u010do budete potrebova\u0165 (a java to umo\u017e\u0148uje). Podstatn\u00e9 je, aby ste pre \u010fal\u0161ie spracovanie po\u017eiadavky zavolali met\u00f3du <\/span><em>doFilter<\/em><span style=\"font-style: normal;\"> nad objektom <\/span><em>FilterChain<\/em><span style=\"font-style: normal;\">. Asi u\u017e tu\u0161\u00edte, pre\u010do m\u00e1 t\u00e1to trieda \u201eChain\u201c v n\u00e1zve. Je to preto, lebo reprezentuje re\u0165az tak\u00fdchto filtrov, ktor\u00e9 sa postupne volaj\u00fa a objekty reprezentuj\u00face po\u017eiadavku si postupne posielaj\u00fa, a\u017e ten posledn\u00fd filter (resp. java server) po\u0161le \u00fadaje servletu. Tak\u017ee tie\u017e z toho vypl\u00fdva, \u017ee filtrov m\u00f4\u017ee by\u0165 viac, a vtedy by ste mali ma\u0165 pomerne jasno v tom, v akom porad\u00ed s\u00fa usporiadan\u00e9 (ako dosiahnete ur\u010dit\u00e9 usporiadanie je u\u017e z\u00e1visl\u00e9 na konkr\u00e9tnej implement\u00e1cii servera). To poradie m\u00f4\u017ee by\u0165 niekedy d\u00f4le\u017eit\u00e9, preto\u017ee napr\u00edklad potrebujete najprv overi\u0165, \u010di m\u00e1 po\u017eiadavka spr\u00e1vne inform\u00e1cie z poh\u013eadu zabezpe\u010denia a a\u017e potom urobi\u0165 jej presmerovanie.<\/span><\/p>\n<p>Ok. Tak\u017ee m\u00e1te met\u00f3du <em>doFilter<\/em> v\u00e1\u0161ho filtra a v nej vol\u00e1te <em>doFilter<\/em> nad objektom <em>FilterChain<\/em>. \u010co sa stane po tom, ako to zavol\u00e1te? V\u00e1\u0161 filter bude \u010daka\u0165. Bude \u010daka\u0165, k\u00fdm objekty, po\u017eiadavky a odpovede prelez\u00fa cez v\u0161etky filtre a\u017e do servletu a vr\u00e1tia sa sp\u00e4\u0165. A to presne v opa\u010dnom porad\u00ed. A teda v nejakom momente met\u00f3da <em>doFilter<\/em> nad re\u0165azou filtrov skon\u010d\u00ed a vy sa op\u00e4\u0165 nach\u00e1dzate v k\u00f3de v\u00e1\u0161ho filtra, tentokr\u00e1t s objektami po\u017eiadavky a v\u00fdsledku po spracovan\u00ed servletom. To je druh\u00fd moment, kedy m\u00f4\u017ee by\u0165 filter u\u017eito\u010dn\u00fd. Viete napr\u00edklad do v\u00fdsledku prida\u0165 nejak\u00fa inform\u00e1ciu, ktor\u00e1 m\u00f4\u017ee s\u00favisie\u0165 s bezpe\u010dnos\u0165ou, upravi\u0165 <em>cookies<\/em> alebo nie\u010do podobn\u00e9. Po skon\u010den\u00ed va\u0161ej met\u00f3dy <em>doFilter<\/em> e\u0161te m\u00f4\u017ee nasledova\u0165 k\u00f3d filtrov, ktor\u00e9 boli pred vami a potom sa u\u017e v\u00fdsledok odo\u0161le klientovi.<\/p>\n<p>Filtrom teda viete vykona\u0165 nejak\u00fa zmenu pred t\u00fdm a po tom, ako po\u017eiadavku spracuje servlet, pr\u00edpadne in\u00e9 filtre, ktor\u00e9 s\u00fa v re\u0165azci za vami. \u010co ale robi\u0165, ak chcete ovplyvni\u0165 samotn\u00fd proces spracovania niekde ni\u017e\u0161ie v re\u0165azi alebo v samotnom servlete, a to op\u00e4\u0165 len pomocou filtra? U\u017e ur\u010dite tu\u0161\u00edte, \u017ee som t\u00fato ot\u00e1zku polo\u017eil, lebo sa nie\u010do tak\u00e9 d\u00e1. A rob\u00ed sa to pomocou objektov po\u017eiadavky a odpovede, ktor\u00e9 som tu u\u017e spom\u00ednal ale zatia\u013e som o nich ve\u013ea nepovedal.<\/p>\n<p><span style=\"font-style: normal;\">Ke\u010f\u017ee Java je \u010diste objektov\u00fd jazyk, tak filter dost\u00e1va inform\u00e1cie po\u017eiadavky a odpovede vo forme objektov. S\u00fa to objekty, ktor\u00e9 implementuj\u00fa dve rozhrania: <\/span><em>ServletRequest<\/em><span style=\"font-style: normal;\"> a <\/span><em>ServletResponse<\/em><span style=\"font-style: normal;\"> (alebo konkr\u00e9tnej\u0161ie rozhrania od nich odvoden\u00e9). Z tak\u00fdchto objektov potom viete z\u00edskava\u0165 data, meni\u0165 ich a hlavne preposiela\u0165 \u010falej do re\u0165aze filtrov. Ako v\u00e1m ale pom\u00f4\u017eu pri ovplyvnen\u00ed spracovania po\u017eiadavky? Tu prich\u00e1dza na sc\u00e9nu n\u00e1vrhov\u00fd vzor <\/span><em>Decorator<\/em><span style=\"font-style: normal;\">. <\/span><\/p>\n<p><em>Decorator<\/em> je vzor z rodiny zaba\u013eovac\u00edch (wrapper) vzorov. Jeho hlavn\u00fd \u00fa\u010del je zabali\u0165 p\u00f4vodn\u00fd objekt do nov\u00e9ho objektu, ktor\u00fd navonok silne pripom\u00edna p\u00f4vodn\u00fd (mal by ma\u0165 minim\u00e1lne v\u0161etky met\u00f3dy ako p\u00f4vodn\u00fd), ale z\u00e1rove\u0148 prid\u00e1va nejak\u00e9 spr\u00e1vanie naviac (alebo men\u00ed existuj\u00face spr\u00e1vanie). Dos\u0165 to pripom\u00edna dedenie, preto\u017ee z\u00edskavate objekt podobn\u00fd p\u00f4vodn\u00e9mu, pri\u010dom m\u00f4\u017eete pozmeni\u0165 spr\u00e1vanie, ale v tomto pr\u00edpade ide o asoci\u00e1ciu (p\u00f4vodn\u00fd objekt je vnoren\u00fd v novom), \u010do je v\u00e4zba, ktor\u00e1 sa za behu d\u00e1 meni\u0165. Tvorcovia Javy s tak\u00fdm nie\u010dim u\u017e r\u00e1tali, a preto pripravili triedy <em>ServletRequestWrapper<\/em> a <em>ServletResponseWrapper<\/em> (pr\u00edpadne ich konkr\u00e9tnej\u0161ie podoby <em>HttpServletRequestWrapper<\/em> a <em>HttpServletResponseWrapper<\/em>). To s\u00fa triedy, ktor\u00e9 u\u017e dan\u00fd vzor implementuj\u00fa, ale neprid\u00e1vaj\u00fa ni\u010d naviac. Vy si len zvol\u00edte spr\u00e1vnu triedu, od nej odvod\u00edte svoju (m\u00f4\u017eete pou\u017ei\u0165 aj anonymn\u00e9 met\u00f3dy) a uprav\u00edte spr\u00e1vanie v prekrytej met\u00f3de (alebo prid\u00e1te nejak\u00fa met\u00f3du nov\u00fa).<\/p>\n<p>Samotn\u00e9 vytvorenie tak\u00fdchto objektov nesta\u010d\u00ed. Potrebujete ich e\u0161te posla\u0165 do spracovania a v tomto bode op\u00e4\u0165 prich\u00e1dzaj\u00fa na sc\u00e9nu filtre. Met\u00f3da <em>doFilter<\/em> je presne t\u00e1 met\u00f3da, kde si viete vytvori\u0165 in\u0161tanciu va\u0161ej decorator triedy, zabali\u0165 do nej p\u00f4vodn\u00fa po\u017eiadavku alebo odpove\u010f a posla\u0165 ju v re\u0165azi filtrov \u010falej. Takto va\u0161e objekty putuj\u00fa \u010falej cez filtre a v z\u00e1vislosti pod\u013ea typu servletu a\u017e do neho, pri\u010dom v\u00e1\u0161 k\u00f3d, ktor\u00fd je v nich obsiahnut\u00fd, umo\u017e\u0148uje meni\u0165 ich spr\u00e1vanie pri tomto spracovan\u00ed.<\/p>\n<p>Filtre a zaba\u013eovacie objekty s\u00fa mocn\u00e9 n\u00e1stroje na to, ke\u010f chcete ovplyvni\u0165 spr\u00e1vanie sa servera. Spolu s modul\u00e1rnou \u0161trukt\u00farou, ktor\u00e1 v\u00e1m umo\u017e\u0148uje server jednoducho prida\u0165 a odobra\u0165, vytv\u00e1raj\u00fa podmienky, v ktor\u00fdch viete \u013eahko meni\u0165 spr\u00e1vanie servera bez toho, aby ste museli zasiahnu\u0165 hlboko do jeho implement\u00e1cie.<\/p>","protected":false},"excerpt":{"rendered":"<p>Ak za\u010dnete pracova\u0165 s aplika\u010dn\u00fdmi servermi postaven\u00fdmi na Jave, sk\u00f4r alebo nesk\u00f4r sa stretnete s technol\u00f3giou servletov. Servlet je v podstate Java trieda, ktor\u00e1 nejako roz\u0161iruje mo\u017enosti servera alebo v \u0148om vytv\u00e1ra nov\u00fa slu\u017ebu. Servlety m\u00f4\u017eu fungova\u0165 pre r\u00f4zne protokoly, ale pomerne \u010dasto sa vyu\u017e\u00edvaj\u00fa spolu s protokolom HTTP. Tak ako pr\u00eddu Servlety, m\u00f4\u017ee pr\u00eds\u0165 [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[],"class_list":["post-43","post","type-post","status-publish","format-standard","hentry","category-vyvoj-softveru"],"_links":{"self":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/43","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/comments?post=43"}],"version-history":[{"count":2,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/43\/revisions"}],"predecessor-version":[{"id":199,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/43\/revisions\/199"}],"wp:attachment":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/media?parent=43"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/categories?post=43"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/tags?post=43"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}