Отключить выполнение перехватчика

Я работаю над Struts 2. Во время внедрения Interceptor я столкнулся с вопросом:

Можно ли остановить выполнение Interceptor все вместе через конфигурацию или любым другим способом?

1 ответ

Есть много способов решить, когда действие Struts2 должно проходить через перехватчик или нет... самые простые из них:

  1. Программно - Конфигурация перехватчика

    Определите одно и то же действие несколько раз, каждое из которых выполняется с различными стеками перехватчиков (оба определены глобально на уровне пакета или, как в следующем примере, в самой конфигурации действия), одно из которых содержит ваш перехватчик, а другое - без него:

    <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>
    
  2. Программно - метод фильтрации

    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>
    
  3. Динамически - изнутри перехватчика

    Делайте это в логике перехватчика, основываясь на

    • параметр запроса:

      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...

Другие вопросы по тегам