2016-02-16 7 views
0

Я создал перехватчик, который я хочу отобразить на некоторые конкретные методы в каком-то действии, и я не хочу нарушать существующий код:писать пользовательский перехватчик для некоторых действий, не работает

<package name="francis" namespace="/francis" extends="struts-default,json-default"> 
    <interceptors>    
     <interceptor name="authentication" class="main.java.com.commdel.commons.struts2.interceptors.AuthenticationInterceptor"/>    
     <interceptor name="authorization" class="main.java.com.commdel.commons.struts2.interceptors.SecurityInterceptor"/> 

обычай перехватчик csrf:

 <interceptor name="csrf" class="main.java.com.commdel.commons.struts2.interceptors.CsrfTokenInterceptor"/>   

     <interceptor-stack name="commonStack"> 
      <interceptor-ref name="authentication"/> 
      <interceptor-ref name="authorization"/> 
      <interceptor-ref name="defaultStack"/> 
     </interceptor-stack> 
    </interceptors> 
    <default-interceptor-ref name="commonStack"/> 
    <global-results> 
      <result name="error" type="velocity">/results/velocity/common/globalerror.vm</result> 
      <result name="AUTHORIZATIONERROR" type="velocity">/results/velocity/common/sessionError.vm</result>       
     </global-results> 

отображение csrf к некоторому действию:

<action name="addUpdateClaimHeadMetronic" class="main.java.com.commdel.francis.struts2.actions.ClaimHeadAction" method="addUpdateClaimHead"> 
     <interceptor-ref name="csrf"/> 
    </action> 
</package> 
+0

Используйте стопку перехватчиков в конфигурации действий. –

+0

Если вы явно применяете какой-либо перехватчик к действию, то другие подобные по умолчанию не применяются.вы должны применять весь перехватчик самостоятельно для каждого действия для тех, кого вы использовали перехватчик csrf. – Mandy

+0

Возможный дубликат [Перехватчик не получает вызов в Struts] (http://stackoverflow.com/questions/30043007/interceptor-not-getting-called-in-struts) –

ответ

0

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

Стек по умолчанию - это стек, используемый для всех действий, которые не указывают ни одного стека (или одного перехватчика, как в вашем случае).

Если вы хотите добавить перехватчик, а затем указать также стек он должен добавить к,

<action name="addUpdateClaimHeadMetronic" 
     class="main.java.com.commdel.francis.struts2.actions.ClaimHeadAction" 
     method="addUpdateClaimHead"> 

    <interceptor-ref name="commonStack"/> 
    <interceptor-ref name="csrf"/> 
</action> 

или определить новый стек и использовать его:

<interceptor-stack name="commonStack"> 
    <interceptor-ref name="authentication"/> 
    <interceptor-ref name="authorization"/> 
    <interceptor-ref name="defaultStack"/> 
</interceptor-stack> 

<interceptor-stack name="csrfStack"> 
    <interceptor-ref name="authentication"/> 
    <interceptor-ref name="authorization"/> 
    <interceptor-ref name="defaultStack"/> 
    <interceptor-ref name="csrf"/> 
</interceptor-stack> 

.... 

<default-interceptor-ref name="commonStack"/> 

.... 

<action name="addUpdateClaimHeadMetronic" 
     class="main.java.com.commdel.francis.struts2.actions.ClaimHeadAction" 
     method="addUpdateClaimHead"> 

    <interceptor-ref name="csrfStack"/> 
</action> 

Обратите внимание, что первый подход нарушает DRY, если у вас есть много действий, разделяющих конфигурацию стека вторичного перехватчика, и его можно использовать, только если ваш Interceptor хорош для размещения как первого, так и последнего. Если вам это нужно посередине (например, после param, но до workflow), вы должны определить стек, взломав defaultStack, скопировав его с struts-default.xml.

0

Если добавить пользовательский перехватчик конфигурации действий как

<action name="addUpdateClaimHeadMetronic" class="main.java.com.commdel.francis.struts2.actions.ClaimHeadAction" method="addUpdateClaimHead"> 
    <interceptor-ref name="csrf"/> 
</action> 

только тогда csrf перехватчик будет настроен для этого действия конфигурации. Таким образом Struts позволяет не использовать ссылку перехватчика по умолчанию, но переопределить конфигурацию действий с помощью настраиваемого набора. Но таким образом вам могут не хватать некоторых важных перехватчиков из defaultStack, которые управляют инфраструктурой Struts2.

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

<default-interceptor-ref name="commonStack"/> 

Обратите внимание, что перехватчики в Struts2 добавляют дополнительную функциональность к действию до или после того, как действие выполнено. Но отсутствие некоторых важных перехватчиков может сломать всю работу. Если вы хотите, чтобы новое действие выполнялось как перехватчики в конфигурации по умолчанию плюс ваш перехватчик, вы должны включить ссылку на стек по умолчанию в вашем конфигурационном файле до или после вашего кода.

<action name="addUpdateClaimHeadMetronic" class="main.java.com.commdel.francis.struts2.actions.ClaimHeadAction" method="addUpdateClaimHead"> 
    <interceptor-ref name="csrf"/> 
    <interceptor-ref name="commonStack"/> 
</action> 

Перехватчики вызываются по порядку, в котором они используются в элементе конфигурации xml.