ćwiczenia 14 - Instytutu Informatyki UJ
Transkrypt
ćwiczenia 14 - Instytutu Informatyki UJ
Programowanie w Sieci Internet — filtry oraz web.xml Kraków, 23 stycznia 2015 r. mgr Piotr Rytko Wydział Matematyki i Informatyki Co dziś będziemy robić • Filtry, • wywoływanie filtrów, • wywołania łańcuchowe filtrów, • tagi w web.xml, • przekazywanie context parametrów, • ServletConfig. Filtry Filtry używane są aby przechwycić zapytanie od użytkownika do servletu, lub innego zasobu serwera, i wykonać prace logiczne. Przykładowo filtry używane są najczęściej do autoryzacji użytkowników, kompresji danych, szyfrowania danych, konwersji obrazów, logowania, autentykacji, tokenizacji czy parsowania dokumentów xml etc. Filtry wywoływane są na podstawie zapisów w pliku web.xml i odpowiedniego ich mapowania na zasoby serwera. Filtr to klasa javy implementująca interfejs javax.servlet.Filter Klasa ta posiada 3 metody: • public void doFilter (ServletRequest, ServletResponse, FilterChain) — Metoda ta wywoływana jest za każdym razem, gdy zapytanie pasuje do łańcucha wywołań filtru. • public void init(FilterConfig filterConfig) • public void destroy() Mapowanie Filtrów Aby utworzyć filtr umieszczamy w pliku web.xml tag <filter> a wewnątrz niego: • <filter-name> — nazwa filtru do odwoływania się do niego • <filter-class> — klasa implementująca ten filtr • <init-param> — opcjonalnie parametry inicjalizacyjne: • <param-name> — nazwa parametru • <param-value> — wartość parametru Dodatkowo aby powiązać go z akcją w tagu <filter-mapping>: • <filter-name> — nazwa filtru • <url-pattern> — zapis wzorca zapytania, do którego będzie dopasowany filtr (można go także zastąpić mapowaniem przez <servlet-name>) Można zastosować kilka filtrów do jednego zapytania, tworzymy wtedy tak zwany łańcuch wywołań filtra. Oznacza to, że filtry będą wywoływane łańcuchowo - każdy następny zostanie wywołany gdy poprzedni zakończy swoje działanie - nim zostanie udzielony dostęp do zasobu kryjącego się pod tym adresem. Wywołania łańcuchowe filtrów <filter> <filter-name>LogFilter</filter-name> <filter-class>LogFilter</filter-class> </filter> <filter> <filter-name>AuthenFilter</filter-name> <filter-class>AuthenFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value>Initialization Paramter</param-value> </init-param> </filter> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>AuthenFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> W ten sposób zostanie wywołany wpierw filtr LogFilter, a następnie gdy ten zakończy swoje działanie (może) zostanie wywołany filtr AuthenFilter. Jeśli chcemy to zrobić na odwrót, to wystarczy zamienić miejscami <filter-mapping>: <filter-mapping> <filter-name>AuthenFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> web.xml Plik web.xml pozwala nam na określenie zachowania aplikacji. Na przykład taka prosta sprawa jak ikonka aplikacji: • <small-icon> — pozwala nam określić małą ikonę 16x16 px dla aplikacji lub servletu • <large-icon> — j/w ale dużą ikonę 32x32 px • <listener-class> — (w <listener>) definiuje klasę implementującą listenera (musi być umieszczony on po filtrze ale przed mapowaniem servletu) • <jsp-file> — może być stosowane zamiast <servlet-class>, podaje pełną ścieżkę do pliku jsp reprezentującego stronę • <load-on-startup> — ładuje srevlet przy starcie, opcjonalnie może zawierać liczbę naturalną dodatnią, która określa kolejność wywoływania servletów (bez liczby serwer może wywoływać servlety z tym parametrem losowo • <init-param> — parametry inicjalizacyjne zawierają one dodatkowo: • <param-name> — nazwa parametru • <param-value> — wartość parametru • <description> — opcjonalny opis parametru web.xml c.d. • <mime-mapping> — wiąże rozszerzenie plików z typem mime • <extension> — rozszeżenie np. txt • <mime-type> — typ mime do plików o podanym rozszerzeniu np. text/plain • <welcome-file-list> — lista plików welcome, jeśli niema jednego to próbuje następny • <welcome-file> — plik welcome np. index.html • <error-page> — strony errorów • <error-code> — kod błędu HTTP np. 404 • <exception-type> — klasa błędu rzucanego przez kod java • <location> — adres zasobu do załadowania w wypadku wywołania danego błędu • <taglib> — dla jsp ładuje taglib • <taglib-location> — deskryptor biblioteki (reatywny do głównego katalogu) • <taglib-uri> — adres URI relatywny do położenia pliku web.xml Dodatkowo aby oddzielić konfiguracje dla JSP możemy użyć tagu • <jsp-config> — a tu umieszczamy np. <taglib>...</taglib> Przekazanie parametrów do servletu Aby przekazać parametry do servletu można użyć tagu <context-param>, który jest tagiel globalnym, więc każdy servlet ma do nich dostęp poprzez ServletConfig. <context-param> posiada: • <param-name> — nazwę, po której go wyszukamy • <param-value> — wartość W pliku web.xml: <context-param> ! <param-name>host</param-name> ! <param-value>localhost</param-value> </context-param> <context-param> ! <param-name>port</param-name> ! <param-value>8889</param-value> </context-param> <context-param> ! <param-name>usr</param-name> ! <param-value>root</param-value> </context-param> <context-param> ! <param-name>pass</param-name> ! <param-value>root</param-value> </context-param> <context-param> ! <param-name>driver</param-name> ! <param-value>com.mysql.jdbc.Driver()</param-value> </context-param> ServletConfig Gdy już mamy parametry w pliku konfiguracyjnym, to teraz wystarczy je wciągnąć do servletu. W metodzie init możemy skożystać z ServletConfig i za pomocą metody getServletContext() pobrać kontekst servletu, a z niego za pomocą metody getInitParameter(string) pobrać parametr o nazwie przekazanej przez string. Przykład poniżej pokazuje uzyskanie konfiguracji dla połączenia z bazą danych. W servlecie: public void init(ServletConfig sc) throws ServletException { ! this.servlConf = sc; ! this.host = "jdbc:mysql://" + sc.getServletContext().getInitParameter("host") ! ! ! ! + ":" + sc.getServletContext().getInitParameter("port") + "/?useUnicode=yes&characterEncoding=utf8"; ! this.usr = sc.getServletContext().getInitParameter("usr"); ! this.pass = sc.getServletContext().getInitParameter("pass"); ! this.ses = null; ! this.LOGGED = false; ! this.driver = sc.getServletContext().getInitParameter("driver"); ! this.RSS = sc.getServletContext().getInitParameter("RSS"); } Dziękuję za uwagę!