Отключить выполнение перехватчика
Я работаю над Struts 2. Во время внедрения Interceptor я столкнулся с вопросом:
Можно ли остановить выполнение Interceptor все вместе через конфигурацию или любым другим способом?
1 ответ
Есть много способов решить, когда действие Struts2 должно проходить через перехватчик или нет... самые простые из них:
Программно - Конфигурация перехватчика
Определите одно и то же действие несколько раз, каждое из которых выполняется с различными стеками перехватчиков (оба определены глобально на уровне пакета или, как в следующем примере, в самой конфигурации действия), одно из которых содержит ваш перехватчик, а другое - без него:
<action name="actionWithInterceptor" class="foo.bar.actions.MyAction"> <interceptor-ref name="myCustomInterceptor" /> <interceptor-ref name="defaultStack" /> <result>/view.jsp</result> </action> <action name="actionWithoutInterceptor" class="foo.bar.actions.MyAction"> <!-- <interceptor-ref name="myCustomInterceptor" /> --> <interceptor-ref name="defaultStack" /> <result>/view.jsp</result> </action>
Программно - метод фильтрации
MethodFilterInterceptor - это абстрактный Interceptor, используемый в качестве базового класса для перехватчиков, которые будут фильтровать выполнение на основе имен методов в соответствии с указанными включенными / исключенными списками методов.
Устанавливаемые параметры следующие:
- excludeMethods - имена методов, которые будут исключены из обработки перехватчика
- includeMethods - имена методов, которые будут включены в обработку перехватчика
Расширьте этот абстрактный перехватчик в своем пользовательском перехватчике и определите методы, которые будут фильтровать выполнение перехватчика в конфигурации. В этом примере каждый метод действия с именем
foo()
, или жеbar()
или начиная сwithoutCustom
лайкwithoutCustomMethod()
будет избегать запуска перехватчика, все остальные методы вместо этого будут запускать его:<interceptor-stack name="myCustomStack"> <interceptor-ref name="myCustomInterceptor"> <param name="excludeMethods">foo,bar,withoutCustom*</param> </interceptor-ref> <interceptor-ref name="exception"/> <interceptor-ref name="alias"/> <interceptor-ref name="params"/> <interceptor-ref name="servletConfig"/> <interceptor-ref name="prepare"/> <interceptor-ref name="i18n"/> <interceptor-ref name="chain"/> <interceptor-ref name="modelDriven"/> <interceptor-ref name="fileUpload"/> <interceptor-ref name="staticParams"/> <interceptor-ref name="params"/> <interceptor-ref name="conversionError"/> <interceptor-ref name="validation"> <param name="excludeMethods">myValidationExcudeMethod</param> </interceptor-ref> <interceptor-ref name="workflow"> <param name="excludeMethods">myWorkflowExcludeMethod</param> </interceptor-ref> </interceptor-stack>
Динамически - изнутри перехватчика
Делайте это в логике перехватчика, основываясь на
параметр запроса:
if (request.get(MY_REQUEST_PARAM)!=null && ((String) request.get(MY_REQUEST_PARAM)[0]).equals("myVal")) { ...
параметр сеанса:
if (session.get(MY_SESSION_PARAM)!=null && session.get(MY_SESSION_PARAM).equals("myVal")) { ...
Интерфейс, расширенный вашим действием:
if(action instanceof MyStuffAware) { ...
Etcetera...