Фильтры против перехватчиков в Struts 2 - PullRequest
22 голосов
/ 15 июля 2010

Какая разница на самом деле между фильтрами и перехватчиками? Я понимаю, что перехватчики срабатывают до и после действия, рекурсивно, и фильтры могут быть настроены на срабатывание действий и определенных шаблонов URL. Но как вы знаете, когда использовать каждый из них?

В книге, которую я читаю на Struts 2, кажется, что перехватчики выдвигаются, и я даже следовал учебному пособию, чтобы написать перехватчик аутентификации, чтобы убедиться, что пользователь вошел в систему. URL-адрес, с которым не связано действие, перехватчик не перехватывает его, а это значит, что мне придется связывать действие с каждым jsp, который я хочу защитить. Это не кажется правильным.

Я могу создать Фильтр аутентификации, который обрабатывает URL-адреса, чтобы мне не приходилось это делать, но тогда какой смысл перехватчиков?

Ответы [ 6 ]

44 голосов
/ 03 августа 2011

Наиболее существенным отличием является то, что «перехватчики» являются частью инфраструктуры Struts 2 и являются только частью обработки запросов, выполняемой инфраструктурой Struts 2. «Фильтры», с другой стороны, являются частью спецификации сервлета; другими словами, они являются частью Servlet API. Если вы используете Struts 2, вы должны использовать перехватчики, чтобы обернуть функциональность вокруг ваших действий в Struts 2. Если вы пытаетесь обернуть функциональность вокруг запросов, поступающих в ваше веб-приложение, но не обрабатываются Struts 2, тогда фильтр может быть более подходящим.

Кстати, вся Struts 2 Framework развернута внутри фильтра, настроенного в вашем веб-приложении, объявленного в дескрипторе развертывания вашего веб-приложения (web.xml), например:

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

     <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

Этот фильтр, настроенный на перехват всех шаблонов URL-адресов запросов, является точкой входа во всю инфраструктуру Struts 2.

Надеюсь, это поможет.

4 голосов
/ 30 апреля 2013

Что такое Interceptor?

В Struts 2 Framework используется концепция Interceptors для разделения решения некоторых общих задач различными действиями.

Как мы знаем, среда вызывает конкретный объект Actionна основании запроса на это.Но перед выполнением Action вызов перехватывается другим объектом для обеспечения необходимой дополнительной обработки.

Аналогично, после выполнения Action вызов может быть перехвачен снова.Этот перехватывающий объект известен как Interceptor.

Таким образом, цель использования Interceptor - предоставить больший контроль над уровнем контроллера и отделить некоторую общую логику, которая применяется к нескольким действиям.

Структура Struts 2 ужепредоставил свой собственный набор перехватчиков, которые можно использовать в приложении для обеспечения необходимой обработки до и после выполнения Класса действия.

Одним из них является «Перехватчик псевдонимов», который я собираюсь обсудить здесь.

Alias ​​Interceptor:

Alias ​​Interceptor используется в случае цепочки действий.Цепочка действий означает, что одно действие вызывает другое действие после успешного выполнения первого действия.

Этот перехватчик связывает именованный параметр с другим именем параметра.В цепочке действий, когда два разных класса действий имеют общий параметр с другим именем, этот перехватчик используется для присвоения псевдонима параметру первого класса действия, который соответствует имени параметра во втором классе действия.

Псевдоним выражения действия должен иметь вид:

             #{ 'name1' : 'alias1' , 'name2' : 'alias2' }
4 голосов
/ 15 июля 2010

стек перехватчиков срабатывает при каждом запросе.
фильтры применяются только к тем URL-адресам, для которых они определены.

редактировать - вы используете один или другой в зависимости от необходимости. Допустим, вам нужно проверить наличие cookie для каждого запроса. Пользователь перехватчик. Допустим, по некоторым запросам вам нужно вызывать внешнее приложение (управляемое URL), используйте фильтр.

Я думаю, что перехватчики - более распространенный инструмент ...

с чего бы вам URL без каких-либо действий?

3 голосов
/ 15 декабря 2013

Согласно распоряжению 2 жизненный цикл / архитектура никакие перехватчики не выполняются перед фильтром. Так что, если для вашего запроса нет сопоставления действий, то оно не выполняется во время прохождения через фильтр.

1 голос
/ 24 февраля 2016

Как правило

  • Фильтры запускаются перед каждым request. struts сам по себе является фильтром.
  • interceptors может выполняться до, после действий распорок. Они не будут выполняться, если запрос не заканчивается на .action.

Итак, некоторые примеры фильтров могут быть:

  • Если вы хотите сжать файлы js и css, вам следует использовать фильтры, а не перехватчики.
  • Если вы хотите, чтобы только определенный IP-адрес имел доступ к вашему веб-сайту, вы должны разработать его как фильтр и проверить IP-адрес запроса.
  • Если вы хотите защитить свой сайт от CSRF-атак, вы должны написать фильтр для проверки токена CSRF по запросам.
  • Если вы хотите регистрировать ответ своего сайта за время запроса, вы можете использовать фильтр для расчета времени до и после chain.doFilter(request, response)

Теоретически вы можете разработать веб-приложение для Struts, не разрабатывая собственное interceptors и используя только filters. Но вы столкнетесь с множеством проблем и используйте фильтры для котлов.

Множество функций Struts 2 построены с перехватчиками, вы можете найти их в struts-default.xml (https://struts.apache.org/docs/struts-defaultxml.html), список поможет найти, когда можно использовать перехватчики. (Например, ParametersInterceptor run перед действиями для применения к действиям вложенных значений формы)

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

Рассматривая выше, вот несколько случаев, которые могут быть разработаны перехватчиками:

  • Если вы хотите, чтобы только зарегистрированные пользователи имели доступ к определенным действиям, вы должны разработать его с перехватчиками.
  • Если вы хотите отслеживать, какие действия пользователя выполняет навигация. Вы можете использовать перехватчик для отслеживания посещенных действий.
  • Если вы хотите обрабатывать ошибки ваших действий в одной точке, вы можете использовать перехватчик, который перехватывает все invocation.invoke()

Перехватчики предоставляют шаблон фильтра и шаблон цепочки ответственности для действий Struts, в то время как фильтры предоставляют этот шаблон для всего веб-приложения.

0 голосов
/ 19 ноября 2014

Struts 2 Framework не зависит от Servlet API. Struts 2 Действия не связаны с контейнером. Чаще всего контексты сервлета представляются в виде простых карт, что позволяет тестировать действия изолированно.

Фильтр является частью Servlet API, поэтому Struts 2 Framework использует концепцию перехватчиков, чтобы разделить решение некоторых общих задач с помощью различных действий.

Также вы можете легко написать контрольные примеры для класса Interceptor и Action.

...