Різниця між перехоплювачем і фільтром у Spring MVC


108

Я трохи розгублений Filterі щодо Interceptorцілей.

Як я зрозумів з docs, Interceptorвиконується між запитами. З іншого боку Filter, запускається до подання візуалізації, але після того, як контролер надав відповідь.

То де різниця між postHandle()Interceptor та doFilter()Filter?

Весняний MVC sheme Яка найкраща практика, у яких випадках використання її слід використовувати? На цьому малюнку де працюють Filters і Interceptors?

Відповіді:


87

Від HandlerIntercepter's javadoc :

HandlerInterceptorв основному схожий на сервлет Filter, але на відміну від останнього він просто дозволяє користувальницькій попередній обробці з можливістю заборонити виконання самого обробника та користувацьку післяобробку. Фільтри є більш потужними, наприклад, вони дозволяють обмінюватися запитами та об'єктами відповідей, які передаються по ланцюгу. Зауважте, що фільтр налаштовується в web.xml, a HandlerInterceptorв контексті програми.

В якості основної настанови завдання попередньої обробки, пов'язані з дрібнозернистими обробниками, є кандидатами на HandlerInterceptorреалізацію, особливо розроблений загальний код обробника та перевірки авторизації. З іншого боку, A Filterдобре підходить для запиту контенту та перегляду вмісту, як багаточастинні форми та стиснення GZIP. Зазвичай це показує, коли потрібно зіставити фільтр на певні типи вмісту (наприклад, зображення) або на всі запити.

З цим сказано:

То де різниця між Interceptor#postHandle()і Filter#doFilter()?

postHandleбуде викликано після виклику методу обробника, але до того, як буде показано представлення. Отже, ви можете додати до перегляду більше об'єктів моделі, але ви не можете змінити, HttpServletResponseоскільки це вже зроблено.

doFilterнабагато більш універсальний, ніж postHandle. Ви можете змінити запит або відповідь і передати його в ланцюг або навіть заблокувати обробку запиту.

Крім того, в preHandleі postHandleметодах ви маєте доступ до того, HandlerMethodщо обробляв запит. Отже, ви можете додати логіку попередньої та після обробки на основі самого обробника. Наприклад, ви можете додати логіку до методів обробника, які мають деякі примітки.

Яка найкраща практика, у яких випадках використання її слід використовувати?

Як сказав док, завдання попередньої обробки, пов'язані з дрібнозернистими обробниками, є кандидатами на HandlerInterceptorреалізацію, особливо розроблений загальний код обробника та перевірки авторизації. З іншого боку, A Filterдобре підходить для запиту контенту та перегляду вмісту, як багаточастинні форми та стиснення GZIP. Зазвичай це показує, коли потрібно зіставити фільтр на певні типи вмісту (наприклад, зображення) або на всі запити.


Зверніть увагу, що фільтр налаштовується в web.xml, HandlerInterceptor в контексті програми ??? Ви можете пояснити ПЛЗ?

4
Фільтр пов'язаний з API сервлетів і HandlerIntercepterє специфічною для весни концепцією. Для того, щоб зареєструвати фільтр сервлетів, ви можете його зареєструвати, використовуючи стару web.xml(Servlet 2.5 та старіші версії) або новий програмний підхід (Servlet 3+). Оскільки HandlerIntercepterце лише абстракція весни, вам слід зареєструватися у контексті весни
Алі Дегхані

Фільтр пов'язаний з API сервлетів, а HandlerIntercepter - концепція весни. coorect! але незалежно від того, що зареєструвати ур за допомогою web.xml є частиною, WebApplicationяка є одинарною на диспетчера, тому сервлет і фільтр обидва їли, пов'язані з контекстом, це хороша практика асоціювати перехоплювач і фільтрувати rootContextтак, якщо u hv кілька диспетчерів всі можуть поділяти одне і те ж.

9

Фільтр : - Фільтр, як випливає з назви, - це клас Java, виконаний контейнером сервлетів для кожного вхідного запиту HTTP та для кожної відповіді http. Таким чином, можна керувати вхідними запитами HTTP, перш ніж вони дістаються до ресурсу, наприклад сторінки JSP, сервлета або простої статичної сторінки; таким же чином можна керувати вихідною реакцією HTTP після виконання ресурсу.

Перехоплювач : - Spring Interceptors схожий на фільтри сервлетів, але вони діють у Spring Context, тому вони є багатьма потужними для управління HTTP-запитом та відповіддю, але вони можуть реалізувати більш складну поведінку, оскільки можуть отримати доступ до всього контексту Spring.


2
Джерело: mkjava.com/tutorial/filter-vs-interceptor мають згадати джерело
Premraj

що стосується фільтра безпеки Spring, він також дає вам і весняний контекст.
Ловін

6

HandlerInterceptor надає вам більш тонкий контроль, ніж фільтр, тому що у вас є доступ до фактичного цільового "обробника" - це означає, що будь-яка дія, яку ви виконуєте, може змінюватися залежно від того, що запит насправді робить (тоді як фільтр сервлетів застосовується загально до всіх запитів - лише можливість врахувати параметри кожного запиту). ОбробникInterceptor також пропонує 3 різні методи, щоб ви могли застосувати поведінку до виклику обробника, після того, як обробник завершився, але до перегляду візуального перегляду (де ви навіть можете взагалі обійти візуалізацію подання) або після того, як було представлено саме подання. Крім того, ви можете встановити різні перехоплювачі для різних груп обробників - перехоплювачі налаштовані на обробціКарта, і може бути кілька оброблювачівКарти.

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

Довідка: http://static.springframework.org/sp...ng-interceptor


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