ć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ę!

Podobne dokumenty