[英]Adding a custom interceptor for some actions
我創建了一個攔截器,我想在某些操作中將其映射到某些特定方法,並且我不想打擾現有代碼:
struts.xml
:
<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>
您似乎認為默認攔截器堆棧適用於所有操作,並且您為單個操作指定的最終攔截器會添加到默認堆棧中。 他們不是。
默認堆棧是用於所有未指定任何堆棧(或單個攔截器,如您的情況)的操作的堆棧。
如果你想添加一個攔截器,那么還要指定它應該添加到的堆棧,
<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復制它。
如果您將自定義攔截器添加到操作配置中,例如
<action name="addUpdateClaimHeadMetronic" class="main.java.com.commdel.francis.struts2.actions.ClaimHeadAction" method="addUpdateClaimHead">
<interceptor-ref name="csrf"/>
</action>
那么只有csrf
攔截器會被配置到這個動作映射。 即使您使用, commonStack
包含的其他攔截器也將被省略
<default-interceptor-ref name="commonStack"/>
Struts 允許覆蓋不會使用default-interceptor-ref
的動作配置,如果您將自定義攔截器添加到動作映射。 通過覆蓋操作配置,您可以使用一組自定義的攔截器。
如果您忘記在自定義操作映射中包含攔截器的所有引用,那么您可能會錯過驅動 Struts2 框架的defaultStack
中的一些重要攔截器。
注意: 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 配置中使用的順序調用的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.