2016-02-16 45 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

[Interceptor未在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,並且只有在你的攔截器可以作爲第一個或最後一個放置時纔可以使用它。如果您在中間需要它(例如在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允許不使用默認的攔截器引用,而是使用自定義設置覆蓋操作配置。但是這樣你可能會錯過驅動Struts2框架的defaultStack中的一些重要攔截器。

您已將自定義攔截器堆棧用作默認攔截器引用,該引用包含在操作的配置中,用於未覆蓋攔截器的操作。

<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配置元素中使用的順序調用。