Різниця між фільтром і слухачем у сервлеті (Java EE)


Відповіді:


82

Фільтр сервлетів використовується для моніторингу запиту та відповіді від клієнта на сервлет, або для модифікації запиту та відповіді, або для аудиту та журналу.

Слухач сервлетів використовується для прослуховування подій у веб-контейнерах, наприклад, коли ви створюєте сеанс, або розміщуєте атрибут у сеансі, або якщо ви пасивуєте та активуєте в іншому контейнері, щоб підписатися на ці події, ви можете налаштувати слухач web.xml, наприклад приклад HttpSessionListener.


2
І також нічого не варто, що слухачі реалізують javax.servlet.ServletContextListener, тоді як фільтри реалізують javax.servlet.Filter
Дейд

Ви можете пояснити це мені? ServletRequestListenerпрослуховує ServletRequestEventподію, яка запускається для кожного вхідного запиту. Якщо я хочу зареєструвати агент користувача для кожного запиту до мого веб-додатку, чи слід використовувати цей прослуховувач або фільтр?
arun

1
@BalusC Чи є визначення слухача обов’язковим? Це призводить до помилки, No WebApplicationContext found: no ContextLoaderListener registered?якщо я не визначаю слухача у своєму додатку Spring.
Напівкровний принц

хм, я насправді не розумію, чому вам потрібно буде слухати, коли створюється сеанс, або слухати, коли створюється атрибут у сеансі. Чи можете ви навести приклад того, коли ви використовували слухач у будь-яких програмах, які ви розробляли?
Джонатан Лаліберте,

35

Фільтри використовуються для запитів попереднього та подальшого процесу. Подивіться на javax.servlet.Filterjavadoc у своєму контейнері tomcat / jboss / other.

Де слухачі схожі на тригери, які можна приєднати до подій на вашому сервері додатків (давайте використаємо тут термін контейнер). За допомогою прослуховувачів ви можете відстежувати рівень додатків, рівень сеансу, зміни життєвого циклу, зміни атрибутів тощо. Реалізовані інтерфейси - це javax.servlet.Listenerінтерфейс.

Спираючись на відповіді @fnt нижче, дозвольте мені спробувати пояснити ще. Слухачі орієнтовані на зміни життєвого циклу без необхідності надходження запиту клієнта. Отже, для одного запиту клієнта може статися набагато більше подій життєвого циклу, перш ніж запит буде утилізовано. Приклад: Ви хочете зареєструвати всі сеанси, що закінчились. Зверніть увагу, що SesionTimeout - це подія життєвого циклу, яка може відбутися, не вимагаючи від користувача чогось робити. Для такого сценарію доречним буде слухач.

До питання реєстрації, коли надходить запит. Немає прямого відображення нового запиту на еквівалентну подію слухача (читання події життєвого циклу). І отже, для кожного вхідного запиту, якщо ви хочете щось записати, фільтр, на мій погляд, є правильним для використання.

Цей матеріал від Oracle повинен мати можливість пояснити ще деякі фільтри та слухачі

HTH


1
Отже, якщо ви хочете щось записати про кожен запит, слід використовувати його ServletRequestListenerчи фільтр?
arun

1
@Ayusman Ймовірно, для цього твердження потрібне обґрунтування
ᄂ ᄀ

@fnt, оскільки arun запитував реєстрацію за запитом, я думаю, що фільтр відповідає рахунку.
Аюсман,

1
@Ayusman Ви все ще не пояснили, чому слід віддати перевагу фільтру. За допомогою прослуховувача запиту можна однаково зробити те саме.
ᄂ ᄀ

1
@fnt дуже добре, у своєму минулому досвіді я використовував фільтри для реєстрації. Чому? Я думаю, що конвенція більше за все. Хоча для цього завдання можуть бути використані і слухачі.
Мукул Трипаті

23

Фільтр подібний до водного фільтра, де вхідні (запит) і вихідні (відповідь) значення будуть фільтруватися.

Слухач - це як прослуховування (тригер) - коли це буде потрібно, я буду виконаний


21

Одну важливу відмінність часто не помічають: у той час як слухачі спрацьовують для фактичного фізичного запиту, фільтри працюють з відправленнями контейнерів сервлетів. Для одного виклику слухача може бути кілька викликів фільтрів / сервлетів.

Слухачі проти фільтрів

Картування фільтрів типів диспетчера . Посилання трохи застаріле - воно не включає Asyncтип диспетчера Servlet 3.0 . Можна також вказати типи диспетчера з @WebFilterанотацією:

import javax.servlet.DispatcherType;
import javax.servlet.annotation.WebFilter;

@WebFilter(servletNames = { "My Servlet" },
    dispatcherTypes = { DispatcherType.REQUEST, DispatcherType.FORWARD })

11

Текст з Java EE 6

Фільтр

Фільтр - це об’єкт, який трансформує запит і відповідь (заголовок, а також вміст).

Слухачі

Ви можете відстежувати події життєвого циклу сервлета і реагувати на них, визначаючи об'єкти слухача, методи яких викликаються, коли відбуваються події життєвого циклу.


8

Прочитавши всі відповіді та блоги, це я отримав

Фільтр

Фільтр - це об’єкт, який динамічно перехоплює запити та відповіді для перетворення або використання інформації, що міститься у запитах чи відповідях.

Зазвичай фільтри не створюють відповідей, а натомість забезпечують універсальні функції, які можна "приєднати" до будь-якого типу сервлету або сторінки JSP.

Фільтр запускається до подання подання, але після надання відповіді контролера.

Фільтр використовується у веб-шарі лише так, як це визначено в web.xml.

Фільтри більше підходять, коли розглядають ваш запит / відповідь як систему чорних ящиків. Вони працюватимуть незалежно від того, як реалізований сервлет.

Фільтри використовуються для виконання таких завдань фільтрації, як аутентифікація входу в систему, аудит вхідних запитів з веб-сторінок, перетворення, реєстрація, стиснення, шифрування та дешифрування, перевірка введення тощо.

Фільтр сервлетів використовується лише у веб-шарі, ви не можете використовувати його поза веб-контекстом.

Детальніше про фільтр http://array151.com/blog/servlet-filter/

Слухач

Слухач сервлетів використовується для прослуховування подій у веб-контейнері, наприклад, коли ви створюєте сеанс або розміщуєте атрибут у сеансі, або якщо ви пасивуєте та активуєте в іншому контейнері, щоб підписатися на ці події, ви можете налаштувати слухач у web.xml , наприклад, HttpSessionListener.

Слухачі запускаються для фактичного фізичного запиту, який може бути приєднаний до подій на вашому сервері додатків. За допомогою прослуховувачів ви можете відстежувати зміни на рівні програми, сеансу, життєвого циклу, зміни атрибутів тощо

Ви можете відстежувати події життєвого циклу сервлета та реагувати на них, визначаючи об'єкти слухача, методи яких викликаються, коли відбуваються події життєвого циклу.

Детальніше: http://array151.com/blog/servlet-listener/

і ось різниця http://array151.com/blog/difference-between-servlet-filter-and-servlet-listener/


4

Хоча ви можете змінити поточний об'єкт події в межах прослуховувача, ви не можете зупинити виконання поточного обробника події в прослуховувачі. Ви також не можете очистити чергу подій усередині слухача. Окрім нав'язаних відмінностей у можливостях, вони також призначені для різних цілей. Слухачі, як правило, фокусуються на взаємодії між обробником подій та моделлю, тоді як фільтри, як правило, фокусуються на взаємодії між обробником подій та контролером.

Джерело: веб


3

Ви можете легко мати приблизне уявлення з англійським значенням цих двох.

Фільтр існує для фільтрації вмісту / ресурсу, який надходить / виходить із сервлету. З іншого боку, Listener тут, щоб робити деякі пов’язані речі, коли щось трапляється з веб-додатком (прослуховування).


2

Фільтр: Фільтр - це просто Фільтрування відповіді та запиту, що надходить від клієнтів до сервлету.

Слухач: схожий на тригер, коли виникає будь-який тригер, він вживає дії.


1

Коротко,

Фільтр призначений для сервлету, перехоплюючи запити та відповіді.

Слухач призначений для веб-програми, виконуючи важливі завдання щодо подій на рівні контексту, сеансу тощо.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.