Лабораторный практикум по Java для МТИ. Лабораторная работа №3



Содержание

 

Лабораторная работа №3
Настройка и подключение фильтров в веб-приложении

Цель работы

  1. Расширить знания по созданию лисенеров и веб-фильтров.
  2. Запустить приложение в серверной среде и проверить работу лисенеров и вебфильтров.

Программное обеспечение

  1. Eclipse
  2. Maven 3
  3. JDK 1.6
  4. Jetty

Необходимая теоретическая подготовка

  • Понимание технологии Servlets из Java EE.
  • Понимание теории создания лисенеров веб-приложения.
  • Понимание теории создания веб-фильтров.
  • Понимание теоретических причин использования и создания лисенеров и вебфильтров в приложениях.

Теоретическая часть

Сервлетный фильтр – это Java код, применимый для повторного
использования и позволяющий изменять содержание HTTP-запросов,
ответов и различную информацию, в заголовках HTML.

Основная цель сервлетного фильтра это занимается предварительной обработкой
запроса и/или последующей обработкой ответа, исходящего от сервлета.
Сервлетные фильтры используются для:

  • перехватывания инициации сервлета до того, как сам сервлет будет инициирован;
  • определения содержания запроса;
  • изменения http заголовков и данных из запроса;
  • модификации заголовков и данных ответа, в которые складывается получаемый ответ;
  • перехвата обработки сервлета после обращения к нему.

Примеры вызова сервлета с использованием фильтра и без использования приведены
ниже.Рисунок 14. Примеры вызова сервлета без фильтров и с их использованием

Фильтр может быть сконфигурирован так, что он будет обрабатывать один сервлет
или группу сервлетов. Базой для создания фильтров служит интерфейс javax.servlet.Filter, который должен реализовывать три метода (см. рисунок ниже).

Рисунок 15. Методы javax.servlet.Filter

В итоге, сервер вызывает метод init один раз, чтобы запустить фильтр, а после
вызывает метод doFilter столько раз, сколько запросов будет передано к данному
фильтру.
Ниже приведен экземпляр сервлетного фильтра.

import javax.servlet.*;
import java.io.IOException;
/**
*/
public class SimpleServletFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain)
throws IOException, ServletException {
String active = request.getParameter(«active»);
if(!»blockTheRequest».equals(active)){
filterChain.doFilter(request, response);
}
}
public void destroy() {
}
}

После того, как класс-фильтр создан, его следует установить в контейнер и «приписать»
к одному или нескольким сервлетам . Объявление и подключение фильтра проводится
в дескрипторе web.xml внутри элементов <filter> и <filter-mapping>. Для
подключения фильтра к сервлету следует использовать теги <filter-name> и
<servlet-name>.
Ниже приведен пример объявления фильтра.

<filter>
<filter-name>myFilter</filter-name>
<filter-class>servlets.SimpleServletFilter</filter-class>
</filter>

Ниже приведен пример подключения фильтра к сервлету.

<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>*.simple</url-pattern>
</filter-mapping>

В приведённом коде дескриптора web.xml объявлен класс-фильтр FilterConnect
с именем myFilter. Фильтр myFilter в разделе <filter-mapping> подключен к сервлету
ServletName.
Порядок, по которому контейнер сервлетов выстраивает цепочку фильтров для запроса,
определяется следующим набором правил:

  • цепочка, определяемая шаблоном url, выстраивается в таком порядке, в котором
    встречаются описания фильтров в web.xml;
  • последовательность сервлетов, заданных с помощью servlet-name, выполняется
    в аналогичной последовательности, в какой эти элементы присутствуют в дескрипторе
    web.xml.

Для связи фильтра с пользовательскими страницами HTML или группой сервлетов
следует использовать тег <url-pattern>. Фильтр будет применен ко всем вызовам.
Ниже приведен пример подключения фильтра к HTML-страницам.

<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>

Практическая часть
1. Необходимо открыть ранее созданное веб-приложение и создать новый package в
структуре в src/main/java с название com.test.servlet.filters.MyFirstFilter (см. рисунок
ниже).

Рисунок 16. Создание нового package в структуре в src/main/java

Код должен иметь следующее содержание:

import javax.servlet.*;
import java.io.IOException;
/**
*/
public class MyFirstFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain)
throws IOException, ServletException {
System.out.println(“MyFirstFilter is running!”);
filterChain.doFilter(request, response);

}
public void destroy() {
}
}

2. В web.xml следует настроить фильтры для работы по указанному url.

<filter>
<filter-name>MyFirstFilter</filter-name>
<filter-class>com.test.servlet.filters.MyFirstFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFirstFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>

3. Запустить приложение и проверить работу фильтра по указанному url в web.xml.
4. Создать собственный фильтр для приложения в соответствии с указанным вариантом
задания.

Вариант 1. Создать фильтр, который:

  • читает 3 входящих параметра (имя, фамилия, отчество);
  • логирует их в консоль.

Если один из параметров пустой, требуется отобразить html-страницу с ошибкой.

Вариант 2. Создать фильтр, который:

  • читает параметр в виде имя картинки-файла;
  • логирует параметр в консоль.

Если параметр пустой, требуется отобразить html-страницу с ошибкой.

Отчет о выполнении работы
1. Файлы исходного кода реализованной логики.

Вопросы для самопроверки
1. Для чего нужны фильтры?
2. Как создается последовательность из фильтров?
3. Что произойдет, если не вызывать метод doFilter в фильтре?

Литература
1. http://www.bsu.by/Cache/pdf/87983.pdf – книга сервлетам.
2. http://theopentutorials.com/examples/java-ee/servlet/how-to-create-a-servlet-with-eclipseand-tomcat/ – создание фильтров с нуля.

Узнать сколько стоит решение этого задания
(ответ в течение 5 мин.)
X