Фильтры в ColdFusion MX

Существует очень много точек соприкосновения между ColdFusion и Javа, но одна из них многим может дать большие перимущества и возможности (даже тем, кто не знаком с Java) - это фильтры в CFMX.

Фильтр - это Java программа, которая может быть обработана перед и/или после ColdFusion шаблона. Фильтры не просто обрабатывают какой-то участок кода, они могут манипулировать HTTP запросами, а также могут менять способ обработки ColdFusion страницы. Кроме того, они могут управлять HTTP ответами ColdFusion шаблона.

Схема процесса обработки страниц с участием фильтров
Схема процесса обработки страниц с участием фильтров.

Нет особой необходимости самим создавать фильтры, т.к. большое их количество уже написано разработчиками сервлетов и JSP. Нам остается лишь воспользоваться тем, что есть. Впрочем, ничто не мешает нам создавать и свои собственные фильтры.

Для отладки фильтров можно использовать любые редакции ColdFusion MX (даже Developer), использовать встроенный web-сервер или внешний, например, IIS или Apache.

 

Чем фильтры отличаются от Application.cfm и OnRequestEnd.cfm?

Принцип работы фильтров очень похож на то, как работают Application.cfm и OnRequestEnd.cfm, но фильтры имеют ряд дополнительных преимуществ. Недостатками Application.cfm и OnRequestEnd.cfm являются:

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

 

Когда фильтры увеличивают традиционные возможности ColdFusion?

Когда фильтр запускается, то мы можем лучше контролировать процесс его работы , чем Application.cfm или OnRequestEnd.cfm. В некотором конфигурационном фале CFML (рассмотрим этот файл позже) мы можем обозначить фильтр для определенного адреса (URL). Таким образом, фильтр можно применять:

  1. К одной странице;
  2. Ко всем страницам в данной директории и поддиректориях;
  3. Ко всем страницам определенного типа;
  4. Ко всем страницам на данном сервере.
Попробуйте это сделать с помощью Application.cfm! Фильтры также можно применять не только к страницам ColdFusion, но и, например, к файлам HTML или графическим файлам.

Поскольку фильтры управляемы через конфигурационные файлы, а не через CFML код, то мы также можем:

  1. Определять множество адресов (URL) для одного фильтра;
  2. Определять один фильтр для множества адресов;
  3. Добавлять/удалять/Изменять фильтры не затрагивая CFML код;
  4. Применять изменения в фильтре к нескольким приложениям.
Помните, что фильтры могут обрабатывать как входящий запрос, так и исходящий ответ (HTML результат, например) CF или JSP страницы. Что может делать фильтр с входящим запросом? Вот некоторые возможные действия:
  1. Отслеживать посетителей и записывать информацию в log;
  2. Блокировать обработку страницы в течении некоторого времени;
  3. Блокировать посетителей с определенного домена;
  4. Подсчитывать действия посетителей при их доступе к определенным ресурсам;
  5. Кэшировать и повторно использовать отработанные страницы;
  6. Изменять ходящий запрос перед его обработкой CFML кодом;
  7. Производить проверку браузера для составления соответствующего ответа страницы;
  8. Изменять кодировку запроса.
Конечно, некоторые из этих вещей можно делать в файле Application.cfm, но они уже могут быть написаны как сервлеты и сохранить время на разработку приложения. А также, следует помнить преимущество фильтров в том, что они могут быть применены для определенных страниц.

Что может делать фильтр ответа страницы? Вот некоторые из тех решений, которые могут быть использованы перед тем, как вернуть ответ пользователю:

  1. Записать в log время обработки страницы;
  2. Локализация (формирование ответа с учетом локали пользователя);
  3. Изменение формата графического изображения;
  4. Трансформация возвращаемых XML данных;
  5. Шифрование;
  6. Сжатие данных (gzip).
Я упомянул, что фильтры могут быть написаны и использованы с помощью JSP и сервлетов. Существуют сайты, на которых можно найти много уже готовых и полезных фильтров. На таких сайтах как http://www.jsptags.com и http://www.servletsuite.com есть очень много решений, но ColdFusion разработчикам могут понравиться только некоторые из них, например: Последний фильтр в этом списке Фильтр сжатия для многих может быть интересен и, поэтому, на его примере рассмотрим как можно работать с фильтрами. Этот фильтр сжатия также называют Zip или gzip фильтр и предназначен он для сжатия ответа web-страницы, что ускоряет ее загрузку для пользователя. Браузер клиента преобразует данные в нормальное состояние и отображает их как обычно.

ColdFusion страницы печально известны тем, что после отработки CFML кода в них остаются пустые пробелы, поэтому фильтр сжатия для нас как нельзя кстати. Хорошая новость заключается в том, что большинство браузеров (даже относительно старые) поддерживают декомпрессию. Кроме того, фильтр сжатия будет определять параметр accept-encoding в HTTP заголовке запроса, который показывает, поддерживает ли браузер клиента декомпрессию. При необходимости, значение этого параметра можно и самим проверить с помощью переменной cgi.http_accept_encoding. Поскольку процесс компрессии и декомпрессии занимает некоторые ресурсы процессора (CPU) на стороне сервера и на стороне клиента соответственно, то можно применять этот фильтр к не очень большим страницам.

Тем не менее, для большинства обычных страниц фильтр сжатия является очень полезной вещью. С помощью программы WebServer Stress Tool я обнаружил, что обычная сжатая страница имела размер в байтах в 4 раза меньше, чем не сжатая.

Стоит заметить, что как Apache, так и IIS оба поддерживают свои собственные способы сжатия, которые при правильном использовании могут дать ощутимую выгоду. Кстати, о HTTP-компрессии в IIS 5.0 можно почитать по адресу http://http://www.tsyapa.ru/http-compression/index.htm. Но, если у вас ни Apache, ни IIS не имеют установленные фильтры сжатия, то тогда подойдет фильтр сжатия для CFMX. Будет замечательно, если в будущем Macromedia встроит в ColdFusion этот фильтр сжатия и сделает его более доступным через административный модуль. Но, пока этого не произошло, мы рассмотрим наш пример использования фильтра.

 

Как применить фильтр?

Применить фильтр необычайно легко. Если вы посетите упомянутые выше сайты, то увидите там описания фильтров, ссылки для их скачивания и пример их использования, написанный на JSP. Большинство из них даже не содержат примеров на JSP, т.к. им не важно для каких страниц они применяются.

Поскольку фильтры пишут на Java, то представляют они собой файлы с расширением JAR (Java Archive - Java Архив). Но нам нужно знать только то, куда нужно положить этот файл и как обозначить его в ColdFusion MX. Все действия осуществимы в 4 шага:

Шаг 1: Ищем и загружаем фильтр:

Загрузить рассматриваемый нами фильтр сжатия можно по адресу www.servletsuite.com/servlets/gzipflt.htm.

Шаг 2: Располагаем фильтр в нужном каталоге сервера:

Полученный файл кладем в папку cfusionmx\wwwroot\WEB-INF\lib. Не имеет значения, какой web-сервер вы используете: встроенный или внешний - папка cfusionmx\wwwroot всегда существует и в ней вы найдете подпапки WEB-INF\lib. Это то самое место, где все Java программы расцениваются как сервлеты и фильтры, если они запакованы в JAR файлы. Если вам попадется фильтр, который является файлом с расширением class или java, то его нужно положить в папку cfusionmx\wwwroot\WEB-INF\classes. Если загруженный вами файл имеет расширение WAR (Web Archive), то такой файл можно открыть архиватором WinZip и достать оттуда нужные файлы.

Шаг 3: Обозначаем фильтр в ColdFusion MX (конфигурация XML):

На странице, с которой вы скачаете фильтр, будет указано, что далее в файле web.xml нужно указать ссылку на этот фильтр. Файл web.xml находится в папке cfusionmx\wwwroot\WEB-INF. Для рассматриваемого здесь фильтра сжатия в этом файле нужно добавить следующие строки:
Заметьте, что тег <url-pattern> определяет адрес страницы, к которой нужно применять данный фильтр. В нашем случае это будут все страницы с расширением cfm во всех директориях. Вы можете дополнительно добавить тег <filter-mapping>, чтобы обозначить дополнительные адреса к файлам.

Некоторые возможные значения тега <url-pattern>:

Например, чтобы применить фильтр только к директории test в корневой папке web-сайта, то адрес будет “/test/*.cfm” или просто “/test/”.

Естественно, перед редактированием файла web.xml, рекомендуется сохранить его последнюю рабочую версию. Таким образом, вы сможете вернуть настройки в случае, если сервер не будет запускаться.

Как-то я прочел, что теги filter, filter-mapping, servlet, sevlet-mapping должны быть обозначены в файле web.xml именно в такой последовательности. Но на практике замечено, что все прекрасно работает и без соблюдения это правила.

Если у вас несколько разных фильтров обозначены на один и тот же адрес, то все они будут обрабатываться в той последовательности, в которой указаны в фале web.xml. Сначала JRun определяет все одинаковые адреса в теге <url-pattern>, а затем последовательно обрабатывает теги <filter-name> и <servlet-name>.

Шаг 4: Перезапуск ColdFusion MX сервера:

Последним шагом нужно перезапустить сервер, т.к. фильтры не будут работать без его перезагрузки. ColdFusion MX сервер распознает фильтры только во время загрузки.

Впрочем, ColdFusion может и сам автоматически распознавать и компилировать сервлеты (а значит и фильтры). Но эту возможность следует использовать только на компьютере разработчика, т.к. автоматическая компиляция занимает некоторые ресурсы компьютера. Чтобы активизировать эту функцию, следует:

  1. Отредактировать файл cfusionmx\wwwroot\WEB-INF\jrun-web.xml. Внутри тега <jrun-web-app> можно добавить:
  2. Перезапустить сервер.

 

Ссылки на материалы для более глубокого изучения фильтров

Внимание: все ссылки предназначены для Java разработчиков. Материалы на английском языке.

 

Заключение

Эта статья - краткое введение в фильтры. Мы не рассматривали Java код, а только научились использовать готовые решения. Фильтры - достаточно мощное и легко используемое средство. Не обязательно знать Java, чтобы использовать их, т.к. уже есть не мало готовых решений. Существует много ресурсов, где можно получить информацию о том, как их можно создавать. По этой и другим темам вы можете ознакомиться с моими презентациями.


Источник: Fun with Filters in CFMX
Перевод: Пушкарев В.А. для www.cfug.ru

 


Hosted by uCoz